[TOC]
1. 进程简介
1.1 什么是进程
进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。
1.2 进程管理的作用
- 判断服务器健康状态:运维工程师最主要的工作就是保证服务器安全稳定的运行。理想的状态是,在服务器出现问题,但是还没有造成服务器宕机或停止服务时,就人为干预解决了问题。进程管理最主要的工作就是判断服务器当前是否健康,是否需要人为干预。如果服务器的cpu占用率、内存专用率过高,就需要人为介入解决问题了。一般健康服务器的负载最高为内存不超过70%,CPU不超过90%。
- 查看系统中所有的进程:我们需要查看系统中所有正在运行的进程,通过这些进程可以判断系统中运行了哪些服务,是否有非法服务运行。
- 杀死进程:这是进程管理中最不常用的手段,当我们需要停止服务时,会通过正确关闭命令来停止服务(如apache服务可以通过systemctl stop httpd来关闭)。只有当正确终止进程的手段失效的情况下,才会考虑使用kill命令杀死进程。
2. 进程管理命令
2.1 ps命令
ps命令是用来静态显示系统中进程的命令。
2.1.1 ps aux
查看系统中所有进程,使用BSD操作系统格式。
示例:
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 193756 6508 ? Ss 12:53 0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 12:53 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 12:53 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 12:53 0:02 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 12:53 0:00 [migration/0]
...
输出字段介绍:
- USER:该进程是由哪个用户产生的
- PID:进程的ID号
- %CPU:该进程占用CPU资源的百分比
- %MEN:该进程占用物理内存的百分比
- VSZ:该进程占用虚拟内存的大小,单位KB
- RSS:该进程占用实际物理内存的大小,单位KB
- TTY:该进程是在哪个终端中运行的。tty1-tty7代表本地终端控制台终端。pts/0-255代表虚拟终端,一般是远程连接的终端。?一般代表属于系统调用。
- STAT:进程状态。常见的状态有:
* D:不可被唤醒的睡眠状态
* R:该正常正在运行
* S:该进程在睡眠状态,可被唤醒
* T:停止状态,可能是在后台暂停或进程在除错状态
* X:死掉的进程
* Z:僵尸进程。进程已经终止,但是部分程序还在内存当中
* <:高优先级
* N:低优先级
* L:被锁入内存
* s:包含子进程
* l:多线程(小写L)
* +:位于后台
- START:该进程的启动时间
- TIME:该进程占用CPU的运算时间
- COMMAND:产生此进程的命令名
2.1.2 ps -ef
查看系统中所有进程,使用System V风格显示。
示例:
[root@localhost ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 12:53 ? 00:00:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 12:53 ? 00:00:00 [kthreadd]
root 4 2 0 12:53 ? 00:00:00 [kworker/0:0H]
root 6 2 0 12:53 ? 00:00:02 [ksoftirqd/0]
root 7 2 0 12:53 ? 00:00:00 [migration/0]
root 8 2 0 12:53 ? 00:00:00 [rcu_bh]
root 9 2 0 12:53 ? 00:00:02 [rcu_sched]
root 10 2 0 12:53 ? 00:00:00 [lru-add-drain]
...
输出字段介绍:
- UID:该进程是由哪个用户产生的
- PID:进程的ID号
- PPID:父进程的ID号
- C:该进程占用CPU资源的百分比
- STIME:该进程的启动时间
- TTY:该进程是在哪个终端中运行的
- TIME:该进程占用CPU的运算时间
- CMD:产生此进程的命令名
2.1.3 pa aux和ps -ef的对比
两者的输出结果差别不大,但展示风格不同。aux是BSD风格,-ef是System V风格。
2.2 top命令
top命令经常用来动态地、交互地显示系统中进程地信息。该命令输出内容是动态的,默认每3s刷新一次。
2.2.1 显示信息详解
该命令的输出主要分为两部分:第一部分是前五行,显示的是整个系统的资源使用状况。第二步分从第六行开始,显示的是系统中进程的信息。
[root@localhost ~]# top
top - 21:07:57 up 8:14, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 128 total, 1 running, 127 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3861372 total, 272912 free, 771620 used, 2816840 buff/cache
KiB Swap: 3145724 total, 3144416 free, 1308 used. 2814904 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
27187 root 20 0 161992 2116 1516 R 6.2 0.1 0:00.01 top
1 root 20 0 193756 6508 3752 S 0.0 0.2 0:04.13 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:02.34 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.37 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
...
2.2.1.1 系统总体资源介绍
第一行信息为任务队列信息,具体内容如下表所示:
内容 | 说明 |
---|---|
21:07:57 | 系统当前时间 |
8:14 | 系统的运行时间,本机已经运行8小时14分 |
3 users | 当前登录了三个用户 |
load average: 0.00, 0.01, 0.05 | 系统在过去1分钟,5分钟,15分钟的平均负载。 |
面试题:load average值含义是什么?其值和什么有关?是否可以根据该值判断CPU的负载。
查看cpu核数的命令:cat /proc/cpuinfo |grep "cpu core"|wc -l
如果CPU是单核,则这个数超过1,就是高负载。
如果CPU是四核,则这个数超过4,就是高负载。
一般认为不应该超过服务器CPU的核数。
第二行为进程信息,具体内容如下表所示:
内容 | 说明 |
---|---|
128 total | 系统中的进程总数 |
1 running | 正在运行的进程数 |
127 sleeping | 睡眠的进程数 |
0 stopped | 正在停止的进程数 |
0 zombie | 僵尸进程。如果不是0,需要手动检查僵尸进程 |
第三行为CPU信息,具体内容如下表所示:==按下t键可进行可视化显示==
内容 | 说明 |
---|---|
0.0 us | 用户模式占用的CPU百分比 |
0.0 sy | 系统模式占用的CPU百分比 |
0.0 ni | 改变优先级的用户进程占用的CPU百分比 |
100.0 id | 空闲CPU的CPU百分比 |
0.0 wa | 等待输入/输出的进程的占用CPU百分比 |
0.0 hi | 硬中断请求服务占用的CPU百分比 |
0.0 si | 软中断请求服务占用的CPU百分比 |
0.0 st | st(Steal time) 虚拟时间百分比。就是当有虚拟机时,虚拟CPU等待实际CPU的时间百分比 |
第四行为物理内存信息。 ==按下m键可进行可视化显示==
第五行为交换分区(swap)信息。 ==按下m键可进行可视化显示==
2.2.1.1 进程字段介绍
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
27187 root 20 0 161992 2116 1516 R 6.2 0.1 0:00.01 top
1 root 20 0 193756 6508 3752 S 0.0 0.2 0:04.13 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:02.34 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.37 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
...
进程字段信息和ps命令的输出类似,这里也列出来,top进程信息默认是按CPU占比从高到低进行排序的。
- PID:进程ID
- USER:该进程所属的用户
- PR:优先级,数值越小优先级越高
- NI:优先级,数值越小优先级越高
- VIRT:该进程使用的虚拟内存的大小,单位KB
- RES:该进程使用的物理内存的大小,单位KB
- SHR:共享内存大小,单位KB
- S:进程状态
- %CPU:该进程占用CPU的百分比
- %MEM:该进程总共占用内存的百分比
- TIME+:该进程总共占用的CPU时间
- COMMAND:进程的命令名
2.2.2 交互式详解
- 按h或?查看帮助信息:
Help for Interactive Commands - procps-ng version 3.3.10
Window 1:Def: Cumulative mode Off. System: Delay 3.0 secs; Secure mode Off.
Z,B,E,e Global: 'Z' colors; 'B' bold; 'E'/'e' summary/task memory scale
l,t,m Toggle Summary: 'l' load avg; 't' task/cpu stats; 'm' memory info
0,1,2,3,I Toggle: '0' zeros; '1/2/3' cpus or numa node views; 'I' Irix mode
f,F,X Fields: 'f'/'F' add/remove/order/sort; 'X' increase fixed-width
L,&,<,> . Locate: 'L'/'&' find/again; Move sort column: '<'/'>' left/right
R,H,V,J . Toggle: 'R' Sort; 'H' Threads; 'V' Forest view; 'J' Num justify
c,i,S,j . Toggle: 'c' Cmd name/line; 'i' Idle; 'S' Time; 'j' Str justify
x,y . Toggle highlights: 'x' sort field; 'y' running tasks
z,b . Toggle: 'z' color/mono; 'b' bold/reverse (only if 'x' or 'y')
u,U,o,O . Filter by: 'u'/'U' effective/any user; 'o'/'O' other criteria
n,#,^O . Set: 'n'/'#' max tasks displayed; Show: Ctrl+'O' other filter(s)
C,... . Toggle scroll coordinates msg for: up,down,left,right,home,end
k,r Manipulate tasks: 'k' kill; 'r' renice
d or s Set update interval
W,Y Write configuration file 'W'; Inspect other output 'Y'
q Quit
( commands shown with '.' require a visible task display window )
Press 'h' or '?' for help with Windows,
Type 'q' or to continue
这里稍微介绍几个:
- E:更改top界面系统总体资源信息内存单位(KB、MB、GB、TB、PB)
- e:更改进程信息内存单位(KB、MB、GB、TB、PB)
- 小写l:切换负载显示风格
- t:切换cpu显示风格
- m:切换内存显示风格
- 数字1:显示所有cpu情况
- f:进行字段选择页面,添加要显示的列属性
- x:高亮显示根据哪一列熟悉进行排序
- y:高亮显示正在运行的进程
- >:修改排序的字段(默认根据CPU)
面试题:发现某个进程CPU使用率非常高,如何使用top命令该进程的线程情况?
先使用top命令或者ps命令查看该进程的进程号PID,然后使用:
top -Hp PID
即可显示该进程的所有线程运行信息。
-H 显示线程信息,-p指定pid
2.2.3 常用技巧
2.2.3.1 将top页面信息输出到文件
如果在操作终端执行top命令,并不能看到系统中所有的进程(虽然按↑↓键可以移动看,但是也不方便),默认看到的只是CPU占比靠前的进程。如果想看所有的进程信息,可以把top命令的结果重定向到文件即可:
top -b -n 1 > top.log
参数解释:
-b:将信息输出到文件
-n 1:将一次刷新的结果输出到文件
2.2.3.2 使用top查看线程信息
top -Hp PID
-H 显示线程信息,-p指定pid
2.3 pstree命令
centos7上默认没有安装psmisc包,即没有pstree命令。
安装psmisc包:
yum -y install psmisc
命令:
pstree [options]
-p: 显示进程的PID
示例:
[root@localhost ~]# pstree -p
systemd(1)─┬─VGAuthService(834)
├─auditd(798)───{auditd}(799)
├─chronyd(25564)
├─crond(841)
├─dbus-daemon(826)───{dbus-daemon}(831)
├─dnsmasq(23027)───dnsmasq(23028)
├─irqbalance(832)
├─libvirtd(24309)─┬─{libvirtd}(24310)
│ ├─{libvirtd}(24311)
│ ├─{libvirtd}(24312)
│ ├─{libvirtd}(24313)
│ ├─{libvirtd}(24314)
│ ├─{libvirtd}(24315)
│ ├─{libvirtd}(24316)
│ ├─{libvirtd}(24317)
│ ├─{libvirtd}(24318)
│ ├─{libvirtd}(24319)
│ ├─{libvirtd}(24320)
│ ├─{libvirtd}(24321)
│ ├─{libvirtd}(24322)
│ ├─{libvirtd}(24323)
│ ├─{libvirtd}(24324)
│ ├─{libvirtd}(24368)
│ └─{libvirtd}(24635)
├─login(842)───bash(19239)
├─lvmetad(600)
├─master(1771)─┬─pickup(27295)
│ └─qmgr(1775)
├─polkitd(833)─┬─{polkitd}(845)
│ ├─{polkitd}(846)
│ ├─{polkitd}(847)
│ ├─{polkitd}(848)
│ ├─{polkitd}(849)
│ └─{polkitd}(850)
├─qemu-kvm(25133)─┬─{qemu-kvm}(25142)
│ └─{qemu-kvm}(25143)
├─rsyslogd(21113)─┬─{rsyslogd}(21115)
│ └─{rsyslogd}(21116)
├─sshd(19683)───sshd(27392)───bash(27396)─┬─pstree(27881)
│ └─vi(27576)
├─systemd-journal(577)
├─systemd-logind(823)
├─systemd-machine(25136)
├─systemd-udevd(604)
├─tuned(1215)─┬─{tuned}(2202)
│ ├─{tuned}(2203)
│ ├─{tuned}(2269)
│ └─{tuned}(2270)
├─virtlogd(23647)
└─vmtoolsd(835)───{vmtoolsd}(858)