Linux进程管理
文章目录
进程基本概述
进程:已启动的可执行程序
/proc目录下数字为名的目录,代表进程,保存着目录的属性信息。每个进程的PID是唯一的(即使进程退出,其他进程也不会占用其PID)
进程的组成
- 已分配内存的地址空间
- 安全属性,包括所有权凭据和特权
- 程序代码的一个或多个执行行线程
- 进程状态
进程的产生
现有(父)进程复制自己的地址空间来创建一个新的(子)进程结构。每个新进程分配有一个唯一的PID,满足跟踪和安全之需。
进程分类
- 前台进程:与终端有关能够看到的进程,通过终端启动(也可把在前台启动的进程送往后台,以守护模式运行)
- 守护进程:daemon,与终端无关,在系统引导过程中启动的进程
linux进程状态
标志 | 内核定义的状态名称和描述 |
---|---|
R | TASK_RUNNING:进程正在CPU上执行,或者正在等待运行。处于运行中(或可运行)状态时,进程可能正在执行用户例程或内核例程(系统调用),或者已排队并就绪 |
S | TASK_INTERRUPTIBLE:进程处于睡眠状态且正在等待某一条件:硬件请求、系统资源访问或信号。当事件或信号满足该条件时,该进程将返回到运行中 |
D | TASK_UNINTERRUPTIBLE:此进程也在睡眠,但与S状态不同,不会响应传递的信号。仅在特定的条件下使用,其中进程中断可能会导致意外的设备状态 |
K | TASK_KILLABLE:进程处于睡眠状态,与不可中断的D状态相同,但有所修改,允许等待中的任务通过响应信号而被中断(彻底退出)。实用程序通常将可中断的进程显示为D状态 |
T | TASK_STOPPED:进程已被停止(暂停),通常是通过用户或其他进程发出的信号。进程可以通过另一信号返回到运行中状态,继续执行(恢复) |
T | TASK_TRACED:正在被调试的进程也会临时停止,并且共享同一个T状态标志 |
Z | EXIT_ZOMBIE:子进程在退出时向父进程发出信号。除进程身份(PID)之外的所有资源都已释放 |
X | EXIT_DEAD:当父进程清理(获取)剩余的子进程结构时,进程现在已彻底释放。此状态从不会在进程列出实用程序中看到 |
< | 高优先级进程 |
N | 低优先级进程 |
+ | 前台进程组中的进程 |
| | 多线程进程 |
s | 会话进程首进程 |
- 进程睡眠的原因
当一个执行中的进程需要加载额外的IO(输入输出)资源时,由于IO设备的速度太慢,所以进入睡眠状态,交出CPU给其他进程,以免浪费执行时间。
进程优先级(时间分片)
- 进程优先级范围:0-139,数字越小,优先级越高
- 0-99:实时优先级,内核调整
- 100-139:静态优先级,用户可控制
- 进程优先级高
- 获得更多CPU运行时间
- 更优先获得CPU运行机会
相对优先级
由于不是每种进程都与其他进程同样重要,可告知调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多数进程所使用的调度策略称为SCHED_OTHER(也称为SCHED_NORMAL),但还有一些其他策略可用于不同的目的。
由于并非所有进程都以同样的方式创建,可为采用SCHED_NORMAL策略运行的进程指定相对优先级。此优先级称为进程的nice值。一个进程可以有40种不同级别的nice值。
这些nice级别的范围是从-20到19。默认情况下,进程将继承其父进程的nice级别,通常为0
nice级别越高,表示优先级越低(该进程容易将其CPU使用量让给其他进程)
nice级别越低,表示优先级越高(该进程更加不倾向于让出CPU)
如果不存在资源争用(例如当活动进程数少于可用CPU核心数时),即使nice级别高的进程也将仍使用它们可使用的所有可用CPU资源。但当请求CPU时间的进程数超过可用核心数时,nice级别较高的进程将比nice级别较低的进程收到更少的CPU时间
nice级别与权限
为很占CPU资源的进程设置较低的nice级别可能会对同一系统上运行的其他进程的性能造成负面影响,所以仅允许root用户设置负nice级别以及降低现有进程的nice级别。
普通非特权用户仅允许设置正的nice级别。只能对现有进程提升nice级别,而不能降低nice级别。
进程优先级调整
renice NI PID 调整已启动进程的nice值
示例:
另一台设备正执行vi命令
[root@localhost ~]# ps -elf | grep vi
4 S root 745 1 0 80 0 - 24903 poll_s 18:14 ? 00:00:00 /usr/bin/VGAuthService -s
4 S root 1528 1467 0 80 0 - 31561 poll_s 18:36 pts/1 00:00:00 vi abc
0 S root 1531 1442 0 80 0 - 28169 pipe_w 18:36 pts/0 00:00:00 grep --color=auto vi
[root@localhost ~]# renice -1 1528
1528 (进程 ID) 旧优先级为 0,新优先级为 -1
[root@localhost ~]# ps -elf | grep vi
4 S root 745 1 0 80 0 - 24903 poll_s 18:14 ? 00:00:00 /usr/bin/VGAuthService -s
4 S root 1528 1467 0 79 -1 - 31561 poll_s 18:36 pts/1 00:00:00 vi abc
0 S root 1536 1442 0 80 0 - 28169 pipe_w 18:39 pts/0 00:00:00 grep --color=auto vi
nice -n NI COMMAND 在启动时指定nice值
示例:
[root@localhost 123]# nice -n -1 vi abc
[1]+ 已停止 nice -n -1 vi abc
(kill -9 PID/$(pidof COMMAND)强行终止进程)
进程管理命令
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中
ps 列出当前进程
- a 显示所有与终端有关的进程
- u 显示进程是由哪个用户启动的
- x 显示所有与终端无关的进程
示例:
[root@localhost 123]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 129120 6460 ? Ss 18:14 0:00 /usr/lib/systemd/systemd
root 2 0.0 0.0 0 0 ? S 18:14 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 18:14 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 18:14 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 18:14 0:00 [migration/0]
- -e 显示所有进程,与-A效果相同
- -l 以长格式显示
- -F 显示更详细的完整格式的进程信息
- -f 显示更详细的完整格式的进程信息
示例:
[root@localhost 123]# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 32280 ep_pol 18:14 ? 00:00:00 /usr/lib/syst
1 S root 2 0 0 80 0 - 0 kthrea 18:14 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 18:14 ? 00:00:00 [ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker 18:14 ? 00:00:00 [kworker/0:0H
1 S root 7 2 0 -40 - - 0 smpboo 18:14 ? 00:00:00 [migration/0]
1 S root 8 2 0 80 0 - 0 rcu_gp 18:14 ? 00:00:00 [rcu_bh]
1 R root 9 2 0 80 0 - 0 - 18:14 ? 00:00:00 [rcu_sched]
- -H 以进程层级格式显示进程相关信息
示例:
[root@localhost 123]# ps -elH
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd
1 S 0 3 2 0 80 0 - 0 smpboo ? 00:00:00 ksoftirqd/0
1 S 0 5 2 0 60 -20 - 0 worker ? 00:00:00 kworker/0:0H
1 S 0 7 2 0 -40 - - 0 smpboo ? 00:00:00 migration/0
1 S 0 8 2 0 80 0 - 0 rcu_gp ? 00:00:00 rcu_bh
1 R 0 9 2 0 80 0 - 0 - ? 00:00:00 rcu_sched
5 S 0 10 2 0 -40 - - 0 smpboo ? 00:00:00 watchdog/0
5 S 0 12 2 0 80 0 - 0 devtmp ? 00:00:00 kdevtmpfs
1 S 0 13 2 0 60 -20 - 0 rescue ? 00:00:00 netns
1 S 0 14 2 0 80 0 - 0 watchd ? 00:00:00 khungtaskd
1 S 0 15 2 0 60 -20 - 0 rescue ? 00:00:00 writeback
- -o 根据自己的需要选择要显示的字段
示例:
[root@localhost 123]# ps -o pid,ni
PID NI
1467 0
1602 0
1688 0
- aux结果:
- VSZ Virtual memory SiZe,虚拟内存集
- RSS ReSident Size,常驻内存集
- STAT 进程状态
- TIME 运行时的累积时长
- ps命令结果解析:
- NI nice值
- PRI 优先级
- PSR 进程运行在哪个CPU核心上
- RTPTRIO 实时优先级
- C 运行的CPU编号
- STIME 进程的启动时间
- VSZ Virtual memory SiZe,虚拟内存集
- RSS ReSident Size,常驻内存集
- STAT 进程状态
- TIME 运行时的累积时长
pstrss 显示当前系统上的进程树
示例:
[root@localhost 123]# pstree
systemd─┬─NetworkManager─┬─dhclient
│ └─2*[{NetworkManager}]
├─VGAuthService
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─login───bash
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rhnsd
├─rhsmcertd
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash───vi
│ └─sshd───bash─┬─pstree
│ └─vi
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───{vmtoolsd}
pgrep 只显示进程号
示例:
[root@localhost 123]# pgrep vi
745
1602
1619
pidof 根据进程名查找其PID
示例:
[root@localhost 123]# pidof vi
1619 1602
vmstat 虚拟内存状态查看命令
- 语法:vmstat a n 每a秒刷新n次
示例:
[root@localhost 123]# vmstat 2 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1479388 3008 226484 0 0 28 2 56 57 0 0 100 0 0
0 0 0 1479372 3008 226516 0 0 0 0 46 40 0 0 100 0 0
0 0 0 1479372 3008 226516 0 0 0 0 39 34 0 0 100 0 0
- -s 显示内存的统计数据
示例:
[root@localhost 123]# vmstat -s
1867024 K total memory
158112 K used memory
128328 K active memory
124720 K inactive memory
1479388 K free memory
3008 K buffer memory
226516 K swap cache
2097148 K total swap
0 K used swap
2097148 K free swap
405 non-nice user cpu ticks
0 nice user cpu ticks
1262 system cpu ticks
682511 idle cpu ticks
5 IO-wait cpu ticks
0 IRQ cpu ticks
44 softirq cpu ticks
0 stolen cpu ticks
182485 pages paged in
11068 pages paged out
0 pages swapped in
0 pages swapped out
376612 interrupts
386632 CPU context switches
1569233664 boot time
1941 forks
- procs:
- r(running) 表示等待运行的队列长度,也即等待运行的进程的个数
- b(block) 表示阻塞队列长度,也即处于不可中断睡眠态的进程个数
- memory:
- swpd 交换内存的使用总量
- free 空闲物理内存总量
- buffer 用于buffer的内存总量
- cache 用于cache的内存总量
- swap:
- si(swap in) 表示从物理内存有多少页面换进swap,也即数据进入swap的数据速率(kb/s)
- so(swap out) 表示从swap有多少页面换进物理内存,也即数据离开swap的数据速率(kb/s)
- io:
- bi(block in) 表示磁盘块有多少个被调入内存中,也即从块设备读入数据到系统的速率(kb/s)
- bo(block out) 表示有多少个磁盘块从内存中被同步到硬盘上去了,也即保存数据至块设备的速率(kb/s)
- system:
- in( interrupts) 表示中断的个数,也即中断速率(kb/s)
- cs(context switch) 表示上下文切换的次数,也即进程切换速率(kb/s)
- CPU:
- us 表示用户空间
- sy 表示内核空间
- id 表示空闲百分比
- wa 表示等待IO完成所占据的时间百分比
- st 表示steal,被虚拟化技术偷走的时间(比如运行虚拟机)