键盘输入延迟 800 ms?!——一次终端“假死”排查笔记

本文为 CSDN 原创公开首发,参与话题「IT疑难杂症诊疗室」

如需转载,请在文首注明出处与作者@yu779

记录一次"键盘输入延迟 800 ms"的离谱故障,完整可复现,无外链。


键盘输入延迟 800 ms?!------一次终端"假死"排查笔记

要素 数值
阅读时长 10 min
涉及组件 Linux + systemd + auditd + iptables + KVM 控制台
根因 auditd 日志阻塞 + 控制台输入同步阻塞
解决耗时 线下 4 h → 线上 2 min
关键词 输入延迟、auditd、TTY、systemd、iptables

目录

  1. 现象:终端输入"卡 800 ms"才能回显
  2. 缩小范围:只有 SSH 卡?本地也卡!
  3. 初步排查:CPU、内存、负载、网络 全部正常
  4. 深入:用 ttyrec 量化延迟 → 精确到 830 ms
  5. 关键线索:dmesg 出现 audit: backlog limit exceeded
  6. 根因:auditd 阻塞 TTY 写事件
  7. 复现:最小化 1 台 VM 即可 100 % 复现
  8. 解决:三行命令立即恢复
  9. 预防:auditd 规则 + 速率限制 + 监控
  10. 结论与思考

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 ms
  • systemctl --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 数量,可能一秒见效!

相关推荐
tianyuanwo1 小时前
从PAM到零信任:Linux密码认证体系的深度解析与演进
linux·运维·服务器·pam·密码认证
シ風箏1 小时前
Shell【脚本 06】监测文件数据量并压缩及查看远程服务器状态并删除文件脚本分享
linux·运维·服务器·github·shell
ujainu1 小时前
Flutter性能优化实战:从卡顿到丝滑的全方案
flutter·性能优化
一个平凡而乐于分享的小比特2 小时前
Linux、Debian、Yocto、Buildroot、Android系统详解
android·linux·操作系统·debian·yocto·buildroot
赖small强2 小时前
【Linux C/C++开发】深入解析 Linux C/C++ 中的 Deferred Crash (延迟崩溃)
linux·c语言·c++·asan·core dump·延迟奔溃·mprotect
jimmyleeee2 小时前
人工智能基础知识笔记二十四:构建一个可以解析PDF简历的Agent
笔记·pdf
郝学胜-神的一滴2 小时前
Linux进程创建的封装与设计模式应用:结构化分析与实践指南
linux·服务器·开发语言·c++·程序人生·设计模式
infiniteWei2 小时前
【VIM 入门到精通】快速查找与替换:定位和修改文本的利器
linux·编辑器·vim
jimmyleeee2 小时前
人工智能基础知识笔记二十五:构建一个优化PDF简历的Agent
人工智能·笔记