个人用云计算学习笔记 --3(Linux 进程管理、 监控系统负载)
文章目录
Linux 进程管理(12. Linux 进程管理)
进程介绍
进程由以下组成部分:
- 已分配内存的地址空间
- 安全属性,包括所有权凭据和特权
- 程序代码的一个或多个执行线程
- 进程状态
进程的环境包括:
- 本地和全局变量
- 当前调度上下文
- 分配的系统资源,如文件描述符和网络端口
进程产生-fork
fork() 是一个核心的系统调用(由 C 语言等底层语言调用),用于创建新进程
fork() 的核心作用
- 从已存在的进程(父进程)复制出一个新进程(子进程);
- 子进程几乎是父进程的完全副本(包括代码、数据、文件描述符等);
- 父进程和子进程独立运行,拥有各自的进程 ID(PID)。
进程状态
基本状态(单字母标识)
| 状态标识 | 英文全称 | 含义说明 |
|---|---|---|
R | Running | 运行中:进程正在 CPU 上运行,或处于就绪状态(等待 CPU 调度)。 |
S | Sleeping | 可中断睡眠:进程因等待事件(如 I/O 完成、信号)而暂停,可被信号唤醒。 |
D | Disk Sleep | 不可中断睡眠:进程正在等待磁盘 I/O 等关键操作,不能被信号唤醒(确保数据一致性),通常短暂出现。 |
Z | Zombie | 僵尸进程:进程已终止,但父进程未回收其资源(PID 等),需父进程处理或重启父进程清除。 |
T | Stopped | 暂停状态:进程被 SIGSTOP 或 SIGTSTP 信号暂停(如 Ctrl+Z 操作),可通过 SIGCONT 信号恢复。 |
X | Dead | 死亡状态:进程已彻底终止,瞬间出现,通常看不到。 |
附加状态(与基本状态组合)
| 附加标识 | 含义说明 |
|---|---|
< | 高优先级进程(nice 值为负,如 -20,优先级高于普通进程)。 |
N | 低优先级进程(nice 值为正,如 19,优先级低于普通进程)。 |
L | 进程有页面被锁定在内存中(如实时进程,不允许被换出到 Swap)。 |
s | 会话领导者(如 Shell 进程,管理该会话下的其他进程)。 |
l | 多线程进程(使用 clone() 创建的线程化进程)。 |
+ | 前台进程组中的进程(与终端交互,如直接在终端运行的 ls 命令)。 |
| | | 多线程进程(部分系统中表示,与 l 类似)。 |
常见组合状态示例
S+:前台运行的可中断睡眠进程(如等待用户输入的vim)。Rl:正在运行的多线程进程(如 Java 应用)。Z+:前台僵尸进程(父进程未回收)。Tl:暂停的多线程进程(如被Ctrl+Z暂停的python程序)。D:正在进行磁盘 I/O 的不可中断睡眠进程(如读取大文件的cp命令)。
查看进程-ps
**作用:**查看系统中进程信息。
默认输出当前终端中由当前用户启动的进程,包含 4 列:
PID:进程 IDTTY:关联的终端设备TIME:进程累计占用的 CPU 时间CMD:启动进程的命令
示例输出:
PID TTY TIME CMD
1234 pts/0 00:00:01 bash
5678 pts/0 00:00:05 python
常用参数组合
ps aux(查看所有用户的所有进程)
a:显示所有用户的进程(含其他用户)u:以用户为中心的详细格式(含用户、CPU / 内存占用)x:显示无终端关联的进程(如后台服务)
ps -ef:查看进程父子关系(系统风格)
-e:显示所有进程(等价于ax)-f:全格式输出(含父进程 IDPPID、启动时间等)
按条件筛选进程
ps -p (按 PID 查看)
ps -u (按用户查看)
ps -C(按进程名查看)
ps -t(按终端查看)
ps -o(自定义输出字段)
# 显示 PID、用户、CPU 占比、命令名
ps axo pid,user,%cpu,comm
# 显示 PID、父进程 PPID、进程状态 STAT、完整命令
ps -eo pid,ppid,stat,cmd
常用字段:pid(进程 ID)、ppid(父进程 ID)、user(用户)、%cpu、%mem、stat(状态)、comm(命令名)、cmd(完整命令)。
ps --sort(排序进程)
# 按 CPU 使用率降序排序(%cpu 前加 - 表示降序)
ps aux --sort=-%cpu
# 按内存使用率降序排序
ps aux --sort=-%mem
# 取前 10 个最耗 CPU 的进程
ps aux --sort=-%cpu | head -n 10
控制 jobs
前台进程和后台进程
作业控制允许单个shell实例运行和管理多个命令。
- 前台进程,一个终端中只有一个前台进程,该进程可以终端窗口中读取输入和响应键盘生成的信号。
- 后台进程,在后台运行的进程,该进程不能从终端读取输入或接收键盘产生的中断。后台进程可能暂停,也可能正在运行。如果正在运行的后台作业尝试从终端读取,它将自动暂停。在ps列表中,tty终端列显示的是?号,那么该进程肯定是后台进程,但并代表显示为其他终端的进程就不是后台进程。

交互式进程无法在后台运行,如passwd
nohup(不挂断)
主要作用是让进程在终端关闭或网络断开后继续运行,避免因 SIGHUP 信号(终端挂断信号)导致进程终止。
nohup [需要执行的命令] &
nohup:核心命令,让后续进程忽略SIGHUP信号&:将进程放入后台运行(终端可继续输入其他命令)
给进程发信号
信号介绍
signal 是传递给进程的软中断。
生成信号的事件可以是错误,外部事件或者使用信号发送命令或键盘序列。
核心信号
| 信号编号 | 信号名 | 含义与触发场景 | 默认行为 | 常用场景示例 |
|---|---|---|---|---|
| 1 | SIGHUP | 终端挂断(如关闭 SSH 连接、终端退出) | 终止进程(部分服务会重启) | kill -HUP 进程ID:让服务重读配置文件 |
| 2 | SIGINT | 键盘中断(用户按 Ctrl+C) | 终止进程 | 强制停止前台运行的程序 |
| 3 | SIGQUIT | 键盘退出(用户按 Ctrl+\) | 终止进程并生成核心转储文件 | 调试时强制进程退出并保留现场 |
| 9 | SIGKILL | 强制终止(“必杀信号”) | 立即终止进程(不可捕获 / 忽略) | kill -9 进程ID:强制杀死无响应进程 |
| 15 | SIGTERM | 终止请求(默认 kill 命令发送的信号) | 终止进程(可捕获 / 忽略) | kill 进程ID:优雅终止进程(允许清理资源) |
| 18 | SIGCONT | 继续进程(与 SIGSTOP 配合) | 恢复被暂停的进程 | kill -CONT 进程ID:恢复暂停的进程 |
| 19 | SIGSTOP | 暂停进程(“必停信号”) | 暂停进程(不可捕获 / 忽略) | 临时冻结进程执行 |
| 20 | SIGTSTP | 终端暂停(用户按 Ctrl+Z) | 暂停进程(可捕获 / 忽略) | 将前台进程放入后台暂停 |
全部信号
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
kill
作用:给进程发信号。
kill [选项] <信号> <进程ID>
# 或省略信号(默认发送 SIGTERM 信号)
kill <进程ID>
补充
tail -f :用于实时跟踪文件的新增内容,特别适合监控日志文件的动态输出。
pkill 和 pgrep 命令
作用:给多个进程发信号。
pkill(结合了 pgrep(查找进程)和 kill(发送信号)的功能)
pkill [选项] <进程名/模式>
默认发送 SIGTERM (15),允许进程清理资源;若需强制终止,用 -9(SIGKILL),但可能导致数据丢失。
pgrep(根据进程名或属性查找进程 ID)
pgrep [选项] <进程名/模式>
-u选项指定用户-f选项可匹配完整命令行(包括启动参数-n:只显示最新(最近启动)的进程 PID-o:只显示最旧(最早启动)的进程 PID-c:统计匹配进程的数量(不显示具体 PID)
补充
kill和pkill的区别:
| 特性 | kill 命令 | pkill 命令 |
|---|---|---|
| 目标指定 | 必须通过进程 ID(PID) 操作 | 直接通过进程名(或属性) 操作 |
| 本质 | 仅负责向指定 PID 发送信号 | 结合了 “查找进程” 和 “发送信号”(内部先通过名称找到 PID,再发送信号) |
| 灵活性 | 只能操作单个或多个明确的 PID | 支持批量匹配(模糊匹配、正则、用户筛选等) |
last
典型输出格式如下:
root pts/0 192.168.1.100 Wed Sep 11 09:30:00 2024 still logged in
user1 pts/1 10.0.0.5 Tue Sep 10 18:20:15 2024 - Tue Sep 10 22:35:42 2024 (04:15)
reboot system boot 5.4.0-150-generic Wed Sep 11 09:25:00 2024 - Wed Sep 11 10:45:30 2024 (01:20)
root pts/0 192.168.1.100 Mon Sep 9 14:10:30 2024 - Mon Sep 9 16:45:12 2024 (02:34)
各字段含义:
- 用户名:登录的用户(
reboot表示系统重启,shutdown表示关机); - 终端 / 设备
pts/0、pts/1:远程登录(如 SSH)的虚拟终端;tty1、tty2:本地物理终端;
- 来源 IP / 主机:远程登录的 IP 地址(本地登录显示
:0或不显示); - 登录时间:
Wed Sep 11 09:30:00 2024; - 状态 / 注销时间
still logged in:仍在登录中;Tue Sep 10 22:35:42 2024:注销时间;- 括号内
(04:15):登录持续时间。
last -x # 除登录记录外,还显示 shutdown、runlevel 等系统事件
last root # 只显示用户 root 的登录历史
last -n 5 # 只显示最近 5 条登录记录
last reboot # 等价于 last -x reboot,查看所有重启记录
last -d 3 # 显示最近 3 天的登录记录
last -f /var/log/wtmp.1 # 查看归档的日志文件(如前一天的记录)
案例:kill 不掉的进程
思路:
找到该进程的父进程并kill掉
用ps axf|grep指令查询该进程的父进程。
僵尸进程
僵尸进程介绍
如果一个进程退出了,立马X状态,作为父进程没有机会拿到子进程的退出结果。所以在Linux中,一般进程不会立即退出,而是要维持一个状态叫做Z,也叫做僵尸状态,方便后续父进程读取该子进程的退出结果。
僵尸状态会以终止状态保持在进程列表中,并且会一直等待父进程读取退出状态码。所以只要子进程退出,父进程还在运行,但是父进程没有读取子进程状态,子进程就进入Z状态。
僵尸进程危害
进程的退出状态必须被维持下去,因为它要告诉它的父进程,你交给我的任务,我办的怎么样了,可是父进程一直不读取,那么进程就处于Z状态。
维护退出状态本身就是使用数据维护,属于进程的基本信息,所以要保存在tast_struct(PCB)中,Z状态一直不退出,PCB就需要一直维护。
那么,一个父进程创建了很多子进程,但是不回收,就会造成资源的浪费,因为数据结构对象本身就要占用内存,就比如C语言中定义一个结构体变量,就需要在内存的某个位置进行开辟空间。
太多的僵尸进程会造成PID资源浪费,无法创建新的进程,因为一个操作系统的进程总数是有上限。
孤儿进程
孤儿进程介绍
父进程如果提前退出,子进程后退出,子进程就称为孤儿进程。子进程退出后处于Z状态,系统如何处理?
此时,子进程被1号进程systemd领养,由systemd回收。
孤儿进程危害
**虽然孤儿进程由systemd直接管理了,但如果仍然不停产生新的孤儿进程则会导致占用过多系统资源。**需要开发人员检查代码,避免这个问题。如果孤儿进程没有实际意义,则可以通过kill或pkill终止。
监控系统负载(13.监控系统负载)
系统负载介绍
系统负载平均值:Linux内核以活动请求数的指数移动平均值来表示。
- 活动请求数不仅包含运行中进程,还包含等待IO的进程,对应于R和D。等待IO包括处于睡眠等待预期磁盘和网络响应的任务。
- 指数移动平均值是一个数学公式,可以平滑趋势数据的高值和低值,更加准确地表示一段时间内系统负载,并确定系统负载是随着时间增加还是减少。
- 根据所有CPU活动请求数,每5秒计算一次Load Average。通过汇总这些值,可以得到最近1分钟,5分钟和15分钟内的指数移动平均值。
- 一些UNIX系统仅考虑CPU使用率或运行队列长度。Linux中负载平均值中还包含了对IO的考量,遇到负载平均值很高但CPU活动很低时,检查磁盘和网络活动。
- Linux将各个物理CPU核心和微处理器超线程计为独立执行单元。每个独立的执行单元拥有独立的请求队列。
查看系统负载
# 查看CPU
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2 # cpu数量为2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 1
socket: 2
NUMA 节点: 1
厂商 ID: GenuineIntel
CPU 系列: 6
型号: 94
型号名称: Intel(R) Core(TM) i5-6300HQ CPU @ 2.30GHz
步进: 3
CPU MHz: 2304.001
BogoMIPS: 4608.00
$ uptime
13:47:10 up 5:01, 2 users, load average: 0.00, 0.01, 0.05
负载解读
示例:4核心的CPU
-
负载为: 2.92 4.48 5.20
-
每个cpu负载为:0.73(2.92/4) 1.12(4.48/4) 1.30(5.20/4)
比较理想的值为 75% 左右。
top 命令
作用:动态查看进程信息,包括不同状态任务数量,CPU消耗和内存消耗。

top命令快捷键
一、基本操作与退出
q:退出top命令(最常用)。h或?:显示帮助信息(列出所有快捷键说明)。Ctrl + L:刷新屏幕(清除冗余输出)。
二、排序相关(按资源使用率排序)
top 默认按 CPU 使用率降序排列,可通过以下键切换排序字段:
P:按 CPU 使用率 排序(默认,大写 P)。M:按 内存使用率 排序(大写 M)。N:按 进程 ID(PID) 排序(大写 N)。T:按 累计运行时间(TIME+) 排序(大写 T)。I:切换是否显示 闲置进程(大写 I,再次按恢复显示)。R:反向排序(当前排序顺序反转,如从降序→升序)。
三、显示内容控制(切换列或模式)
u:按 用户名筛选(输入用户名后,仅显示该用户的进程)。k:终止指定进程(输入 PID 后,按提示选择信号,默认 15/SIGTERM,输入 9 强制终止)。f或F:进入 字段管理界面(自定义显示哪些列,如是否显示内存、CPU 核数等,按上下键选择,按空格键切换显示状态,按q返回)。o或O:进入 排序字段选择界面(更直观地选择排序依据,按字母选择对应字段)。c:切换是否显示 完整命令行(默认显示进程名,按c显示启动命令及参数,再次按恢复)。V:按 进程树结构 显示(父进程在下,子进程缩进,直观展示进程关系)。H:切换是否显示 线程(大写 H,显示线程时,进程名后会带[线程名])。x:高亮显示 当前排序列(方便识别按哪列排序)。b:切换 加粗显示(突出显示当前排序列或运行中的进程)。
四、系统信息与刷新控制
1:显示 每个 CPU 核心的使用率(多核心系统中常用,再次按恢复总览)。s:调整 刷新间隔时间(输入秒数,默认 3 秒,如输入 5 表示每 5 秒刷新一次)。l:切换是否显示 负载信息行(顶部的系统时间、负载均值等,大写 L)。t:切换是否显示 CPU 状态行(顶部的 CPU 使用率明细,大写 T)。m:切换是否显示 内存状态行(顶部的内存 / 交换分区使用情况,大写 M)
五、实用技巧
- 进入
top后,按P快速定位 CPU 占用最高的进程,按M定位内存占用最高的进程。 - 按
u输入root可仅查看 root 用户的进程,便于排查系统级进程问题。 - 按
f自定义显示列时,推荐勾选PPID(父进程 ID)、USER(用户)、%MEM(内存占比)等关键信息。
stress 工具
Linux 中的 stress 工具用于对系统进行压力测试,可模拟 CPU、内存、I/O 和磁盘等资源的高负载状态。通过指定参数(如 -c 压 CPU、-m 压内存)可创建负载,帮助发现系统在压力下的稳定性问题,常用于性能调优或硬件验证。
# 安装
# yum install -y stress
压力测试-CPU
# stress -c 2
压力测试-内存
# 消耗前内存
# free -m
# 消耗 1G 内存
# stress -m 1 --vm-bytes 1G
# 消耗后内存
# free -m
free 命令是 Linux 系统中用于查看内存使用状态的常用工具,能实时显示系统的物理内存(RAM)、交换内存(Swap)的总容量、已使用量、空闲量等信息,帮助判断系统内存是否充足。
total used free shared buff/cache available
Mem: 8192000 2048000 3072000 512000 3072000 5632000
Swap: 2097152 0 2097152
输出字段解读
| 字段 | 含义说明 |
|---|---|
total | 总容量:物理内存(或交换分区)的总大小(系统可使用的内存总量)。 |
used | 已使用:被进程直接占用的内存(不包括缓存和缓冲区)。 |
free | 完全空闲:未被任何进程使用的内存(真正 “空闲” 的部分)。 |
shared | 共享内存:被多个进程共享的内存(如 tmpfs 等,通常数值较小)。 |
buff/cache | 缓存与缓冲区: - buffer(缓冲区):用于存储即将写入磁盘的数据; - cache(缓存):用于存储从磁盘读取的数据,可被快速复用。 |
available | 可用内存:系统可立即分配给新进程的内存(包括 free + 可回收的 buff/cache),是判断内存是否充足的关键指11 |
压力测试-磁盘
# 消耗磁盘IO
# stress -d 1 --hdd-bytes 2G
# 监视活动状态百分比,%util
# sar -dp 1
网络测试
# 传送一个大size的文件
# wget http://192.168.43.100/isos/CentOS-7-x86_64-DVD-2207-02.iso
# 监控带宽
# sar -n DEV 1
sar命令
sar [选项] [时间间隔] [次数]
sar(System Activity Reporter)是 Linux 系统中一款功能强大的系统活动监控工具,主要用于收集、报告和保存系统的各项性能指标(如 CPU、内存、磁盘 I/O、网络等),支持实时监控和历史数据查询,是系统性能分析和问题排查的重要工具。
一、sar 的核心作用
- 全面监控系统资源:实时或定期采集 CPU、内存、磁盘、网络、进程等资源的使用情况。
- 记录历史性能数据:默认将数据保存到日志文件(如
/var/log/sa/saXX,XX 为日期),便于回溯分析。 - 生成性能报告:通过不同参数生成针对性报告,支持按时间粒度(秒、分、时、天)查看。
输出示例(关键字段):
14:30:00 CPU %user %nice %system %iowait %steal %idle
14:30:05 all 5.20 0.00 2.10 0.50 0.00 92.20
14:30:10 all 4.80 0.00 1.90 0.30 0.00 93.00
14:30:15 all 6.10 0.00 2.30 0.40 0.00 91.20
监控总结
以下是针对 Linux 系统监控的几条实用建议,涵盖关键监控维度和最佳实践:
- 核心指标实时监控
重点跟踪 CPU 使用率(用户态 / 系统态占比)、内存占用(含缓存 /swap 使用率)、磁盘 I/O(读写吞吐量、IOPS)和网络流量(带宽利用率、连接数)。可通过top/htop(实时)、vmstat/iostat(系统级)等工具快速查看。 - 部署专业监控工具
对于服务器集群或长期监控需求,建议使用 Prometheus + Grafana(可视化强)、Zabbix(全功能监控)或 Nagios(轻量告警)等工具,实现指标集中收集、趋势分析和历史数据查询。 - 设置关键阈值告警
针对核心指标配置告警阈值(如 CPU 持续 5 分钟超 80%、磁盘空间不足 10%),通过邮件、短信或即时通讯工具推送告警,避免故障扩大。注意避免告警风暴(可设置告警合并或延迟)。 - 监控进程与服务状态
定期检查关键服务(如 Nginx、MySQL)的运行状态、进程数及资源消耗,可通过systemctl status或自定义脚本实现。对异常退出的进程,结合日志排查崩溃原因。 - 日志集中管理与分析
将系统日志(/var/log/messages)、应用日志集中存储(如使用 ELK 栈),关注错误信息(ERROR级别)、登录异常(/var/log/auth.log)和磁盘错误(dmesg | grep error),必要时配置日志告警规则。 - 磁盘健康监控
除空间使用率外,需关注磁盘坏块(smartctl工具检测 S.M.A.R.T 信息)和文件系统完整性(定期运行fsck,非挂载状态下),避免硬件故障导致数据丢失。 - 网络与安全监控
监控端口开放状态(netstat/ss)、异常连接(尤其是外部 IP 的高频访问)和防火墙规则生效情况。可结合tcpdump抓包分析可疑流量。 - 定期性能基线分析
记录系统正常运行时的指标基线(如平均负载、内存使用峰值),当指标偏离基线时及时排查,避免微小异常累积成故障。 - 自动化监控脚本
对个性化需求(如特定目录文件数、应用响应时间),编写 Shell 或 Python 脚本定期执行检查,输出结果至监控系统或直接触发告警。 - 监控权限与安全
限制监控工具的权限(如仅授予读取日志和指标的权限),加密传输监控数据,防止监控系统本身成为安全薄弱点。
通过分层监控(基础指标→服务状态→业务性能)和主动预警,可显著提升系统稳定性和故障响应效率。
grep error``),必要时配置日志告警规则。
6. 磁盘健康监控
除空间使用率外,需关注磁盘坏块(smartctl 工具检测 S.M.A.R.T 信息)和文件系统完整性(定期运行 fsck,非挂载状态下),避免硬件故障导致数据丢失。
7. 网络与安全监控
监控端口开放状态(netstat/ss)、异常连接(尤其是外部 IP 的高频访问)和防火墙规则生效情况。可结合 tcpdump 抓包分析可疑流量。 tcpdump 抓包分析可疑流量。
8. 定期性能基线分析
记录系统正常运行时的指标基线(如平均负载、内存使用峰值),当指标偏离基线时及时排查,避免微小异常累积成故障。
9. 自动化监控脚本
对个性化需求(如特定目录文件数、应用响应时间),编写 Shell 或 Python 脚本定期执行检查,输出结果至监控系统或直接触发告警。
10. 监控权限与安全
限制监控工具的权限(如仅授予读取日志和指标的权限),加密传输监控数据,防止监控系统本身成为安全薄弱点。
通过分层监控(基础指标→服务状态→业务性能)和主动预警,可显著提升系统稳定性和故障响应效率。
更多推荐



所有评论(0)