进程管理
计算机中,正在执行的,还没有执行完的程序或命令,都是一个进程。像前面学习的命令,cd
、ls
等这样的命令,敲下回车键就执行完了,在内存中停驻的时间非常短。但是有些常驻后台的服务,比如mysql, web服务等,随着系统启动就常驻内存中,这种一般称为“服务”。
系统常用的服务,都存放在/usr/lib/systemd/system 目录下
$ ls /usr/lib/systemd/system
auditd.service chronyd.service crond.service
firewalld.service lvm2-lvmpolld.service rdma-ndd.service
sshd.service sssd.service systemd-hostnamed.service
这些 *d.service 的,都是守护进程(daemon),守护了后台服务。如果无法区分什么是daemon,什么是service,那可以简单的理解为他们是同一样东西就可以了。比如 sshd.service 就是一个守护进程,守护了ssh服务。
查看当前系统进程状态:ps
不管是像ssh这样的系统服务,还是像mysql这样的用户服务,都有一个专门管理的工具。Windows系统下有“任务管理器”可以对正在系统中运行的服务进行管理。那么Linux系统下,也有类似这样专门管理后台进程的工具:ps。
基本语法
ps [参数]
ps可以像ls命令一样,不带任何参数直接使用,但是查看到的是跟当前登陆到Linux系统的用户所相关的进程,或者跟当前登陆到Linux系统的用户所操作的shell相关的进程。因为很多服务,都是通过伪用户、系统用户启动的。所以,通过这种方式查看到的服务就太少了,所以需要加上一些参数达到日常管理的效果。
参数说明
参数 | 参数说明 |
---|---|
a | 列出带有终端的所有用户进程 |
u | 面向用户友好的显示风格 |
x | 列出当前用户的所有进程,包括没有终端的进程 |
-e | 列出所有进程 |
-f | 显示完整格式的进程列表 |
注意,上面的aux
是没有带小横杠的 -
实例
下面是日常最常用的两个组合,下面分析一下,分别都展示了哪些信息。
ps aux
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 174540 13116 ? Ss 11:12 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 16
root 2 0.0 0.0 0 0 ? S 11:12 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 11:12 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 11:12 0:00 [rcu_par_gp]
root 6 0.0 0.0 0 0 ? I< 11:12 0:00 [kworker/0:0H-events_highpri]
root 9 0.0 0.0 0 0 ? I< 11:12 0:00 [mm_percpu_wq]
root 10 0.0 0.0 0 0 ? S 11:12 0:00 [ksoftirqd/0]
root 11 0.0 0.0 0 0 ? I 11:12 0:00 [rcu_sched]
root 12 0.0 0.0 0 0 ? S 11:12 0:00 [migration/0]
root 13 0.0 0.0 0 0 ? S 11:12 0:00 [watchdog/0]
root 14 0.0 0.0 0 0 ? S 11:12 0:00 [cpuhp/0]
列名 | 说明 |
---|---|
UESR | 启动进程的用户 |
PID | 进程的ID |
%CPU | 进程所占CPU百分比 |
%MEM | 进程所占内存百分比 |
VSZ | 进程使用的虚拟内存量(KB) |
RSS | 该进程占用的实际存量(KB) |
TTY | 该进程在哪个终端上运行(登陆Linux系统用户的终端位置),若与终端无关,则显示(?) 若为pts/0等,则表示由网络连接主机进程(可以理解为由xshell,ctr等终端启动的进程) 若为tty1等,则表示由当前主机的字符终端界面(可以理解为在主机上命令行模式启动进程) |
STAT | 进程的状态。常见的状态有:R:运行状态;S:睡眠状态;T:暂停状态;Z:僵尸状态(进程已结束运行,但还有残留资源待回收);s:包含子进程;l:多线程;+:前台显示;<:进程的优先级很高;N:进程的优先级较低;L:有些页被锁进内存 |
START | 进程启动时间 |
TIME | 进程占用cpu运算的时间 |
COMMAND | 启动进程所用的命令和参数 |
ps -ef
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 11:12 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 16
root 2 0 0 11:12 ? 00:00:00 [kthreadd]
root 3 2 0 11:12 ? 00:00:00 [rcu_gp]
root 4 2 0 11:12 ? 00:00:00 [rcu_par_gp]
root 6 2 0 11:12 ? 00:00:00 [kworker/0:0H-events_highpri]
root 9 2 0 11:12 ? 00:00:00 [mm_percpu_wq]
root 10 2 0 11:12 ? 00:00:00 [ksoftirqd/0]
root 11 2 0 11:12 ? 00:00:01 [rcu_sched]
root 12 2 0 11:12 ? 00:00:00 [migration/0]
root 13 2 0 11:12 ? 00:00:00 [watchdog/0]
root 14 2 0 11:12 ? 00:00:00 [cpuhp/0]
列名 | 说明 |
---|---|
UID | 启动进程的用户 |
PID | 进程的ID |
PPID | 进程的父进程ID |
C | CPU资源的占用率 |
STIME | 进程启动的时间 |
TTY | 完整的终端名称 |
TIME | 进程占用cpu运算的时间 |
CMD | 启动进程所用的命令和参数 |
结束进程:kill
基本语法
kill [参数] [程序]
参数说明
参数 | 参数说明 |
---|---|
-l | 信息编号 |
-s | 指定要送出的信息 |
[程序] | 程序可以是PID,也可以是工作编号 |
实例
结束进程PID为1234的进程
$ kill -9 1234
结束所有sshd的进程
$ killall sshd
实时查看系统进程状态:top
跟ps命令不一样,ps命令是一个静态的列表。但是top是动态的,实时刷新进程状态的一个监控工具。
基本语法
top [参数]
参数说明
参数 | 参数说明 |
---|---|
-d 秒数 | 指定top工具每隔多少秒刷新一次 |
-i | 不显示任何的僵尸进程或者睡眠进程 |
-p | 指定进程id,让top工具只监控一个进程的状态 |
实例
其实就是对top命令展示出来的信息进行一些说明。
top - 16:06:22 up 4:54, 2 users, load average: 0.02, 0.02, 0.00
Tasks: 148 total, 1 running, 147 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.5 sy, 0.0 ni, 98.5 id, 0.0 wa, 0.5 hi, 0.5 si, 0.0 st
MiB Mem : 3709.8 total, 2858.4 free, 378.5 used, 472.9 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 3083.7 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4321 root 20 0 275204 4580 3928 R 1.9 0.1 0:02.49 top
1 root 20 0 174672 13192 8468 S 0.0 0.3 0:02.21 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-events_highpri
9 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
系统信息
top - 16:06:22 up 4:54, 2 users, load average: 0.02, 0.02, 0.00
信息 | 说明 |
---|---|
top - 16:06:22 | 显示了当前的系统时间 |
up 4:54 | 系统最近一次开机直到当前已运行时间 |
2 users | 当前登陆到系统的用户数 |
load average: 0.02, 0.02, 0.00 | 系统负载:过去的1分钟、5分钟、15分钟到现在整个系统的平均负载 数值越高,系统的负载越严重 |
进程状态信息
Tasks: 148 total, 1 running, 147 sleeping, 0 stopped, 0 zombie
信息 | 说明 |
---|---|
Tasks: 148 total | 总共有148个任务数 |
1 running | 当前正在后台执行的任务数 |
147 sleeping | 当前处于休眠状态的任务数 |
0 stopped | 当前已经停止的任务数 |
0 zombie | 当前的僵尸进程数 |
CPU
%Cpu(s): 0.0 us, 0.5 sy, 0.0 ni, 98.5 id, 0.0 wa, 0.5 hi, 0.5 si, 0.0 st
信息 | 说明 |
---|---|
%Cpu(s) | |
0.0 us | 用户空间占用CPU百分比 |
0.5 sy | 内核空间占用CPU百分比 |
0.0 ni | 用户通过nice命令改变过优先级的进程占用CPU百分比 |
98.5 id | 空闲CPU百分比 |
0.0 wa | 等待IO操作的CPU百分比 |
0.5 hi | 硬中断占用CPU百分比 |
0.5 si | 软中断CPU百分比 |
0.0 st | 虚拟CPU等待实际CPU的时间的百分比 |
一般我们关注多的是us、sy、id、wa、hi、wi这个6个数值,在这里我们需要注意的指标如下:
CPU(s):表示当前CPU的平均值,默认top命令配置显示的是平均的CPU使用情况,如果按下键盘1
可以显示各颗逻辑CPU的使用情况。
top - 16:16:11 up 5:04, 2 users, load average: 0.03, 0.03, 0.00
Tasks: 145 total, 1 running, 144 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.0 us, 0.0 sy, 0.0 ni, 99.0 id, 0.0 wa, 1.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3709.8 total, 2858.7 free, 378.3 used, 472.8 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 3083.9 avail Mem
-
统计空闲的CPU利用率我们直接统计%id的计数即可,当id持续过低的时候,表示系统迫切需要解决CPU资源问题。
-
统计使用的是CPU需要用1-%id获取。或者us+sy+si.
-
wa:使用率过高的时候,我们需要考虑IO的性能是否有瓶颈,可以在使用iostat、sar等命令做进一步分析;
-
hi:使用率过高时,表示当前硬件中断占用很大的百分比。一般硬件中断我们可以分析文件/proc/interrupts、/proc/irq/pid/smp_affinity、服务irqbalance是否配置,以及CPU的频率设置,通过这些可以帮系统打散优化系统的硬件中断。
-
si:Linux kernel通过用一种软件的方法(可延迟函数)来模拟硬件的中断模式,通常叫做软中断。常见的软件中断一般都是和网络有关。从网卡到IP层的数据报文收发都是si处理的,长时间写日志也可能产生软件中断。
-
当软中断出现瓶颈的时候,系统有个进行叫ksoftirqd,每个CPU都有自己对应的ksoftirqd/n(n为CPU的逻辑ID),每个ksoftirqd的内核线程都会去运行对应的ksoftirqd(函数)来处理自己的中断队列上的软件中断。所以,当网络出现阻塞的时候,软件中断程序ksoftirqd肯定会出现瓶颈。此时我们可以通过ps aux|grep ksoftirqd查看ksoftirqd的瓶颈。
-
Ni:优先级(priority)为操作系统用来决定CPU分类的参数,Linux使用(round-robin)的算法来做CPU排程,优先序越高,有可能获得的CPU时间就越多。但是我们可以通过nice命令以更改过的优先序来执行程序,如果未制定程序,则会打印出目前的排程优先序,内定的adjustment为10,范围为-20(最高优先序)到19(最低优先序)。
内存
MiB Mem : 3709.8 total, 2858.4 free, 378.5 used, 472.9 buff/cache
物理内存总量、已经使用的物理内存、空闲物理内存、内核缓存内存量。
swap交换分区
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 3083.7 avail Mem
交换分区总量、已使用交互区总量、空闲交换区总量、缓冲的交换区总量。
进程状态
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4321 root 20 0 275204 4580 3928 R 1.9 0.1 0:02.49 top
1 root 20 0 174672 13192 8468 S 0.0 0.3 0:02.21 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-events_highpri
9 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
列名 | 说明 |
---|---|
PID | 进程ID |
USER | 启动进程的用户 |
PR | 进程优先级 |
NI | nice值,负值表示高优先级,正值表示低优先级 |
VIRT | 进程使用的虚拟内存总量,单位kb,VIRT=SWAP+RES |
RES | 进程使用的、未被换出的物理内存大小,单位KB,RES=CODE+DATA |
SHR | 进程占用的共享内存大小,单位KB |
S | 进程状态 |
%CPU | 上传更新到现在的CPU时间占用百分比 |
%MEM | 进程使用的物理内存百分比 |
TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
COMMAND | 启动进程所用的命令和参数 |
top命令的一些交互命令
这些命令都是在运行了top工具后,在top工具展示出信息的界面,跟top工具进行一些交互操作。
命令 | 说明 |
---|---|
q | 退出top工具 |
k | 相当于kill命令,杀掉一个进程。默认使用15信号,可以使用9信号来强行结束进程 |
i | 忽略睡眠和僵尸进程的开关 |
s | 小写字母s,改变top工具的刷新时间,默认是3秒。 |
m | 小写字母m,切换内存信息的展示形式 |
t | 切换进程和CPU状态信息的展示形式 |
M | 大写字母M,根据驻留内存大小进行排序 |
P | 大写字母P,根据CPU使用百分比大小进行排序 |
T | 大写字母T,根据时间或者累计时间进行排序 |
W | 大写字母W,写top配置文件的方法。将当前设置写入~/toprc文件中 |
翻页 | 向上箭头、向下箭头、page up、page down |
显示网络状态和端口占用信息:netstat
因为要看看到底是哪个进程占用了端口,所以这也是跟进程相关呀。
基本语法
# 查看进程的端口号
netstat -anp | grep 进程号/服务名
# 查看端口的占用情况
netstat -nlp | grep 端口号
参数说明
参数 | 说明 |
---|---|
-a | 显示所有正在监听(listten)和未监听的socket |
-n | 不显示别名,能转化成数字显示 的全都转成数字显示 |
-l | 仅列出正在监听的服务状态 |
-p | 表示哪个进程在调用 |
实例
说明一下netstat命令展示出来的信信息
netstat -anp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 879/sshd
tcp6 0 0 :::3306 :::* LISTEN 1898/mysqld
tcp6 0 0 :::22 :::* LISTEN 879/sshd
udp 0 0 127.0.0.1:323 0.0.0.0:* 870/chronyd
udp6 0 0 ::1:323 :::* 870/chronyd
raw6 0 0 :::58 :::* 7 864/NetworkManager
列名 | 说明 |
---|---|
Proto | 通信协议(tcp协议还是udp协议) |
Recv-Q | 表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走 |
Send-Q | 表示已经发送出去,但远程计算机还没有确认收到的字节数 |
Local Address | 本地计算机的进程所监听的地址及端口 |
Foreign Address | 与外部通信的地址与端口 |
State | 网络连接状态 |
PID/Program name | 进程ID或者程序名称 |
混迹IT行业多年,技术依然渣渣,故名zaza-h
记录和分享自己的学习历程,如果有错漏,请各路大神帮忙指正。也欢迎大家多多讨论,共同成长
本文来自博客园,作者:zaza_h,转载请注明原文链接:https://www.cnblogs.com/zaza-h/p/16222914.html