CPU优化分析主要是两个阶段,虚拟化层和宿主机层。
前期主要怀疑是虚拟化层的影响,主要的怀疑点包括:
1.超线程的影响
关闭超线程之后单核性能有略微提升,但多核性能反而更差,排除超线程的因素
2.NUMA架构和核迁移的影响
按理说如果不按照NUMA的架构来做核绑定,由于缓存和迁移的影响,或造成较大的性能损失,通过绑定物理核测试发现并没有大的提升,排除该因素
3.CPU模式的影响,包括指令集和缓存
分析与vmware的差异,发现我们的指令集和cpu缓存与真实物理机不一致,通过cpu-passthrough和替换qemu版本将host cpu的特性透传仍然无法提升cpu性能
排除了虚拟化层的影响,后来测试发现宿主机本身才是cpu性能的关键,部署了一个redhat对比环境发现宿主机跑分和redhat未经调优过系统差距很大。分析了内核配置参数差异(sysctl)和编译参数差异,没有发现可疑的地方。决定内核行为的并且用户可以干预的只剩下启动参数了,对比发现系统关闭了intel的cstate功能。
写了一个简单的死循环测试对比两个系统的表现,发现redhat内核有负载的cpu频率可以提高到3.1GHz,而当前host机只能达到2.6GHz,即使调整了cpufreq的模式为performance也无法让cpu达到更高的主频。所以基本可以确认是这个参数导致的。打开系统中cstate功能,跑speccpu可以达到和redhat类似的性能分数。
解决措施:目前发现cstate功能和调频功能有耦合,需要使能cstate来解决cpu性能问题,去掉启动参数intel_idle.max_cstate=0 idle=poll
intel cpu调频和节能相关的几个机制简介:
cpufreq:提供频率调节功能,可以让cpu根据不同负载使用不同的频率,达到性能和功耗的动态可调整,服务器一般配置为performance,个人pc可以配置为ondemand或者powersave模式
cstate:cpu深度睡眠节能模式,根据cpu睡眠器件,定义了多种睡眠状态,提供不同程度的节能选择,睡眠模式越高,唤醒代价越大。
pstate:通过调整cpu的电压使cpu工作在不同的频率,调频的一种机制
turbo boost:睿频技术,可以使cpu工作在高于额定主频模式来提升性能。
https://haypo.github.io/intel-cpus.html
https://software.intel.com/en-us/articles/power-management-states-p-states-c-states-and-package-c-states
http://xenserver.org/partners/19-dev-help/138-xs-dev-perf-turbo.html
本文来自网易实践者社区,经作者赵建明授权发布。