You need to enable JavaScript to run this app.
文档中心
云服务器

云服务器

复制全文
下载 pdf
实例负载高问题
Linux/Windows系统因代码频繁触发split lock,导致计算性能下降解决方案
复制全文
下载 pdf
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的代码。了解更多。​
操作步骤​
Linux系统​
  1. 登录目标实例,操作详情可参考登录Linux实例。​
  1. 使用perf工具抓取触发进程与代码段。关于perf工具更多信息,请参见其官网文档。​
注意​
暂仅支持通用型g3al和g4al规格,且需为4.15及以上内核版本。​
  1. 执行perf命令,抓取split lock事件,以抓取30s为例。​
  • ​
    perf record -e ls_locks.bus_lock -a sleep 30​
    ​
说明​
您可以将上述命令中的最后一个参数调整为实际待抓取时间,例如:将30改为20。​
  1. 执行如下命令,生成报告,若目标事件进程的耗时占比不符合您的业务期望,请在您的代码层面进行系统性修复。​
  • ​
    perf report -i perf.data​
    ​
  • ​​​
  • 关键字段说明:​
  • ​
    字段​
    说明​
    Overhead​
    事件百分比(耗时占比)。​
    Command​
    触发事件的进程名。​
    Symbol​
    触发事件的函数或内核符号。​
    • [.] :用户级别。​
    • [k]:内核级别。​
    ​
  1. 请在您的代码层面定位到产生split lock的进程和代码段后,进行系统性修复(消除split lock的产生)。​
  • 业务代码​
  • 推荐将结构体按照不跨cache line访存的方式对齐,可以使用“编译器的内存对齐”、“__cacheline_aligned”等进行相关操作。​
建议使用编译器的默认内存对齐工具操作。​
  • 将结构体按照成员的大小与声明先后顺序对齐。​
说明​
尽量不要使用原子指令来进行访问,可能会产生不对齐的内存访问。​
  • 开源代码:向开源社区提issue,推动社区解决。​
  • 闭源软件:寻找问题反馈渠道,推动该软件提供方解决。​
Windows系统​
建议根据业务形态,推动对应软件开发商解决。​
最近更新时间:2025.06.05 12:27:05
这个页面对您有帮助吗?
有用
有用
无用
无用