Linux操作系統load average過高,kworker占用較多cpu


Linux操作系統load average過高,kworker占用較多cpu

今天巡檢發現,mc1的K8S服務器集群有些異常,負載不太均衡。其中10.2.75.32-34,49的load average值都在40以上,雖然機器的cpu核數都是40或48核不算嚴重,但也值得重視。

 

登陸機器查看,執行top發現,cpu的使用率接近40%,sys有20-30,user有10-20。也發現有大量的內核線程[kworker]占用比較多的使用率。如下是在下午7點多的截圖,如果是高峰期9點,kworker的數字多數是在20-30之間,說明占用了比較多的cpu資源。

順着這個方向排查。[kworker]這種內核線程使用的是內核工作隊列模式,1個cpu就產生對應的1個內核線程。參考了這個文章:https://yq.aliyun.com/articles/504369

里面有說到kworker的排查方面,即用ftrace命令,排查workqueue_queue_work中什么函數調用最多。

在機器上安裝ftrace,參考文章:https://linux.cn/article-9273-1.html

apt-get install trace-cmd

裝上后運行一段時間查看

trace-cmd record -e workqueue:workqueue_queue_work

trace-cmd report > result

把結果保存到result后,進行分析結果得出:

這個dbs_timer的function運行數量極大。關鍵字搜索一下,感覺有點是這個引起的問題,因為這個函數是跟cpu動態調整頻率有關系,而cpu調頻是用來省電用的

具體通過學習了cpufreq的知識:

https://www.ibm.com/developerworks/cn/linux/l-cn-cpufreq/index.html

http://abcdxyzk.github.io/blog/2015/08/12/kernel-cpufreq/

里面提到一點:

Cpufreq 作為一個子系統最早被加入到 Linux 內核中時只配備了 governors ,分別是performance、powersave 和 userspace,ondemand。當用戶選擇使用 performance governor 時,CPU會固定工作在其支持的最高運行頻率上;當用戶選擇使用 powersave governor 時,CPU會固定工作在其支持的最低運行頻率上。因此這兩種 governors 都屬於靜態 governor ,即在使用它們時CPU 的運行頻率不會根據系統運行時負載的變化動態作出調整。這兩種governors 對應的是兩種極端的應用場景,使用 performance governor 體現的是對系統高性能的最大追求,而使用 powersave governor 則是對系統低功耗的最大追求。

安裝下面的軟件查看配置:

apt-get install cpufrequtils

但是我們的cpu配置是這樣的:

初步懷疑:cpu的動態調頻策略,導致每隔一段時間就要執行od_dbs_timers函數(調用dbs_timers的調用者),來判斷cpu是否要進行降頻或者升頻,因為我們的進程數量特別多,所以也可能會加快這個策略的運行頻率。最后就導致kworker占用比較高的資源。

 

為了確認是否這個引起的,下午7點多的時候在3台機器上進行了驗證,把cpufreq的策略改為performance,這個策略上面說過cpu將不會進行調頻,這3台機器都是kworker還處於比較高使用率情況的

for i in $(ls /sys/devices/system/cpu/*/cpufreq/scaling_governor);do echo performance > $i;done

查看實際的模式是否修改完成

等待片刻后,load average 下降很多, kworker也從top命令的首頁中消失,cpu的sys和user使用率也降低,說明這個改動是有效的。

在類似K8S這種負載比較高,進程數量多的服務器上,應該要關閉這個調頻功能,雖然不省電,但至少可以避免在負載出現一定程度的情況下內核線程反而會加大cpu資源消耗的情況。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM