一、先看资源:CPU / 内存 / 磁盘
# 负载与运行时间(load average 三个值持续走高说明有压力)
uptime
# 内存使用
free -h
# 磁盘使用(重点看 / 挂载点)
df -h
# 实时看 CPU/内存占用最高的进程
top
# 按 P 按 CPU 排序,按 M 按内存排序
# 定位某个目录的占用大头
du -xh --max-depth=2 / | sort -rh | head -20
判断经验:
df -h使用率到 90%+,优先怀疑日志、binlog 把磁盘灌满。load average长期超过 CPU 核数,说明 CPU 忙不过来。
二、再看网络:端口 / 连通性
# 看哪些端口在监听、哪个进程在用(排查端口占用)
ss -tlnp
# 老一点的命令也可以
netstat -tlnp
# 测试对外连通
ping -c 4 baidu.com
curl -v https://example.com
# 看路由
ip route
常见问题: 服务明明在跑却访问不了 → 先 ss -tlnp 看端口是否在监听、监听的是不是 0.0.0.0;再确认防火墙/安全组是否放行。
三、再查服务和日志
# 服务状态(重点看 Active: active (running) 还是 failed)
systemctl status nginx
# 看最近的错误日志
journalctl -xe
journalctl -u nginx --since "10 min ago"
# 内核/硬件报错(磁盘、内存、驱动问题常在这里)
dmesg | tail -50
# 实时跟踪应用日志
tail -f /var/log/nginx/error.log
日志定位口诀: /var/log/syslog(系统)、/var/log/nginx/error.log(Web)、/var/log/mysql/error.log(数据库)。先看 tail -n 100 最近报错,再往上追。
四、附:一键系统体检脚本
#!/bin/bash
# 一键体检:CPU / 内存 / 磁盘 / 端口 / 内核日志
echo "===== 运行时间与负载 ====="
uptime
echo -e "\n===== 内存 ====="
free -h
echo -e "\n===== 磁盘 ====="
df -h | grep -vE "tmpfs|loop"
echo -e "\n===== 监听端口 ====="
ss -tlnp
echo -e "\n===== 最近内核日志 ====="
dmesg | tail -20
echo -e "\n===== 最近系统错误 ====="
journalctl -p err --since "1 hour ago" --no-pager | tail -20
保存为 sys_check.sh,chmod +x sys_check.sh,用 ./sys_check.sh 执行,或配合 crontab 定时记录。
五、常见故障排查速查
| 现象 | 先查 | 常见原因 |
|---|---|---|
| 网页打不开 | systemctl status nginx + ss -tlnp | 服务没起 / 端口没监听 / 防火墙拦 |
| 磁盘爆了 | df -h → du -xh / \| sort -rh \| head | 日志、binlog、备份文件堆积 |
| 机器卡死 | top + free -h | 内存不足触发 swap,或进程异常吃满 CPU |
| 端口被占 | ss -tlnp | 多实例冲突 / 服务重复启动 |
| 莫名重启 | dmesg + journalctl -k | 内存颗粒错误 / 过热 / 内核 panic |