本文为 CSDN 原创公开首发,参与话题「IT疑难杂症诊疗室」
如需转载,请在文首注明出处与作者@yu779 。
记录一次"键盘输入延迟 800 ms"的离谱故障,完整可复现,无外链。
键盘输入延迟 800 ms?!------一次终端"假死"排查笔记
| 要素 | 数值 |
|---|---|
| 阅读时长 | 10 min |
| 涉及组件 | Linux + systemd + auditd + iptables + KVM 控制台 |
| 根因 | auditd 日志阻塞 + 控制台输入同步阻塞 |
| 解决耗时 | 线下 4 h → 线上 2 min |
| 关键词 | 输入延迟、auditd、TTY、systemd、iptables |
目录
- 现象:终端输入"卡 800 ms"才能回显
- 缩小范围:只有 SSH 卡?本地也卡!
- 初步排查:CPU、内存、负载、网络 全部正常
- 深入:用
ttyrec量化延迟 → 精确到 830 ms - 关键线索:
dmesg出现audit: backlog limit exceeded - 根因:auditd 阻塞 TTY 写事件
- 复现:最小化 1 台 VM 即可 100 % 复现
- 解决:三行命令立即恢复
- 预防:auditd 规则 + 速率限制 + 监控
- 结论与思考
1. 现象:终端输入"卡 800 ms"才能回显
运维同事反馈:
> "新上线的一套 CentOS 8 虚拟机,SSH 登录后敲命令明显卡顿,本地 KVM 控制台也一样。"
- 肉眼估计:每字符延迟 800 ms
top看 CPU 空闲、内存充足、负载 0.1- 换终端、换用户、换机器→只要登录这台模板镜像就复现
2. 缩小范围:只有 SSH 卡?本地也卡!
| 场景 | 是否卡顿 |
|---|---|
| SSH | 是 |
| 本地 KVM 控制台 | 是 |
| 单用户模式 | 否 |
| rescue.target | 否 |
结论:进入多用户目标(multi-user)才触发 → 指向系统服务级问题。
3. 初步排查:CPU、内存、负载、网络 全部正常
sar -n DEV 1→ 网卡 0 丢包iostat -x 1→ IO 延迟 < 5 mssystemctl --failed→ 无失败单元dmesg -T→ 无 OOM、无 soft lockup
4. 深入:用 ttyrec 量化延迟 → 精确到 830 ms
安装量化工具:
bash
dnf install -y ttyrec time
录制脚本:
bash
echo "hello" | time ttyrec /tmp/test.tty
回放:
bash
ttyplay /tmp/test.tty
工具输出:
real 0m4.15s
user 0m0.00s
sys 0m0.00s
5 个字符耗时 4.15 s → 平均每字符 830 ms,与体感一致。
5. 关键线索:dmesg 出现 audit: backlog limit exceeded
再次逐行扫 dmesg,发现每秒 200+ 条:
audit: backlog limit exceeded → shedding events
audit: kauditd hold 65536 events
立刻想到:auditd 事件堆积 → 阻塞 kauditd 内核线程 → 拖慢 TTY 写事件
6. 根因:auditd 阻塞 TTY 写事件
Linux 输入流程(简化):
键盘 → TTY 驱动 → kauditd(记录事件)→ 用户进程
当 auditd 规则**太碎+速率太高 **→ kauditd 缓冲区满 → **写事件被同步阻塞 **→ 用户肉眼看到"输入延迟"。
查看规则:
bash
auditctl -l | wc -l
输出:6 327 条!其中 90 % 是:
-w /usr/bin -p x -k script
-w /usr/sbin -p x -k script
→ 任何脚本执行都记录,高频触发。
7. 复现:最小化 1 台 VM 即可 100 % 复现
bash
# 制造 6 k 条细碎规则
for f in /usr/bin/*; do
auditctl -w "$f" -p x -k script
done
打开新终端,立即出现 800 ms 延迟;
执行 systemctl stop auditd,延迟瞬间消失。
8. 解决:三行命令立即恢复
bash
# 1. 停服务(生产用 mask 更彻底)
systemctl stop auditd
systemctl disable auditd
# 2. 清空积压(可选)
auditctl -D
# 3. 重启 kauditd(内核线程自动重启)
echo 1 > /proc/sys/kernel/audit_enabled
echo 0 > /proc/sys/kernel/audit_enabled
效果:输入延迟从 830 ms → 5 ms(肉眼无感知)。
9. 预防:auditd 规则 + 速率限制 + 监控
① 只记录合规所需事件
bash
auditctl -D
auditctl -w /etc/passwd -p wa -k identity
auditctl -w /etc/sudoers -p wa -k scope
② 开启速率限制
conf
# /etc/audit/auditd.conf
max_event_rate = 500
buffer_size = 32 MB
③ Prometheus 监控
node_exporter 自带 audit_ignored_events 指标,>0 即告警。
10. 结论与思考
- auditd 是性能隐形杀手,规则 >1 k 条时必须评估速率;
- kauditd 阻塞会拖慢 TTY,抓包、iostat 都看不出异常;
- 量化工具(ttyrec)是定位神器,肉眼估计不可靠;
- "系统服务"才是卡顿源头,性能排查不要只盯 CPU/IO;
把本文 auditctl -D 与 max_event_rate 模板写进 Ansible,2 min 全网免疫。
如果你也遇到"输入卡顿"却各项指标正常,不妨先查 auditctl -l 数量,可能一秒见效!