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 使用率
%idCPU 空闲率
%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 已使用就直接认为服务器内存不足。

四、磁盘与文件系统排查

磁盘问题通常分为两类:

  1. 磁盘空间不足。
  2. 磁盘 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每秒写入数据量
awaitI/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。

十、进阶运维工具

除了前面介绍的命令,还有一些工具适合进一步分析系统性能。

工具主要用途
vmstatCPU、内存、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
CPUtop、ps、mpstat、lscpu
内存free、vmstat、pmap
磁盘空间df、du、find、lsof
磁盘 I/Oiostat、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 运维的速查资料。