最近接手了一台响应缓慢的服务器,登录后第一件事就是检查系统负载。记得刚入行时,我总是一头雾水,面对卡顿的服务器不知从何查起。后来发现,一套清晰的排查流程能事半功倍。现在我就把多年积累的实战经验分享给大家。
首先用uptime快速查看系统负载情况。这个命令能显示1分钟、5分钟和15分钟的平均负载值。如果这些数值接近或超过CPU核心数,说明系统已经过载。比如4核CPU的服务器,如果15分钟负载达到3.5,就要引起警惕了。
接下来我会用ps aux --sort=-%cpu命令,按CPU使用率降序排列所有进程。这个组合特别实用,能立即揪出占用CPU最高的"罪魁祸首"。有一次我就用这个方法发现了一个异常运行的Python脚本,它占用了98%的CPU资源。
ps命令是查看进程静态快照的瑞士军刀。我最常用的组合是ps auxf,它能显示完整的进程树结构。其中a表示所有用户的进程,u显示详细用户信息,x包含没有控制终端的进程,f则展示父子进程关系。
举个例子,当发现某个Java服务异常时,我会这样排查:
bash复制ps auxf | grep java
这样不仅能找到目标进程,还能看到它启动的完整命令行参数,对排查配置问题特别有帮助。
ps输出的每一列都藏着重要信息:
%CPU和%MEM:这两个百分比数值最直观反映资源占用情况STAT状态码:S表示休眠,R表示运行,Z表示僵尸进程START:进程启动时间,突然出现的新进程可能有问题TIME:累计CPU时间,长时间运行的进程要特别关注我习惯用这个命令组合来监控特定用户的进程:
bash复制watch -n 1 'ps -u www-data -o pid,%cpu,%mem,cmd --sort=-%cpu'
每秒钟刷新一次,按CPU使用率排序显示www-data用户的进程。
如果说ps是拍照片,那么top就像是实时监控摄像头。启动top后,默认按CPU使用率排序,这个界面包含大量关键信息:
我经常用1键展开多核CPU的详细使用情况,这对排查CPU负载不均衡问题特别有用。比如发现某个核心100%而其他核心空闲,很可能是单线程应用导致的性能瓶颈。
很多人不知道top支持多种交互操作:
M:按内存使用排序P:按CPU使用排序(默认)c:显示完整命令行k:终止指定PID的进程d:修改刷新间隔我常用的技巧是top -b -n 1 > top.log,将top输出保存到文件,方便后续分析。在排查内存泄漏时,我会定期执行这个命令记录内存使用趋势。
现代Linux系统大多使用systemd管理服务,systemctl就是它的控制中心。这几个命令我每天都要用:
bash复制systemctl status nginx # 查看服务状态
systemctl restart nginx # 重启服务
systemctl --failed # 查看启动失败的服务
有一次服务器重启后网站无法访问,用systemctl --failed立即发现是数据库服务启动失败,快速定位了问题。
当服务异常时,我通常会按这个流程排查:
systemctl status <服务名>:查看基本状态和日志片段journalctl -u <服务名>:查看完整日志systemctl cat <服务名>:检查服务配置文件systemctl daemon-reload:重载配置对于频繁崩溃的服务,可以设置自动重启:
bash复制[Service]
Restart=always
RestartSec=5s
这个配置能让服务在崩溃后5秒自动重启。
虽然逐渐被ss取代,但netstat仍然是排查网络问题的利器。我最常用的组合是:
bash复制netstat -tulnp # 查看所有监听端口
netstat -anp # 查看所有连接
这个命令能显示每个网络连接对应的进程,对查找异常连接特别有用。曾经用它发现过一个异常的出站连接,最终确认是服务器被入侵的迹象。
ss是netstat的现代替代品,速度更快、信息更全。我最欣赏它的过滤功能:
bash复制ss -t state established # 只显示已建立的TCP连接
ss -o state time-wait # 查看TIME-WAIT状态的连接
ss -p | grep nginx # 查看nginx的所有连接
在处理端口耗尽问题时,这个命令组合特别有用:
bash复制ss -s # 显示汇总统计
它能列出各种连接状态的数量,帮助判断是否存在连接泄漏。
去年处理过一个典型案例:电商网站突然变慢。我是这样排查的:
top发现CPU使用率高达90%ps auxf发现是MySQL进程占用过高systemctl status mysql显示服务运行正常ss -tnp | grep mysql发现有大量来自同一IP的连接解决方案很简单:用iptables封禁异常IP,然后优化MySQL连接池配置。整个过程不到10分钟,这就是系统监控工具组合使用的威力。
对于重要服务器,我建议设置自动化监控。一个简单的方案是:
bash复制#!/bin/bash
# 监控CPU和内存
top -b -n 1 | head -20 >> /var/log/system_monitor.log
# 监控网络连接
ss -s >> /var/log/system_monitor.log
# 检查关键服务
systemctl list-units --type=service | grep failed >> /var/log/system_monitor.log
配合cron定时执行,就能建立基础的监控体系。更专业的方案可以考虑Prometheus+Grafana,但这个小脚本已经能解决80%的问题。