降低linux實時任務抖動 延遲

2021-09-10 08:35:52 字數 2249 閱讀 5229

核心配置建議:

核心有以下幾種hz配置供選擇:

config_hz_periodic  ##週期性tick

config_no_hz_idle  ##在系統idle狀態下,禁止tick

config_no_hz_full  ##在系統idle或只有乙個任務在執行的狀態下,禁止tick

預設狀態下,核心的時鐘tick配置為config_no_hz_idle,也就是在idle的情況下關掉時鐘中斷。

開啟config_no_hz_full以支援全動態時鐘系統,可以讓單個實時任務效能更高,干擾越小。

另外no_hz_full需要和命令列引數配合使用,需要在kernel cmdline中指定要啟動的cpu。

如,在乙個16核cpu的系統上,通過cmdline指定nohz_full=1-15,表示所有核(除0核)使能全動態時鐘tick。

當系統啟動後,手動遷移一些對延遲不銘感的rcu後台執行緒:

# for i in `pgrep rcu[^c]` ; do taskset -pc 0 $i ; done
驗證系統已經使能了no_hz_full系統:(也可以使用乙個死迴圈指令碼:while :; do d=1; )

perf stat -c 1 -e irq_vectors:local_timer_entry taskset -c 1 stress -t 1 -c 1
在預設的核心配置下,應該有1秒鐘1000次的時鐘中斷:

# perf stat -c 1 -e irq_vectors:local_timer_entry taskset -c 1 stress -t 1 -c 1

1000 irq_vectors:local_timer_entry

當開啟動態tick後,應該只能看到一秒鐘只有一次時鐘中斷:

# perf stat -c 1 -e irq_vectors:local_timer_entry taskset -c 1 stress -t 1 -c 1

1 irq_vectors:local_timer_entry

同樣在支援cpuset的情況下,可以將系統中某些cpu孤立出來,用於單獨繫結rt任務執行,這些孤立出來的cpu叫做isolated cpus,這些cpu是排程器是不可見的。

如下cmdline引數,將cpu2,5,6,7設定為隔離cpu。

isolcpus=2,5-7
預設情況下,乙個rt死迴圈任務不會完全佔滿單核cpu,因為核心實現了乙個頻寬限制功能,核心不想讓乙個任務完全霸佔cpu,由於rt任務的排程演算法是基於優先順序的,若存在乙個高優先順序的死迴圈任務,會導致其他的cfs任務永遠無法執行。所以系統預設開啟了頻寬限制,作用為:在乙個單位週期內,rt任務最多只能占用95%的cpu比例,剩餘5%會留給其他的普通任務。

所以,若要想rt任務完全佔滿cpu,則需要調整proc介面,讓rt任務可以佔滿整個cpu。

/proc/sys/kernel/sched_rt_period_us

/proc/sys/kernel/sched_rt_runtime_us

另外要說的是,在smp多核系統裡,預設引數下,其實rt任務仍然能占用到100%,這是因為在多核下,乙個rt任務用完95%的cpu後,可以向其他空閒的cpu借時間。

多核系統下,有中斷親和性的概念,乙個外設中斷觸發後,由中斷控制器去通知cpu,用於負載均衡。預設情況下,硬體中斷的親和性是所有cpu核。也就是可能在所有cpu上產生中斷。

為了避免rt任務抖動,可以將所有的spi中斷遷移到housekeeping核心上(shared peripheral interrupt),可以通過proc介面修改,如:將6號中斷只親和到cpu1和cpu2上。

echo 6 > /proc/irq/3/smp_affinity
系統中有一些工作佇列,可能引發在rt任務cpu上喚醒kwokrer後台執行緒,導致hang_task產生,或者干擾rt任務執行。

若乙個工作佇列帶wq_sysfs屬性,我們可以通過修改cpu親和性來避免特定cpu上kworker任務喚醒。

注意:核心中存在一些內建的工作佇列,如system_wq,system_hi_wq等,這些預置wq都不帶wq_sysfs屬性,若要避免這些wq上的work在rt-cpu上執行,需要額外處理,核心沒有提供sysfs介面。

echo 1 > /sys/bus/workqueue/devices/writeback/cpumask

定時任務和延遲任務

crontab u 使用者 e 這個命令編輯的檔案是 var spool cron 使用者 每分鐘 分鐘 小時 天 月 周 2 每兩分鐘 08 17 每天早上8點 下午5點每分鐘 08 17 1,15 每月1號和15,早上8 下午5 每分鐘 08 17 1,15 3 三月的1號和三月的15,早上8 ...

十六 linux系統定時任務和延遲任務

一 系統延時任務 1 系統任務定時 root localhost at 23 37 設定任務執行時間 at rm fr mnt 任務動作 at ctrl d 用ctrl d發起任務 2 系統任務延遲 root localhost at now 1min 延時任務1分鐘 at rm fr mnt at...

linux實時任務排程演算法分析

鑑於最近有關cpu占有率的一些問題涉及到linux核心的排程演算法,有必要進行了解。因此,寫了這篇文章。linux常見的任務有兩種,實時任務與非實時任務。實時任務的排程演算法是大家都非常熟悉的優先順序搶占或優先順序搶占加時間片兩種,其主要思想是效率優先。非實時任務的排程演算法是cfs 完全公平演算法...