
服务器卡成PPT的时候,别再只会重启大法了,这几个命令能让你30秒内锁定元凶。
前几天线上服务器突然抽风,CPU飙到95%,磁盘IO wait高得离谱,整个服务响应慢得像蜗牛。隔壁组的小王急得团团转,差点就要祭出万能重启大法。

我过去敲了几个命令,30秒就定位到是一个跑偏的日志收集进程在疯狂写盘。运维的差距就在这儿——基础命令人人会用,但高级命令能在关键时刻救你于水火。
性能问题永远是运维的头号公敌。服务器一卡,业务方电话就打爆了。但很多人排查性能问题,翻来覆去就是top、free、iostat老三样。
说实话,这就像用瑞士军刀修车——能用,但效率真不行。
pidstat 这个命令比top精准得多。top给你的是瞬间快照,pidstat能给你连续监控。想知道哪个进程在偷偷吃IO?
pidstat -d 1 10
每秒采样一次,连续10次,哪个进程读写最猛一目了然。-d参数显示磁盘IO,-r显示内存,-u显示CPU。
安装也很简单,CentOS用yum install sysstat,Ubuntu用apt-get install sysstat。
上次我用这个抓到一个疯狂写日志的后台进程,它每秒写入300MB数据,直接把磁盘IO打满。如果没有pidstat,我可能还在怀疑是数据库问题。
iotop 是另一个神器,专治各种磁盘IO疑难杂症。
iotop -o -P -b -d 2 -n 5
-o只显示有IO活动的进程,-P不显示线程只显示进程,-b批量模式适合写脚本。这个命令让我发现了一个配置错误的数据库备份任务,它在业务高峰时段全表扫描,把生产库的IO拖垮了。
高并发场景下,netstat查几千个连接能卡到你怀疑人生。ss命令基于内核哈希表,查询速度完全不在一个量级。
ss -ltnp | grep :8080
一秒内告诉你8080端口被谁占着。-s参数统计各状态连接数,排查连接泄漏时特别有用。
我见过最离谱的案例是一个微服务忘了关连接池,24小时积累了8万个TIME_WAIT连接。用ss -s一眼就能看出异常,用netstat查的话,估计得等个好几分钟。
面对几个G的Nginx日志,用cat+grep就像用勺子舀大海。awk才是日志分析的正解。
统计每个IP的访问次数?一行命令搞定:
awk ‘{print $1}’ access.log | sort | uniq -c | sort -nr | head -10
提取状态码为404的请求?同样简单:
awk ‘$9==“404” {print $1, $4, $7}’ access.log
最近很多应用都输出JSON日志,这时候jq就是神器了。以前看Docker或K8s日志,满屏的JSON结构看得眼花。
kubectl logs pod-name | jq ‘.message’
一行命令提取出核心信息,过滤ERROR级别日志也轻而易举。
清理7天前的日志文件,很多人会写脚本循环。其实一行命令就行:
find /var/log/nginx -name “*.log” -mtime +7 | xargs rm -rf
但这里有个大坑:如果文件名有空格,这条命令会炸。正确做法是:
find /var/log/nginx -name “*.log” -mtime +7 -print0 | xargs -0 rm -rf
-print0和-0组合能正确处理各种奇怪的文件名。
find命令的-exec参数也很强大,但语法有点反人类:
find /etc -name “*.conf” -mtime 0 -exec cp {} /backup/ \;
那个{}和\;真是Linux设计者的恶趣味。不过用熟了确实能省不少事,比如批量修改权限:
find /var -type f -perm 777 -exec chmod 755 {} \;
systemctl 现在几乎是标配了,但很多人只知道start、stop、restart。其实它有很多隐藏功能。
比如查看服务依赖关系:
systemctl list-dependencies nginx
排查服务启动失败时特别有用。还有systemctl status -l显示完整日志,不用再去翻journalctl。
最近发现systemctl enable --now这个组合特别实用,一次搞定设置开机启动和立即启动。Oracle的文档里也推荐这么用,确实省事。
权限管理是另一个容易翻车的地方。chmod 777 这种操作我都看麻了,简直是在服务器上开裸奔派对。
正确的权限设置应该是:
chmod u=rwx,g=rx,o= /opt/script.sh
符号表示法比数字更直观,一看就知道每类用户有什么权限。chown -R www:www /var/www/html递归修改目录所有权,Web部署时经常用。
lastb 这个命令可能很多人没用过,但它能显示所有失败的登录尝试。服务器被暴力破解时,这是第一道防线。
lastb -n 20
显示最近20次失败登录。如果看到同一个IP尝试不同用户名,基本可以确定是攻击行为。
配合last查看成功登录记录,能全面了解服务器登录情况。这两个命令读取的是/var/log/btmp和/var/log/wtmp文件,如果文件不存在,系统就不记录这些信息。
单个命令再强也有局限,真正的高手都擅长命令组合。
比如找出磁盘使用量最大的10个目录:
du -ah / | sort -rh | head -n 10
实时监控网络连接变化:
watch -n 1 “ss -s | grep -i total”
监控某个进程的CPU和内存使用:
pidstat -p 1234 -u -r 1
这些组合命令我都设成了别名,放在~/.bashrc里。比如alias ngxerr=‘tail -f /var/log/nginx/error.log’,用起来效率翻倍。
不过要注意不同Linux发行版的差异,Ubuntu用apt,CentOS用yum,命令参数有时也不一样。写脚本时一定要考虑兼容性问题。
那天问题解决后,小王跑来问我怎么这么快。我告诉他:top能告诉你服务器发烧了,但高级命令能告诉你发烧是因为感冒还是肺炎。现在他也在自己的服务器上装上了sysstat,开始用pidstat和iotop了。
真正的运维高手,不是记住所有命令,而是知道什么问题该用什么工具。就像老中医,望闻问切后,针到病除。
主标签:#Linux运维
副标签:#系统性能优化
长尾标签:#Linux高级命令使用技巧
推荐文章


点击阅读原文,查看更多



