进程管理

    计算机中,正在执行的,还没有执行完的程序或命令,都是一个进程。像前面学习的命令,cdls等这样的命令,敲下回车键就执行完了,在内存中停驻的时间非常短。但是有些常驻后台的服务,比如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或者程序名称
posted @ 2022-05-04 23:09  zaza_h  阅读(143)  评论(0编辑  收藏  举报