Linux 服务器出现问题时,最重要的不是记住多少命令,而是能否快速找到问题所在。
例如:
- 服务器突然变慢,应该先检查 CPU 还是内存?
- 内存占用很高,如何判断是真正的内存不足,还是 Linux 正常使用缓存?
- 磁盘空间显示已满,但找不到占用空间的大文件,应该怎么办?
- 服务启动成功,却无法通过外部网络访问,如何定位问题?
- 某个端口被占用,如何找到对应的进程?
这些都是日常服务器运维中经常遇到的问题。
本文整理了一份 Linux 常用命令速查手册,按照实际排查场景划分,涵盖系统信息、CPU、内存、磁盘、网络、端口、进程和日志等内容。每个部分不仅介绍常用命令,还会说明关键参数和典型排查思路,方便日常查阅。
一、系统基础信息
排查服务器问题时,首先应该了解当前系统的基本情况,包括操作系统版本、内核版本、运行时间和系统负载。
1.1 查看操作系统版本
# 查看发行版信息
cat /etc/os-release
# 查看系统内核版本
uname -r
# 查看完整内核信息
uname -a
# 查看系统架构
uname -m
/etc/os-release 可以查看当前 Linux 发行版及版本,例如 Ubuntu、Debian、Rocky Linux 等。
uname -r 主要用于确认当前运行的 Linux 内核版本。
1.2 查看系统运行时间
# 查看系统运行时间和负载
uptime
# 查看当前登录用户
who
# 查看当前用户及系统负载
w
uptime 输出示例:
14:30:01 up 30 days, 2:15, 2 users, load average: 1.20, 0.85, 0.70
其中:
14:30:01:当前系统时间。up 30 days:系统已运行 30 天。2 users:当前登录用户数量。load average:最近 1 分钟、5 分钟和 15 分钟的平均系统负载。
Load Average 是后续 CPU 排查的重要指标,后面会详细介绍。
1.3 查看系统时间
# 查看当前系统时间
date
# 查看时区和时间同步状态
timedatectl
# 查看硬件时钟
hwclock
服务器时间不准确可能影响日志分析、定时任务、分布式系统以及数据库数据一致性判断。
生产环境建议配置可靠的 NTP 时间同步服务。
二、CPU 排查
CPU 使用率过高是服务器性能问题中最常见的情况之一。
常见原因包括:
- 某个进程出现死循环。
- 大量请求导致 CPU 计算压力增加。
- PHP、Java 等应用出现高频计算。
- 线程数量异常或任务积压。
- 系统上下文切换过于频繁。
2.1 实时查看 CPU 使用情况
top
top 是 Linux 最常用的系统监控工具,可以实时查看 CPU、内存和进程状态。
重点关注:
| 字段 | 含义 |
|---|---|
%us | 用户态 CPU 使用率 |
%sy | 内核态 CPU 使用率 |
%id | CPU 空闲率 |
%wa | 等待 I/O 的时间占比 |
%st | 虚拟机被宿主机占用的 CPU 时间 |
%ni | 调整过优先级的用户进程 CPU 使用率 |
常用交互操作:
P:按照 CPU 使用率排序。M:按照内存使用率排序。T:按照运行时间排序。1:显示每个 CPU 核心的使用情况。k:向指定进程发送信号。q:退出。
如果希望获得更直观的交互界面,可以安装 htop:
htop
2.2 查看 CPU 核心信息
# 查看 CPU 架构和核心信息
lscpu
# 查看 CPU 数量
nproc
lscpu 可以查看 CPU 型号、架构、核心数、线程数等信息。
需要注意,虚拟机和容器环境下看到的 CPU 数量可能受到资源配额限制,不一定等于物理宿主机的 CPU 数量。
2.3 查看进程 CPU 占用
# 按 CPU 使用率降序排列
ps aux --sort=-%cpu | head
# 查看指定进程
ps -fp <PID>
如果发现某个进程 CPU 占用异常,可以进一步检查进程内部的线程。
# 查看指定进程的线程
top -H -p <PID>
# 查看线程列表
ps -T -p <PID>
对于 PHP、Java 等多线程或包含多个执行线程的应用,这一步尤其重要。
2.4 查看 CPU 详细统计
安装 sysstat 后,可以使用 mpstat:
# 每秒采集一次 CPU 数据
mpstat 1
# 查看每个 CPU 核心
mpstat -P ALL 1
它可以帮助判断 CPU 负载是否集中在某个核心。
2.5 如何理解 Load Average?
Load Average 表示系统平均负载,反映一段时间内处于可运行状态,以及不可中断睡眠状态的任务数量。
例如:
load average: 4.00, 3.50, 2.80
这三个数字分别表示最近 1 分钟、5 分钟和 15 分钟的平均负载。
判断 Load Average 时,不能只看数字大小,还需要结合 CPU 核心数量。
例如:
| CPU 核心数 | Load Average | 初步判断 |
|---|---|---|
| 2 核 | 1.0 | 负载相对较低 |
| 2 核 | 4.0 | 需要关注 |
| 4 核 | 4.0 | 需要结合 CPU 使用率判断 |
| 8 核 | 4.0 | 通常不代表 CPU 已饱和 |
注意:Load Average 不等于 CPU 使用率。处于不可中断睡眠状态(通常与 I/O 等待有关)的任务也会影响 Load Average。
排查建议: 如果 Load Average 持续升高,先使用 top 查看 CPU 使用率和 %wa,再结合 ps、mpstat 和 iostat 判断是 CPU 计算压力还是 I/O 阻塞。
三、内存排查
Linux 会主动利用空闲内存作为文件缓存,以提高磁盘访问效率。
因此,内存使用率高并不一定意味着内存不足。
3.1 查看内存使用情况
free -h
输出示例:
total used free shared buff/cache available
Mem: 15Gi 8.0Gi 1.0Gi 200Mi 6.0Gi 6.5Gi
Swap: 2.0Gi 100Mi 1.9Gi
重点关注以下字段:
| 字段 | 含义 |
|---|---|
| total | 总内存 |
| used | 已使用内存 |
| free | 完全空闲的内存 |
| shared | 共享内存 |
| buff/cache | 缓冲区和文件缓存 |
| available | 估算可供新应用使用的内存 |
判断内存是否不足,优先关注 available,而不是单纯看 free。
如果 free 很低,但 available 仍然充足,通常不需要过度担心。
3.2 查看进程内存占用
# 按内存使用率排序
ps aux --sort=-%mem | head
# 查看进程详细信息
ps -eo pid,ppid,%mem,rss,vsz,comm --sort=-rss | head
其中:
RSS:进程当前驻留在物理内存中的大小。VSZ:进程使用的虚拟内存大小。%MEM:进程内存占物理内存的比例。
RSS 更适合观察进程实际驻留内存,但多个进程可能共享内存页,因此不能简单地把所有进程的 RSS 相加后当作真实物理内存消耗。
3.3 查看系统内存详细信息
cat /proc/meminfo
可以查看系统内存的详细统计信息,包括:
- MemTotal:总内存。
- MemAvailable:可用内存估算值。
- Cached:文件缓存。
- Buffers:块设备缓冲区。
- SwapTotal:Swap 总量。
- SwapFree:剩余 Swap。
3.4 查看进程内存映射
pmap -x <PID>
可以查看指定进程的内存映射和内存使用情况。
当某个进程内存异常增长时,可以进一步分析它的内存分布。
3.5 查看 Swap 使用情况
# 查看 Swap 使用情况
free -h
# 查看 Swap 相关信息
swapon --show
# 查看内存和 Swap 活动
vmstat 1
vmstat 中重点关注:
si:每秒从 Swap 读取的数据量。so:每秒写入 Swap 的数据量。
如果 si 和 so 持续较高,说明系统可能正在频繁进行 Swap 换入换出,需要进一步排查内存压力。
排查建议: 先执行 free -h,确认 available 和 Swap 使用情况,再通过 ps 找出内存占用较高的进程。不要看到 Swap 已使用就直接认为服务器内存不足。
四、磁盘与文件系统排查
磁盘问题通常分为两类:
- 磁盘空间不足。
- 磁盘 I/O 性能异常。
两类问题需要使用不同的命令排查。
4.1 查看磁盘空间
df -h
常见输出:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 42G 8.0G 84% /
重点关注:
Size:文件系统总容量。Used:已使用空间。Avail:可用空间。Use%:使用率。Mounted on:挂载目录。
如果某个分区使用率达到 90% 以上,就应该考虑排查空间占用。
4.2 检查 inode 使用情况
df -i
inode 用于记录文件系统中的文件元数据。
即使磁盘还有剩余空间,如果 inode 耗尽,也可能无法创建新文件。
常见于:
- 大量小文件。
- 缓存文件没有及时清理。
- 日志切割异常。
- 应用生成了大量临时文件。
因此,磁盘空间和 inode 都需要检查。
4.3 查看目录占用空间
# 查看指定目录大小
du -sh /var/log
# 查看当前目录下一级目录大小
du -h --max-depth=1
# 按大小排序
du -h --max-depth=1 | sort -hr
如果发现根目录空间不足,可以逐级检查:
du -h --max-depth=1 / | sort -hr
注意:遍历根目录可能产生较大的磁盘 I/O,生产环境应根据需要缩小扫描范围,并考虑权限和挂载点的影响。
4.4 查找大文件
# 查找超过 1GB 的文件
find /var -type f -size +1G -exec ls -lh {} \;
# 查找最近 7 天修改的文件
find /var/log -type f -mtime -7
这类命令适合定位异常增长的日志文件、临时文件和应用数据。
4.5 解决 df 和 du 显示不一致
有时候会出现这样的情况:
df -h显示磁盘已经使用 90%。du -sh统计出来的文件大小却明显更小。
一个常见原因是:文件已经被删除,但仍然被某个进程打开。
Linux 删除文件时,如果仍有进程持有文件描述符,文件实际占用的磁盘空间不会立即释放。
可以使用:
# 查看已经删除但仍被进程占用的文件
lsof +L1
找到对应进程后,需要根据应用情况进行处理,例如让应用重新打开日志文件,或在确认安全后重启相关进程。
不要直接通过删除文件或杀死进程的方式处理,避免造成业务影响。
4.6 查看磁盘 I/O
安装 sysstat 后:
# 每秒查看磁盘 I/O
iostat -xz 1
重点关注:
| 字段 | 含义 |
|---|---|
| r/s | 每秒读取请求数 |
| w/s | 每秒写入请求数 |
| rkB/s | 每秒读取数据量 |
| wkB/s | 每秒写入数据量 |
| await | I/O 请求平均等待时间 |
| aqu-sz | 平均 I/O 队列长度 |
| %util | 设备繁忙时间占比 |
注意:%util 接近 100% 可以作为设备繁忙的参考,但对于 SSD、NVMe 和多队列设备,不能仅凭这一指标判断磁盘是否达到性能上限,需要结合 await、吞吐量和队列长度分析。
4.7 查看进程磁盘 I/O
iotop
可以观察哪些进程正在进行大量磁盘读写。
如果发现某个数据库、日志服务或应用进程持续产生大量 I/O,可以进一步分析其读写行为。
五、网络排查
网络问题通常涉及网卡、IP 地址、路由、DNS、TCP 连接和防火墙等多个环节。
建议按照从底层到上层的顺序逐步排查。
5.1 查看网络接口和 IP 地址
# 查看所有网络接口
ip addr
# 简写
ip a
# 查看网络接口状态
ip link
# 查看网卡统计信息
ip -s link
ip -s link 可以查看网卡的收发数据量、错误和丢包统计。
如果发现 RX 或 TX 错误持续增长,需要进一步检查网卡、驱动、虚拟网络或上游网络设备。
5.2 查看路由表
ip route
查看默认网关:
ip route | grep default
如果服务器无法访问外网,可以先确认默认路由是否存在,以及路由是否指向正确的网关。
5.3 测试网络连通性
# 测试目标 IP 是否可达
ping 8.8.8.8
# 测试指定域名
ping example.com
如果 IP 可以访问,但域名无法访问,应该重点检查 DNS。
需要注意,部分服务器或网络设备会禁止 ICMP,因此 ping 不通不一定意味着 TCP 服务不可用。
5.4 DNS 排查
# DNS 查询
dig example.com
# 查询指定 DNS 服务器
dig @8.8.8.8 example.com
# 使用 nslookup
nslookup example.com
重点关注:
- 域名是否能够解析。
- 返回的 IP 是否正确。
- DNS 查询是否超时。
- 不同 DNS 服务器返回结果是否一致。
如果域名解析异常,可以继续检查:
cat /etc/resolv.conf
5.5 查看 TCP 连接状态
# 查看所有 TCP 连接
ss -ant
# 查看 TCP 连接及进程信息
ss -antp
# 查看各 TCP 状态数量
ss -ant | awk 'NR>1 {print $1}' | sort | uniq -c
常见 TCP 状态:
| 状态 | 含义 |
|---|---|
| LISTEN | 正在监听连接 |
| ESTAB | 已建立连接 |
| TIME-WAIT | 等待连接关闭相关报文完成 |
| CLOSE-WAIT | 等待本地应用关闭连接 |
| SYN-SENT | 已发送连接请求 |
| SYN-RECV | 已收到连接请求,等待后续握手 |
需要特别关注 CLOSE-WAIT。
如果某个服务的 CLOSE-WAIT 数量持续增长,通常需要检查应用是否正确关闭 Socket。
TIME-WAIT 则是 TCP 正常关闭流程的一部分,数量较多不一定意味着故障。
5.6 查看网络流量
安装 sysstat:
# 查看网卡流量
sar -n DEV 1
# 查看网络错误和丢包
sar -n EDEV 1
如果需要按连接查看网络流量,可以使用:
iftop
如果需要按进程查看网络流量,可以使用:
nethogs
这些工具通常需要额外安装,并且可能需要 root 权限。
六、端口与服务排查
当应用启动失败、端口被占用或者外部无法访问服务时,端口排查非常重要。
6.1 查看监听端口
# 查看所有 TCP 监听端口
ss -lntp
# 查看所有 UDP 监听端口
ss -lnup
# 查看所有监听端口
ss -lntup
参数说明:
l:只显示监听状态。n:以数字形式显示地址和端口。t:TCP。u:UDP。p:显示进程信息。
例如:
# 查看 8080 端口
ss -lntp | grep ':8080'
6.2 查找端口对应的进程
# 查看端口占用
lsof -i :8080
# 查看 TCP 端口占用
lsof -iTCP:8080 -sTCP:LISTEN
找到 PID 后:
ps -fp <PID>
就可以进一步确认是哪个程序占用了端口。
6.3 测试服务是否可访问
# 测试本机 TCP 端口
nc -zv 127.0.0.1 8080
# 测试 HTTP 服务
curl -I http://127.0.0.1:8080
# 查看详细连接过程
curl -v http://127.0.0.1:8080
如果本机能够访问,但外部无法访问,需要继续检查:
- 服务是否监听在
127.0.0.1,而不是0.0.0.0或目标网卡地址。 - Linux 防火墙是否放行端口。
- 云服务器安全组是否放行端口。
- 上游负载均衡或反向代理配置是否正确。
6.4 查看防火墙规则
不同 Linux 发行版可能使用不同的防火墙管理工具。
firewalld:
# 查看防火墙状态
systemctl status firewalld
# 查看放行端口
firewall-cmd --list-ports
# 查看完整规则
firewall-cmd --list-all
UFW:
# 查看防火墙状态
ufw status
# 查看详细规则
ufw status verbose
iptables:
iptables -L -n -v
注意:云服务器还可能存在独立的安全组规则,Linux 本机防火墙放行并不代表外部网络一定能够访问。
七、进程与服务排查
Linux 中很多故障最终都需要定位到具体进程。
例如服务无法启动、进程异常退出、CPU 或内存占用过高等。
7.1 查看进程
# 查看所有进程
ps aux
# 查看进程树
pstree -p
# 查找指定进程
pgrep -af nginx
# 根据 PID 查看进程
ps -fp <PID>
pgrep -af 可以根据进程名称或命令行内容查找进程。
7.2 查看进程打开的文件
# 查看进程打开的文件
lsof -p <PID>
# 查看进程打开的网络连接
lsof -i -a -p <PID>
lsof 是排查文件描述符、端口占用和文件删除后空间未释放问题的重要工具。
7.3 查看 systemd 服务状态
# 查看服务状态
systemctl status nginx
# 启动服务
systemctl start nginx
# 停止服务
systemctl stop nginx
# 重启服务
systemctl restart nginx
# 设置开机启动
systemctl enable nginx
# 查看是否开机启动
systemctl is-enabled nginx
查看服务是否启动成功:
systemctl is-active nginx
7.4 跟踪进程系统调用
如果普通日志无法定位问题,可以使用 strace。
# 跟踪指定进程
strace -p <PID>
# 跟踪进程的文件操作
strace -e trace=openat,read,write -p <PID>
# 跟踪进程的网络相关系统调用
strace -e trace=network -p <PID>
strace 可以帮助分析进程是否频繁访问文件、连接网络、等待系统调用或出现权限错误。
注意:生产环境中跟踪高负载进程可能带来额外开销,建议控制跟踪范围和持续时间。
八、日志排查
日志是定位系统故障的重要依据。
排查服务异常时,应优先检查应用日志、Web Server 日志、PHP-FPM 日志以及系统日志。
8.1 查看文件日志
# 查看最后 100 行
tail -n 100 /var/log/syslog
# 实时查看日志
tail -f /var/log/syslog
# 搜索错误日志
grep -i "error" /var/log/syslog
# 查看日志文件大小
du -sh /var/log/*
不同发行版的系统日志路径可能不同:
- Debian / Ubuntu:常见
/var/log/syslog。 - RHEL 系发行版:常见
/var/log/messages。
具体以系统配置为准。
8.2 使用 journalctl 查看日志
对于使用 systemd 的系统,可以使用 journalctl。
# 查看全部系统日志
journalctl
# 查看本次启动日志
journalctl -b
# 查看最近 100 行
journalctl -n 100
# 实时查看日志
journalctl -f
# 查看指定服务日志
journalctl -u nginx
# 查看指定服务最近 100 行
journalctl -u nginx -n 100
# 查看错误级别日志
journalctl -p err
如果服务启动失败,可以直接执行:
journalctl -u nginx -xe
通常可以找到启动失败的具体原因。
8.3 查看内核日志
# 查看内核日志
dmesg
# 查看最近的内核日志
dmesg -T | tail -n 100
# 查看内存 OOM 相关信息
dmesg -T | grep -i -E 'oom|killed process'
如果应用进程突然被系统杀死,可以重点检查 OOM Killer 相关日志。
九、常见故障排查速查
前面的章节介绍了各类命令,下面将它们组合起来,形成实际排查流程。
9.1 CPU 使用率突然升高
推荐排查顺序:
# 1. 查看系统负载
uptime
# 2. 查看 CPU 使用情况
top
# 3. 查看 CPU 占用最高的进程
ps aux --sort=-%cpu | head
# 4. 查看进程内部线程
top -H -p <PID>
# 5. 查看各 CPU 核心使用情况
mpstat -P ALL 1
重点判断:
- 是否某个进程持续占用 CPU。
- 是否某个线程出现异常。
- 是否 CPU 核心负载不均衡。
- 是否存在大量系统态 CPU 消耗。
9.2 内存使用率过高
推荐排查顺序:
# 1. 查看内存总体情况
free -h
# 2. 查看内存占用最高的进程
ps aux --sort=-%mem | head
# 3. 查看内存详细信息
cat /proc/meminfo
# 4. 查看 Swap 活动
vmstat 1
# 5. 查看 OOM 相关日志
dmesg -T | grep -i -E 'oom|killed process'
重点判断:
available是否持续下降。- 是否存在单个进程内存异常增长。
- Swap 是否频繁换入换出。
- 是否发生过 OOM Killer。
9.3 磁盘空间不足
推荐排查顺序:
# 1. 查看文件系统使用情况
df -h
# 2. 查看 inode 使用情况
df -i
# 3. 查看根目录下各目录大小
du -h --max-depth=1 / | sort -hr
# 4. 查找大文件
find /var -type f -size +1G -exec ls -lh {} \;
# 5. 查看已删除但仍被占用的文件
lsof +L1
重点判断:
- 是磁盘空间不足还是 inode 耗尽。
- 是否存在异常增长的日志文件。
- 是否有大文件被删除但仍被进程占用。
- 是否有缓存或临时文件未及时清理。
9.4 磁盘 I/O 异常
# 1. 查看磁盘 I/O
iostat -xz 1
# 2. 查看进程磁盘读写
iotop
# 3. 查看进程状态
ps aux
重点判断磁盘等待时间、队列长度和设备繁忙情况,并结合具体进程的读写行为定位问题。
9.5 服务无法访问
推荐排查顺序:
# 1. 检查服务状态
systemctl status nginx
# 2. 检查端口是否监听
ss -lntp
# 3. 测试本机服务
curl -v http://127.0.0.1:8080
# 4. 检查网络接口
ip addr
# 5. 检查路由
ip route
# 6. 检查防火墙
firewall-cmd --list-all
# 7. 查看服务日志
journalctl -u nginx -n 100
如果本机访问正常,但外部访问失败,应继续检查监听地址、主机防火墙、云安全组和上游网络设备。
9.6 端口被占用
# 1. 查看端口监听情况
ss -lntp | grep ':8080'
# 2. 查看端口对应进程
lsof -iTCP:8080 -sTCP:LISTEN
# 3. 查看进程详情
ps -fp <PID>
确认进程归属后,再决定是否调整服务端口或停止相关服务。
不要在没有确认进程用途的情况下直接执行 kill -9。
十、进阶运维工具
除了前面介绍的命令,还有一些工具适合进一步分析系统性能。
| 工具 | 主要用途 |
|---|---|
vmstat | CPU、内存、Swap 和系统运行队列 |
sar | 历史系统资源统计 |
pidstat | 进程级 CPU、内存和 I/O 统计 |
iostat | 磁盘 I/O 性能分析 |
iotop | 进程级磁盘 I/O |
iftop | 网络连接流量分析 |
nethogs | 进程级网络流量分析 |
lsof | 文件、端口和进程关联分析 |
strace | 跟踪进程系统调用 |
tcpdump | 网络数据包抓取 |
dmesg | 查看内核日志 |
htop | 交互式系统与进程监控 |
其中,tcpdump 对于深入分析网络问题非常有帮助。
例如:
# 抓取指定网卡的流量
tcpdump -i eth0
# 抓取指定端口
tcpdump -i eth0 port 8080
# 抓取指定主机的流量
tcpdump -i eth0 host 192.168.1.100
# 抓包并保存到文件
tcpdump -i eth0 port 8080 -w capture.pcap
保存后的 pcap 文件可以使用 Wireshark 进一步分析。
生产环境抓包时,应限制网卡、端口和抓包时长,避免产生过大的文件或捕获不必要的敏感数据。
十一、常用工具安装
部分命令并不是所有 Linux 系统默认安装的,需要根据发行版安装相应工具。
Debian / Ubuntu
apt update
apt install -y \
procps \
sysstat \
htop \
iotop \
lsof \
iproute2 \
iputils-ping \
dnsutils \
net-tools \
tcpdump \
strace \
traceroute \
ncdu
RHEL / Rocky Linux / AlmaLinux
dnf install -y \
procps-ng \
sysstat \
htop \
iotop \
lsof \
iproute \
iputils \
bind-utils \
net-tools \
tcpdump \
strace \
traceroute \
ncdu
不同发行版的软件包名称和仓库配置可能有所差异。
建议提前在常用服务器镜像中安装必要的排查工具,避免故障发生后才发现缺少命令。
十二、总结
Linux 故障排查并不需要记住所有命令,关键是建立正确的排查思路。
可以记住下面这组最常用的命令:
| 排查方向 | 核心命令 |
|---|---|
| 系统信息 | uname、uptime、hostnamectl |
| CPU | top、ps、mpstat、lscpu |
| 内存 | free、vmstat、pmap |
| 磁盘空间 | df、du、find、lsof |
| 磁盘 I/O | iostat、iotop |
| 网络 | ip、ping、dig、sar |
| TCP 连接 | ss、tcpdump |
| 端口 | ss、lsof、nc |
| 进程 | ps、pgrep、pstree、strace |
| 服务 | systemctl、journalctl |
| 内核日志 | dmesg |
实际排查时,建议遵循一个基本原则:
先观察系统整体状态,再定位具体资源,最后深入分析进程和日志。
例如服务器突然变慢,不要一开始就盲目重启服务。先通过 uptime、top、free、iostat 判断问题属于 CPU、内存还是磁盘 I/O,再结合进程和日志逐步缩小范围。
掌握这些命令,基本可以覆盖日常 Linux 服务器运维中大部分常见的性能排查和故障定位场景。
这份手册也会持续补充更多实用命令,建议收藏,作为日常 Linux 运维的速查资料。