49

闲谈线上俩k8s环境同等limits下pod启动时间不一样解决过程

 5 years ago
source link: https://zhangguanzhang.github.io/2019/04/28/k8s-java-start-time-not-same/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

线上用的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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK