zhangguanzhang's Blog

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

字数统计: 2k阅读时长: 8 min
2019/04/28 Share

        线上用的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输出截图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ 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输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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的省电模式之类的,一对比发现每个核心频率都很低

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
$  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参数)

1
2
3
4
$ 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工作模式选项,所以只能找在线修改的方法。查找了下设置模式的命令,最终找到了个靠谱的

1
2
3
4
5
6
7
8
9
10
11
$ cpupower -c all frequency-set -g performance
Setting cpu: 0
Setting cpu: 1
Setting cpu: 2
...
Setting cpu: 55
$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
performance
performance
performance
...

模式已经改变了,查看下工核心的作频率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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

叫同事再次尝试,完美解决!
参考:
http://www.ncic.ac.cn/~hzg/discuz/forum.php?mod=viewthread&tid=14&page=1
http://blog.chinaunix.net/uid-20620288-id-5751294.html
https://www.cnblogs.com/276815076/p/5434295.html

CATALOG