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

相关推荐
70asunflower19 分钟前
Emulation,Simulation,Virtualization,Imitation 的区别?
linux·docker
三水不滴36 分钟前
计网ping原理
经验分享·笔记·计算机网络
聆风吟º44 分钟前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
prog_61031 小时前
【笔记】思路分享:各种大模型免费当agent后台
笔记·大语言模型·agent·cursor
NPE~1 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化
神梦流1 小时前
GE 引擎的内存优化终局:静态生命周期分析指导下的内存分配与复用策略
linux·运维·服务器
凡人叶枫1 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
凯尔萨厮1 小时前
Maven(Windows下载安装)
笔记·maven
wdfk_prog1 小时前
[Linux]学习笔记系列 -- [drivers][input]serio
linux·笔记·学习
xuhe21 小时前
[全流程详细教程]Docker部署ClawBot, 使用GLM4.7, 接入TG Bot实现私人助理. 解决Docker Openclaw Permission Denied问题
linux·docker·ai·github·tldr