- 文档首页
云服务器
云服务器ECS
故障处理
实例负载高问题
Linux/Windows系统因代码频繁触发split lock,导致计算性能下降解决方案
实例负载高问题
Linux/Windows系统因代码频繁触发split lock,导致计算性能下降解决方案
Linux/Windows系统因代码频繁触发split lock,导致计算性能下降解决方案
本文主要介绍如何排查和解决因代码频繁触发split lock,导致的计算性能下降(例如CPU利用率异常升高、程序运行卡顿等)问题。
本文档可能包含第三方产品信息,该信息仅供参考。火山引擎对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。
使用AMD CPU规格机型(Genoa、turin等架构),且在高频split lock触发时,实例的计算性能会有显著下降,例如CPU利用率异常升高、程序运行卡顿等。
由于缓存一致性协议的粒度是一个cache line,当原子操作的数据跨cache line时,依赖缓存锁机制无法保证数据一致性,会退化为总线锁来保证一致性,这种情况就是split lock,split也可以理解为访存的cache被split为两个line。
而锁总线会引起严重的性能下降,访存延迟增加百倍左右,如果是内存密集型业务,性能会下降2个数量级,所以在X86处理器中,需避免写出会产生split lock的代码。了解更多。 - 使用perf工具抓取触发进程与代码段。关于perf工具更多信息,请参见其官网文档。
- 执行perf命令,抓取split lock事件,以抓取30s为例。
说明
您可以将上述命令中的最后一个参数调整为实际待抓取时间,例如:将30改为20。
- 执行如下命令,生成报告,若目标事件进程的耗时占比不符合您的业务期望,请在您的代码层面进行系统性修复。
-
- 请在您的代码层面定位到产生split lock的进程和代码段后,进行系统性修复(消除split lock的产生)。
- 推荐将结构体按照不跨cache line访存的方式对齐,可以使用“编译器的内存对齐”、“__cacheline_aligned”等进行相关操作。
说明
尽量不要使用原子指令来进行访问,可能会产生不对齐的内存访问。
- 开源代码:向开源社区提issue,推动社区解决。
- 闭源软件:寻找问题反馈渠道,推动该软件提供方解决。
建议根据业务形态,推动对应软件开发商解决。
最近更新时间:2025.06.05 12:27:05