閒談線上倆k8s環境同等limits下pod啟動時間不一樣解決過程
線上用的k8s版本是1.6.7非常老,而且HA有問題,上個月研發想把裡面的一些服務遷出來到一個新叢集裡,新叢集的搭建是我負責的。上週開始陸陸續續的遷移過來了,但是同等limit下部分pod在測試環境上(測試環境和老環境部署是一樣的,下文的老環境和測試環境可以理解為一樣)啟動非常快,在我搭建的新k8s環境上啟動非常慢,研發他們應用都是java+springboot,這裡不談jvm無法識別cgroup,已經加選項識別到了還有那個隨機熵的選項肯定也是加了的。
因為之前一次有個使用者反映他們本地虛機啟動springboot應用20s,我們雲上啟動就三分鐘,後面漠然大佬教我加java的啟動引數輸出log,幫我遠端debug找到原因是zk客戶端會解析hosts,加條localhost的hosts就解決了。在得知他們用的也是springboot後一開始就懷疑是他們程式碼問題(畢竟java),建議他們去開debug自己看log。
四五天之前研發那邊和我對接k8s的同事詳細的探討了啟動不一致的問題,我詢問了哪個pod可以隨意啟停,然後在新環境上把該pod的command改成sh和tty:true
,去掉就緒和生存探針手動進去啟動程序,啟動的時候加了java的執行引數列印一系列的更詳細的log,把log發給qingmu.io大佬,大佬看了說了句你這cpu限制得太厲害了吧。我才發現新環境上pod的cpu限制得比老環境還小,然後改成老環境一樣就非常快了。
然後今天研發同事又說啟動慢,限制一樣的還是啟動慢,這裡放下他說的原話:相同資源下,A環境服務比測試環境啟動慢上一倍-3倍,當cpu3核時,啟動時間差距就沒那麼大了
,這個話和qingmu.io大佬之前看到日誌說cpu限制得太厲害了是提示了我找到原因的關鍵。
然後同事截圖了下pod的limit,我看到cpu是1,這不剛好3倍嗎,畢竟k8s的容器cpu限制是基於時間佔比的,尋思著cpu是不是不一樣,叫同事把他們那邊測試環境的lscpu輸出截圖
$ lscpu Architecture:x86_64 CPU op-mode(s):32-bit, 64-bit Byte Order:Little Endian CPU(s):24 On-line CPU(s) list:0-23 Thread(s) per core:1 Core(s) per socket:1 Socket(s):24 NUMA node(s):1 Vendor ID:GenuineIntel CPU family:15 Model:6 Model name:Intel(R) Xeon(R) Gold 5118 CPU @ 2.30GHz Stepping:3 CPU MHz:2700.017 BogoMIPS:4589.20 Hypervisor vendor:KVM Virtualization type:full L1d cache:32K L1i cache:32K L2 cache:4096K L3 cache:16384K NUMA node0 CPU(s):0-23 Flags:fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm constant_tsc nopl xtopology eagerfpu pni cx16 x2apic hypervisor lahf_lm
下面這個是新環境的lscpu輸出
Architecture:x86_64 CPU op-mode(s):32-bit, 64-bit Byte Order:Little Endian CPU(s):56 On-line CPU(s) list:0-55 Thread(s) per core:2 Core(s) per socket:14 Socket(s):2 NUMA node(s):2 Vendor ID:GenuineIntel CPU family:6 Model:85 Model name:Intel(R) Xeon(R) Gold 6132 CPU @ 2.60GHz Stepping:4 CPU MHz:999.914 CPU max MHz:3700.0000 CPU min MHz:1000.0000 BogoMIPS:5200.00 Virtualization:VT-x L1d cache:32K L1i cache:32K L2 cache:1024K L3 cache:19712K NUMA node0 CPU(s):0-13,28-41 NUMA node1 CPU(s):14-27,42-55
這一對比就發現了問題所在,新環境的cpu頻率平均穩定在999.914,也就是CPU MHz
,測試環境是虛機,雖說它沒max和min Mhz(應該是虛擬化相關的設定導致沒有的)但是它的平均頻率也約等於新環境平均頻率的三倍,尋思著應該是cpu的省電模式之類的,一對比發現每個核心頻率都很低
$grep -i mhz /proc/cpuinfo cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 1000.073 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 1000.073 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 1000.073 cpu MHz: 1000.073 cpu MHz: 1000.073 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 1000.073 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 999.914 cpu MHz: 1000.231 cpu MHz: 1298.889 cpu MHz: 1001.025 cpu MHz: 1000.073 cpu MHz: 1000.390 cpu MHz: 1000.390 cpu MHz: 1000.231 cpu MHz: 1000.073 cpu MHz: 1000.708 cpu MHz: 1001.025 cpu MHz: 1000.231 cpu MHz: 999.914 cpu MHz: 1000.231 cpu MHz: 1000.073 cpu MHz: 1000.073 cpu MHz: 1382.519 cpu MHz: 1327.929 cpu MHz: 999.914 cpu MHz: 1157.653 cpu MHz: 1121.313 cpu MHz: 1000.073 cpu MHz: 1193.518 cpu MHz: 1000.073 cpu MHz: 1000.231 cpu MHz: 1000.390 cpu MHz: 1000.390 cpu MHz: 1000.073
然後查找了下設定cpu什麼最小頻率的命令給找到了下面資訊.
在Linux中,核心的開發者定義了一套框架模型來完成CPU頻率動態調整這一目的,它就是CPU Freq系統。儘管在各個Linux發行版中,前端軟體稍有差異,但其最終都會通過Linux核心的CPU Freq系統來實現CPU頻率動態調整的功能。這些軟體都會提供如下CPU模式(governor引數)
使用下列命令檢視cpu的模式(governor引數)
$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor powersave powersave ....
-
ondemand:系統預設的超頻模式,按需調節,核心提供的功能,不是很強大,但有效實現了動態頻率調節,平時以低速方式執行,當系統負載提高時候自動提高頻率。以這種模式執行不會因為降頻造成效能降低,同時也能節約電能和降低溫度。一般官方核心預設的方式都是ondemand。
-
interactive:互動模式,直接上最高頻率,然後看CPU負荷慢慢降低,比較耗電。Interactive 是以 CPU 排程數量而調整頻率,從而實現省電。InteractiveX 是以 CPU 負載來調整 CPU 頻率,不會過度把頻率調低。所以比 Interactive 反應好些,但是省電的效果一般。
-
conservative:保守模式,類似於ondemand,但調整相對較緩,想省電就用他吧。Google官方核心,kang核心預設模式。
-
smartass:聰明模式,是I和C模式的升級,該模式在比interactive 模式不差的響應的前提下會做到了更加省電。
-
performance:效能模式!只有最高頻率,從來不考慮消耗的電量,效能沒得說,但是耗電量。
-
powersave 省電模式,通常以最低頻率執行。
-
userspace:使用者自定義模式,系統將變頻策略的決策權交給了使用者態應用程式,並提供了相應的介面供使用者態應用程式調節CPU 執行頻率使用。也就是長期以來都在用的那個模式。可以通過手動編輯配置檔案進行配置
-
Hotplug:類似於ondemand, 但是cpu會在關屏下嘗試關掉一個cpu,並且帶有deep sleep,比較省電。
而新環境的cpu就是省電模式執行的,cpu頻率極低,新環境不能重啟,可能bios裡有設定cpu工作模式選項,所以只能找線上修改的方法。查找了下設定模式的命令,最終找到了個靠譜的
$ cpupower -c all frequency-set -g performance Setting cpu: 0 Setting cpu: 1 Setting cpu: 2 ... Setting cpu: 55 $ /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor performance performance performance ...
模式已經改變了,檢視下工核心的作頻率
grep -i mhz /proc/cpuinfo cpu MHz: 1870.495 cpu MHz: 3127.331 cpu MHz: 2348.156 cpu MHz: 2160.900 cpu MHz: 1918.896 cpu MHz: 1756.237 cpu MHz: 2635.388 cpu MHz: 2115.673 cpu MHz: 1989.196 cpu MHz: 1708.312 cpu MHz: 2226.916 cpu MHz: 2683.471 cpu MHz: 1654.199 cpu MHz: 2696.643 cpu MHz: 2258.020 cpu MHz: 1957.299 cpu MHz: 2357.360 cpu MHz: 3345.214 cpu MHz: 3096.704 cpu MHz: 1361.413 cpu MHz: 2991.650 cpu MHz: 2209.777 cpu MHz: 2505.102 cpu MHz: 2493.359 cpu MHz: 1823.999 cpu MHz: 2132.812 cpu MHz: 2622.058 cpu MHz: 2049.340 cpu MHz: 2217.871 cpu MHz: 3294.592 cpu MHz: 2478.442 cpu MHz: 3284.436 cpu MHz: 3279.199 cpu MHz: 2265.002 cpu MHz: 2650.622 cpu MHz: 2250.720 cpu MHz: 1804.797 cpu MHz: 1626.269 cpu MHz: 2827.404 cpu MHz: 1602.783 cpu MHz: 3270.312 cpu MHz: 3283.166 cpu MHz: 1676.257 cpu MHz: 3270.312 cpu MHz: 3331.726 cpu MHz: 2591.748 cpu MHz: 3323.950 cpu MHz: 3312.683 cpu MHz: 2978.002 cpu MHz: 3251.269 cpu MHz: 2968.005 cpu MHz: 2234.216 cpu MHz: 1717.199 cpu MHz: 1733.227 cpu MHz: 2282.458 cpu MHz: 1455.358