Linux 运维如何支撑业务快速扩展

14次阅读

cpu 突增却查不到热点进程,因短命进程、内核线程或容器子进程未被 top 捕获;需用 ps、pidstat、/proc/pid/stack 多维度排查。

Linux 运维如何支撑业务快速扩展

服务扩容时 CPU 突增却查不到热点进程?tophtop 不够用

说明:业务流量一涨,top 显示 CPU 使用率飙升,但排序后前几名进程加起来只占 30%,剩下 70%“黑盒”里跑着啥?常见于短生命周期进程、内核线程、或容器内未暴露的子进程。

实操建议:

  • 先跑 ps -eo pid,ppid,comm,%cpu --sort=-%cpu | head -20,看是否有大量同名短命进程(比如 curlshpython 脚本)
  • pidstat -t 1 观察线程级 CPU,确认是否是某个进程内部线程打满(如 Java 应用 GC 线程、Node.js 事件循环阻塞)
  • 检查 /proc/<pid>/stack</pid>(需 root)看内核栈,排除 nf_conntrack 打满、ext4 日志锁、或 NFS 客户端卡住等内核态问题

横向扩容器后连接数不均,iptables SNAT 规则成瓶颈

说明:K8s 或自建集群加节点后,新 Pod 的出向连接集中在少数宿主机上,netstat -s | grep -i "conn failed" 出现大量 connection failed,本质是 iptables 的 CONNMARK + SNAT 规则在高并发下哈希冲突 + 锁竞争。

实操建议:

  • 避免在 POSTROUTING 链中对所有流量做 SNAT;改用 ip rule + ip route 基于源地址路由,或启用 nf_conntrack_hashsize 调大哈希桶(需重启模块)
  • 若必须用 iptables,把 SNAT 规则拆到不同链(如 SNAT-0SNAT-1),配合 ipset 分流,降低单链匹配开销
  • 检查 sysctl net.netfilter.nf_conntrack_max 和当前连接数(cat /proc/sys/net/netfilter/nf_conntrack_count),超 80% 就要调或清理老化连接

Ansible 批量部署失败,Connection refused 却能 ssh 手动连通

说明:Ansible 报 Connection refused,但人肉 ssh user@host 没问题——大概率是 Ansible 默认用 paramiko 实现 SSH,而目标机 sshd_config 中禁用了 PubkeyAuthentication no 或启用了 UsePAM yes 导致 paramiko 认证路径异常。

实操建议:

  • ansible.cfg 中强制走 OpenSSH:添加 [defaults]transport = ssh
  • 检查目标机 /var/log/secure,搜索 Failed passwordauthentication failure,确认是否被 PAM 拦截(比如 pam_faillock 锁了用户)
  • 避免在 inventory 中混用密码和密钥认证;统一用 --private-key 指定密钥,并确保权限为 600,否则 OpenSSH 会静默拒绝

systemd 服务依赖启动慢,systemctl start 卡住 90 秒

说明:写了个新服务 A,After=B.service,但 B 已运行,A 启动仍卡住。根本原因是 B.serviceType=notify 但没发 sd_notify("READY=1"),systemd 等超时(默认 DefaultTimeoutStartSec=90s)才放弃。

实操建议:

  • systemctl show A.service | grep TimeoutStartSec 确认实际超时值
  • Type=notify 服务,必须在代码中调用 sd_notify(0, "READY=1")(C)、systemd.daemon.notify("READY=1")(Python)、或用 systemd-notify --ready(Shell)
  • 若无法改代码,临时改 A.service:加 Wants=B.service 但去掉 After=,再用 ExecStartPre=/bin/sh -c 'while ! systemctl is-active --quiet B.service; do sleep 1; done' 主动轮询

业务扩展不是堆机器,是让每台机器的资源、连接、部署、启动都可预期。最容易被跳过的,永远是 systemd 的 notify 信号、nf_conntrack 的哈希大小、以及 Ansible 底层到底走的是哪个 SSH 实现。

text=ZqhQzanResources