键盘输入延迟 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 数量,可能一秒见效!

相关推荐
94621931zyn61 分钟前
外观设置 - Cordova 与 OpenHarmony 混合开发实战
笔记·python
week_泽9 分钟前
2、OpenCV Harris角点检测笔记
人工智能·笔记·opencv
Maguyusi11 分钟前
pve lxc 虚拟机 raw 格式 磁盘 扩容
linux·运维·windows
AI视觉网奇16 分钟前
ue python脚本 获取资产
笔记·ue5
是垚不是土18 分钟前
基于DDNS-Go动态域名解析配置:实现多网络线路冗余切换方案
运维·开发语言·网络·阿里云·golang·运维开发
fpcc23 分钟前
跟我学C++中级篇—Linux内核中链表分析
linux·c++·链表
小韩博24 分钟前
小迪笔记45课之-PHP应用&SQL二次注入&堆叠执行&DNS带外&功能点&黑白盒条件
笔记·sql·网络安全·php
智嵌电子25 分钟前
【笔记篇】【硬件基础篇】模拟电子技术基础 (童诗白) 第6章 信号的运算和处理
笔记
抓饼先生31 分钟前
Linux上查看systemd journald日志
linux·运维·systemd·journald
virtual_k1smet39 分钟前
梧桐·鸿鹄-中移链assistant-level
笔记·区块链