进程管理
    计算机中,正在执行的,还没有执行完的程序或命令,都是一个进程。像前面学习的命令,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
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号