目录
- **一. 什么是 Split Lock?**
-
- ** 1. 原子操作:像“不可打断的快递签收”**
- ** 2. Split Lock(拆分锁):违规的“拆包行为”**
- ** 3. 为什么会导致系统夯死?**
- **4. 触发原因**
- **二. 日志分析**
-
- ** 当服务器真正触发 Split Lock Detection 时的表现**
-
- **1. 内核态(Kernel-Space)触发拆分锁**
-
- **2. 用户态(User-Space)触发拆分锁**
- 三. **解决方法**
-
-
- **确认当前检测模式**
- **临时调整检测级别(无需重启)**
- **永久禁用(需重启)**
- **定位问题代码**
-
- **(1) 内核态 Split Lock**
- **(2) 用户态 Split Lock**
- **更新硬件支持**
- 四. **常见问题**
-
-
- **Q1: 能否完全禁用 Split Lock 检测?**
- **Q2: 为什么用户态 Split Lock 不触发崩溃?**
- **Q3: 如何验证修复是否生效?**
- **Q4: 哪些场景容易触发?**
一. 什么是 Split Lock?
- 定义:
Split Lock 是指 跨缓存行(Cache Line)的原子操作(如 LOCK
前缀指令)。x86 缓存行通常为 64 字节,若原子操作横跨两个缓存行,会导致硬件锁住整个内存总线,引发性能骤降甚至系统冻结。
- 危害:
- 内核态:可能导致死锁或内核崩溃(Panic)。
- 用户态:拖慢其他 CPU 核心的运行速度。
模式 |
内核态 Split Lock |
用户态 Split Lock |
日志表现 |
warn (默认) |
警告(WARNING ) |
警告(WARNING ) |
kernel: x86/split_lock: WARNING: ... |
fatal (严格模式) |
内核崩溃(PANIC ) |
警告(WARNING ) |
kernel: x86/split_lock: #AC: ... |
1. 原子操作:像“不可打断的快递签收”
想象你要签收一个贵重快递:
- 正常情况:快递员递给你包裹,你检查后签字,流程完整。
- 非原子操作:快递员把包裹拆成两半,先给你一半(签字),再给另一半(再签字)。如果中途有人抢走一半,包裹就不完整了。
在计算机中:
- 原子操作 = CPU 保证某个操作(如修改数据)一次性完成,不会被其他线程打断。
- 非原子操作 = 操作可能被拆分成多步,其他线程可能读到中间状态,导致数据错误。
2. Split Lock(拆分锁):违规的“拆包行为”
某些程序为了性能,会偷偷把本应“原子”的操作拆成多步(跨多个内存地址)。
这就像:
- 违规操作:快递员把包裹拆开分两次送(但系统要求必须一次送完)。
- CPU 的惩罚:现代 Intel/AMD CPU 检测到这种违规时,会触发 #AC(Alignment Check)异常。
3. 为什么会导致系统夯死?
- 内核态触发:如果内核自身或驱动代码用了拆分锁,CPU 强制崩溃(保护系统稳定性)。
- 硬件特性:部分 Intel CPU(尤其是 Skylake 后)默认开启此检测。
4. 触发原因