Linux操做系統load average太高,kworker佔用較多cpuhtml
今天巡檢發現,mc1的K8S服務器集羣有些異常,負載不太均衡。其中10.2.75.32-34,49的load average值都在40以上,雖然機器的cpu核數都是40或48核不算嚴重,但也值得重視。linux
登錄機器查看,執行top發現,cpu的使用率接近40%,sys有20-30,user有10-20。也發現有大量的內核線程[kworker]佔用比較多的使用率。以下是在下午7點多的截圖,若是是高峯期9點,kworker的數字多數是在20-30之間,說明佔用了比較多的cpu資源。git
順着這個方向排查。[kworker]這種內核線程使用的是內核工做隊列模式,1個cpu就產生對應的1個內核線程。參考了這個文章:https://yq.aliyun.com/articles/504369github
裏面有說到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_workspa
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資源消耗的狀況。