一、进程基础概念
1. 进程定义
- 进程:程序的一次执行实例,包含代码、数据、资源(如文件句柄、内存)及执行状态。
- PID(进程ID):唯一标识进程的整数(1≤PID≤32768,1通常为 systemd 或 init )。
- 父进程与子进程:通过 fork() / exec() 创建,父进程ID(PPID)记录于进程元数据中。
2. 核心特性
- 独立性:进程间资源隔离(通过Namespace/Cgroups实现)。
并发性:多个进程可同时运行(CPU分时调度)。
生命周期:创建( fork )→ 运行 → 终止(正常退出或信号终止)。
二、进程监控工具: ps 深度解析
1. 语法与常用选项
选项 作用 典型场景
-a 显示所有用户的进程(不含会话 leader) 查看非当前用户进程
-u 显示用户相关信息(如用户名、启动时间) 按用户筛选进程
-x 显示无控制终端的进程(如后台服务) 监控守护进程(如 sshd )
-e / -A 显示所有进程 全局进程扫描
-f 全格式输出(含PPID、命令行参数) 分析进程父子关系
-o 自定义字段(如 -o pid,ppid,cmd ) 按需提取关键信息
2. ps -aux 输出字段详解(实例解析)
bash
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 170856 6800 ? Ss Feb17 350:48 /sbin/init
- USER:启动进程的用户(如 root 、 ubuntu )。
- PID:进程ID(如 1 为初始化进程)。
- %CPU:CPU占用率(累计值,非实时,需结合 top )。
- %MEM:物理内存占用率( RSS /总内存)。
- VSZ:虚拟内存大小(KB,包含未分配内存)。
- RSS:常驻内存大小(KB,实际占用的物理内存)。
- TTY:控制终端( ? 表示无终端,如守护进程; pts/0 表示远程终端)。
- STAT:进程状态(核心!见下表)。
- START:进程启动时间(如 Feb17 表示2月17日启动)。
- TIME:累计CPU时间(非运行时间,多线程进程会累加)。
- COMMAND:进程启动命令(完整参数可通过 ps -ef 查看)。
3. 进程状态(STAT)全解
状态码 含义 实例与说明
R 运行态(Running/Ready) 正在CPU运行(R+)或等待调度(R),带 + 表示前台进程。
S 可中断睡眠(Sleeping) 等待I/O或信号(如 sshd 等待连接), kill 可唤醒。
D 不可中断睡眠(Disk Sleep) 等待磁盘I/O(如读取文件时卡住),此时进程不可被 kill ,需修复I/O问题。
T 停止态(Stopped) 被 SIGSTOP 信号暂停(如终端中按 Ctrl+Z ),可通过 kill -CONT 恢复。
Z 僵尸态(Zombie) 进程已终止,但父进程未回收状态( ps 输出中 COMMAND 带 [ ] ,如 [defunct] )。
s 会话领导者(Session Leader) 如终端启动的主进程(例: bash 进程STAT为 Ss , s 表示会话 leader)。
< 高优先级进程 优先级高于默认值(通过 nice 调整,值越小优先级越高)。
n 低优先级进程 优先级低于默认值( nice 值为1-19)。
4. 实战场景:僵尸进程处理
现象:系统中存在状态为 Z 的进程,占用PID资源,长期存在可能导致PID耗尽。
步骤:
1. 查找僵尸进程:
bash
ps -ef | grep ' Z ' # STAT列包含空格+Z,排除grep自身
ps -A -ostat,ppid,pid,cmd | grep -e '^\[Zz\]' # 更精准匹配僵尸进程格式
2. 定位父进程(PPID):
bash
pid=1234 # 僵尸进程PID
ps -o ppid= -p $pid # 输出父进程PID(如5678)
3. 终止父进程:
bash
kill -9 5678 # 强制终止父进程,僵尸进程会被`init`(PID 1)回收
- 注意:若父进程是 systemd 等核心进程,需谨慎操作,优先排查父进程为何未回收子进程(如代码中未调用 wait() )。
三、动态监控工具: top vs htop vs iotop
1. top :实时进程监控
- 核心功能:动态显示CPU、内存、进程状态,支持交互操作(按键盘快捷键)。
- 输出解析(关键部分):
bash
top - 17:01:55 up 60 days, 6:30, 1 user, load average: 2.55, 1.74, 1.88
Tasks: 473 total, 1 running, 472 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2us(用户空间), 0.4sy(内核空间), 0.0ni(低优先级用户), 99.4id(空闲), 0.0wa(I/O等待), 0.0hi(硬件中断), 0.0si(软件中断), 0.0st(虚拟机偷取时间)
MiB Mem : 64050.7 total, 29284.5 free, 6963.5 used, 27802.7 buff/cache
- 常用选项:
- -d 5 :每5秒更新一次(默认3秒)。
- -p 1234 :仅监控PID为1234的进程。
- -u username :仅显示用户 username 的进程。
- 交互命令:
- P :按CPU占用排序(默认)。
- M :按内存占用排序。
- k :输入PID后按 Enter ,可发送信号(如 9 强制终止)。
- q :退出 top 。
2. htop :增强型交互式工具
- 优势:
- 可视化:彩色界面、树状进程视图(按 F5 显示父子关系)。
- 便捷操作:直接通过方向键选择进程,按 F9 发送信号。
- 实时统计:显示每个进程的CPU核心占用、线程数等。
- 安装:
bash
# Ubuntu/Debian
sudo apt install htop
# CentOS/RHEL
sudo yum install htop
# Fedora
sudo dnf install htop
- 常用快捷键:
- F2 :设置界面(如隐藏无关列)。
- F6 :选择排序字段(如按 %MEM 排序)。
- F4 :过滤进程(输入关键字,如 nginx )。
3. iotop :磁盘I/O监控
- 作用:定位占用磁盘读写的进程,解决I/O瓶颈(如日志写入过多、数据库频繁读写)。
- 输出示例:
bash
Total DISK READ: 10.00 K/s | Total DISK WRITE: 20.00 K/s
PID USER DISK_READ DISK_WRITE SWAPIN %CPU COMMAND
1234 root 5.00 K/s 10.00 K/s 0.0% /usr/sbin/rsyslogd
- 常用选项:
- -o :仅显示有I/O活动的进程。
- -d 2 :每2秒更新一次。
-p 1234 :监控指定PID的I/O。
安装:
bash
# Ubuntu/Debian
sudo apt install iotop
# CentOS/RHEL(需先启用EPEL源)
sudo yum install iotop
四、典型场景实战
1. CPU占用过高排查
1. 通过 top / htop 找到 %CPU 高的进程(如PID 5678)。
2. 用 ps -ef | grep 5678 查看完整命令,确认是否为正常程序(如编译任务、异常进程)。
3. 若为异常进程,用 kill -9 5678 终止,或通过 nice 调整优先级( nice -n 10 ./process 降低优先级)。
2. 内存泄漏定位
1. top 按 M 键排序,找到 %MEM 高的进程。
2. 用 ps -o pid,ppid,cmd,rsz %MEM 查看详细内存占用。
3. 结合 free -h 查看系统内存使用,若 buff/cache 过高,可通过 echo 3 > /proc/sys/vm/drop_caches 释放(谨慎操作)。
3. I/O瓶颈分析
1. 运行 iotop ,观察 DISK_READ / DISK_WRITE 高的进程(如日志服务持续写入)。
2. 优化方向:减少不必要的磁盘操作(如合并日志写入、使用异步I/O)。
五、总结
- 基础工具: ps 用于静态进程信息查询, top / htop 用于动态监控, iotop 聚焦I/O分析。
- 核心目标:通过状态码(STAT)判断进程健康度,结合资源占用(CPU/MEM/I/O)定位性能瓶颈。
- 最佳实践:
- 定期巡检僵尸进程(避免PID耗尽)。
- 对关键进程设置监控报警(如通过Prometheus+Grafana)。
- 区分进程状态(如 D 状态需优先处理I/O问题,而非直接终止)。
2946



被折叠的 条评论
为什么被折叠?



