Linux-进程管理
进程基本概念
- 程序:程序是存储在磁盘上的静态可执行文件(如二进制文件或脚本),包含完成特定任务的指令和数据。
- 进程:操作系统进行资源分配和调度的基本单位。每个进程拥有独立的内存空间(包括代码段、数据段、堆栈段等),相当于一个正在运行的程序实例。
- 线程:进程内的执行单元,属于CPU调度的最小单位。同一进程中的多个线程共享进程的资源(如内存、文件句柄),但每个线程有独立的程序计数器、栈空间和寄存器状态。每个进程最大有65535个新线程。
- 守护进程:守护进程是一种长期运行的后台进程,通常在系统启动时启动,独立于终端(不与用户直接交互),用于提供系统服务。比如web服务nginx,系统监听端口80,当有用户请求时,父进程会分配子进程处理,处理完后以服务形式持续运行。
- 僵尸进程:僵尸进程是已经终止但未被父进程回收资源的进程。(父进程停止,子进程未停止)
- PID (Process ID):每个进程的唯一标识号
- PPID (Parent Process ID):父进程的 ID
- UID/GID:进程所属用户和组
| 概念 | 状态 | 资源占用 | 生命周期 | 典型示例 |
|---|---|---|---|---|
| 程序 | 静态文件 | 磁盘空间 | 永久存储 | /bin/ls |
| 进程 | 动态执行 | CPU/内存 | 启动到终止 | ls -l 运行时 |
| 线程 | 动态执行 | 共享资源 | 程序执行完毕 | ps -eLf |
| 守护进程 | 后台运行 | 常驻内存 | 系统启动到关闭 | sshd、nginx |
| 僵尸进程 | 已终止但未回收资源 | 无 | 父进程调用 wait() 前 | 子进程未被父进程回收 |
查看进程
ps 命令
bash
ps aux # 查看所有运行中的进程
ps -ef # 另一种查看所有进程的方式
ps -u username # 查看特定用户的进程
ps -p PID # 查看特定PID的进程输出字段解析
bash
%CPU # CPU使用率
%MEM # 内存使用率
args # 完整命令行
CMD # 简单命令名
COMMAND # 运行该进程的指令
etime # 进程运行时间
euser # 有效用户名
fgroup # 文件系统组名
START # 进程启动时间
LWP # 线程号
NLWP # 该进程中的线程数
NI # nice值,优先级修正值取值范围-20到20
pcpu # CPU百分比(同%cpu)
pgid # 进程组ID
PID # 进程ID
PPID # 父进程ID
PRI # 进程优先级,值越小进程的优先级越高(默认80)。优先级计算PRI(80)+NI(-20)=60
RSS # 占用物理内存大小
STAT # 进程状态
S # 休眠状态进程
R # 运行状态进程
D # 不可中断(正在等待系统分配资源)
+ # 运行在前台进程
Z # 僵尸进程(需要定期清理)
T # 已停止
TIME # 累计CPU时间(要注意观察,启动时长太长有问题)
TTY # 控制终端
? # 系统启动进程
tty # 本地登录终端
pts # 远程登录终端
USER # 用户名
VSZ # 虚拟内存大小(物理内存+交换分区)top 命令
bash
top常用交互命令:
q:退出k:终止进程M:按内存排序P:按CPU使用排序1:显示所有CPU核心
输出字段解析
顶部信息解析
bash
top - 10:30:45 up 2 days, 3:45, 2 users, load average: 0.15, 0.10, 0.05
Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.3 us, 1.2 sy, 0.0 ni, 93.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7856.4 total, 1024.2 free, 4096.0 used, 2736.2 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 3200.0 avail Mem- 第1行:系统运行时间、用户数、平均负载(1/5/15 分钟)
- 第2行:进程状态
- total:运行进程总数
- running:正在运行数
- sleeping:睡眠数
- stopped:停止数
- zombie:僵尸数
- 第3行:CPU 使用情况
- us (user):
- 用户空间进程占用 CPU 的百分比(非内核进程)。
- 高值表示应用程序(如 Python、Java、Nginx 等)正在消耗大量 CPU。
- sy(system):内核态
- 内核空间进程占用 CPU 的百分比。
- 高值可能说明系统调用频繁(如 I/O 操作、进程调度),或内核处理任务繁重(如网络、驱动)。
- ni(nice):优先级
- 低优先级(nice 值 > 0)用户进程占用的百分比。
- 通常接近 0,除非手动调整过进程优先级(如
nice或renice命令)。
- id(idle):空闲
- CPU 空闲时间的百分比。
- 值越高说明系统负载越轻。如果长期低于 70%,可能需关注性能瓶颈。
- wa (iowait):IO等待
- CPU 等待 I/O 完成的百分比(如磁盘、网络)。
- 高值(>5%)可能表示存储设备慢或 I/O 过载(检查磁盘使用率:
iostat -x 1)。
- hi(hardware interrupt):硬件中断占用
- 硬件中断占用的百分比(如键盘、网卡中断)。
- 通常很低,服务器上若突然增高可能硬件故障。
- si(software interrupt):软件中断占用
- 软件中断占用的百分比(如内核任务调度)。
- 高值可能因频繁的系统调用或网络包处理(如高流量场景)。
- st (steal):被 Hypervisor 偷走的 CPU 时间
- 虚拟化环境中被 Hypervisor 偷走的 CPU 时间。
- 高值(>10%)说明物理主机资源竞争激烈(常见于云服务器)。
- us (user):
- 第4行:物理内存使用情况
- total:总量
- free:空闲
- used:已用
- buff/cache:缓存
- 第5行:交换分区(Swap)使用情况
进程列表
bash
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 root 20 0 500000 80000 10000 R 10.5 1.0 5:30.01 firefox
5678 mysql 20 0 2000000 500000 20000 S 5.2 6.3 10:20.45 mysqld- PID:进程 ID
- USER:进程所属用户
- PR:优先级
- NI:
nice值(-20 最高,19 最低) - VIRT:虚拟内存使用量(KB)
- RES:物理内存使用量(KB)
- SHR:共享内存(KB)
- S:进程状态(R=运行, S=睡眠, Z=僵尸, D=不可中断)
- %CPU:CPU 占用率
- %MEM:内存占用率
- TIME+:累计 CPU 时间
- COMMAND:进程名(
c键可切换完整命令)
关键分析结论
- 当前 CPU 负载极低:93.5% 空闲,系统非常轻松。
- 无 I/O 瓶颈:
wa=0.0表示磁盘/网络无阻塞。 - 无虚拟化竞争:
st=0.0说明虚拟机未受宿主资源限制。 - 主要消耗在用户进程:
us=5.3%是主要活跃部分(如应用代码、服务)。
后续建议
- 如果
us长期偏高:- 使用
top -c或ps aux --sort=-%cpu定位高 CPU 进程。 - 分析是否需优化代码或扩容。
- 使用
- 如果
sy偏高:- 检查内核日志(
dmesg)或使用perf工具分析系统调用。
- 检查内核日志(
- 如果
wa突然增高:- 排查磁盘性能(
iostat -x)或数据库慢查询。
- 排查磁盘性能(
- 监控工具推荐:
- 实时监控:
glances、htop - 历史记录:
sar -u(需安装sysstat)
- 实时监控:
进程控制
启动进程
bash
command & # 后台运行
nohup command & # 退出终端后继续运行
nohup command > app.log 2>&1 & # 退出终端后继续运行并将输出日志重定向到日志文件中nohup- 全称 "no hang up"(不挂断)
- 作用:使进程忽略 SIGHUP 信号(终端关闭时发送的信号)
- 结果:即使你退出终端或 SSH 连接,进程也不会被终止
command -ucommand:执行命令-u:无缓冲选项(unbuffered)- 强制标准输出和标准错误流不使用缓冲
- 立即将输出写入日志文件,而不是等待缓冲区满
- 对于需要实时查看日志的脚本特别有用
> app.log- 标准输出重定向到 app.log 文件
>会覆盖文件,如果要用追加模式应使用>>
2>&1- 将标准错误(文件描述符2)重定向到标准输出(文件描述符1)
- 效果:错误信息也会写入 test.log 文件
- 注意:
&1表示文件描述符1,不是数字1
&- 将进程放入后台运行
- 立即返回终端控制权,可以继续输入其他命令
停止进程
bash
kill PID # 发送TERM信号(15)
kill -9 PID # 强制终止(KILL信号)
killall process_name # 终止所有同名进程
pkill pattern # 按模式终止进程进程优先级
bash
nice -n 10 command # 以较低优先级启动
renice 10 -p PID # 修改运行中进程的优先级