No.12 聊聊Linux的进程监控

3,228 阅读2分钟

前言

进程监控,对于我个人来说,目的是为了发现异常的进程,而进程的异常,基本体现在它的CPU使用内存使用带宽使用以及磁盘使用这四部分,即我们可以通过CPU、内存、带宽、磁盘的使用监控我们的进程。

CPU的使用

CPU的使用可以通过uptime命令和top命令查看,其中top命令涵盖了uptime命令。

通过 uptime 查看

$ uptime
22:31  up 5 days, 12:33, 5 users, load averages: 1.84 2.00 2.02

uptime 命令的 第一项(22:31)是当前时间;第二项(up)表示系统正在运行;第三项(5 days, 12:33)表示系统启动的总时间,最后三项是系统的负载信息,分别表示系统过去1分钟、5分钟、15分钟的平均负载。

什么是负载呢?系统负载是处于可运行不可中断状态的进程的平均数,简单来说负载就是代表了CPU的繁忙程度。对于单CPU来说,如果负载为1,则表示CPU占用100%;如果是4核CPU,且负载为1,则表示CPU占用在25%左右。

通过 top 查看

# 这一行就是 uptime 得到的负载信息
top - 22:59:28 up 42 days, 22:15,  2 users,  load average: 0.14, 0.10, 0.09

# 这一行是CPU的使用情况
%Cpu(s): 19.1 us,  0.3 sy,  0.0 ni, 80.3 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st

# 单个进程的情况
  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 2853 mysql     20   0 1185416 459856   7804 S 17.9 24.5   3992:26 mysqld
29026 ubuntu    20   0  842104 173924  13400 S  0.7  9.3  88:37.12 python

上述输出信息有一行 %Cpu(s),各字段解释如下:

us: user time, 用户时间,表示CPU执行用户进程占用的时间
sy: system time, 系统时间, 表示CPU在内核态占用的时间, 如果sy较高,通常意味者系统在某方面设计不合理。
ni: nice time, 表示系统在调整进程优先级时花费的时间
id: Idle time, 空闲时间
wa: waiting time, 表示cpu在等待I/O操作所花费的时间
hi: hard Irq time, 表示系统处理硬件中断所占用的时间
si: soft Irq time, 表示系统处理软件中断所占用的时间
st: steal time, 是在硬件虚拟化开始流行后增加的一列,表示被强制等待虚拟CPU的时间

另外,top命令的下面还有单个进程的CPU使用率,当某个进程的CPU使用率过高,往往就是异常的表现!

内存的使用

内存的使用可以通过 free 命令和 top 命令查看。

通过 free 查看

free 命令展示了各种内存的使用情况、比如物理内存、交换内存等,这些数据主要来自 /proc/meminfo 文件。

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           2.0G        450M        1.0G        868K        534M        1.3G
Swap:          1.0G          0B        1.0G

各字段解释如下:

  • total:总内存
  • used:使用的内存(total - free - buffers - cache)
  • free:未使用的内存
  • shared:Memory used (mostly) by tmpfs
  • buff/cache:buff + cache(内核相关)
  • available:可用内存,即估计有多少内存可用于启动新应用而无需交换

展示的格式也有多种(只列举常见的):

# 人类可读
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           2.0G        450M        1.0G        868K        534M        1.3G
Swap:          1.0G          0B        1.0G

free -b  # 以 bytes 为单位
free -k  # 以 KB 为单位
free -m  # 以 MB 为单位
free -g  # 以 GB 为单位

通过 top 查看

# 与 free 基本一致
KiB Mem :  1877052 total,   137892 free,   859412 used,   879748 buff/cache

KiB Swap:        0 total,        0 free,        0 used.   849288 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 2853 mysql     20   0 1185416 459856   7804 S 17.9 24.5   3992:26 mysqld
29026 ubuntu    20   0  842104 173924  13400 S  0.7  9.3  88:37.12 python

上述的关键字解释如下:

  • PR:进程的优先级别,越小越优先被执行
  • VIRT:进程占用的虚拟内存
  • RES:进程占用的物理内存
  • SHR:进程使用的共享内存
  • S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
  • %CPU:进程的CPU使用率
  • %MEM:进程使用的物理内存和总内存的百分比

注: Linux的内存管理有一个思想是实现内存利用率的最大化,所以内核会将剩余内存申请为cached,而cached不属于free范畴,所以free小,并不代表可用的内存小,当程序需要更大的内存而free空间不足时,就会将部分cached转化为free。

对于应用来说,更应该关注虚拟内存Swap的消耗,swap使用过多,表示物理内存已经不够用了。而物理内存不够用,操作系统将会将物理内存本该存储的一部分东西放到磁盘,从而产生磁盘I/O, 而磁盘I/O速度是远远小于物理内存,这就是我们常见的“卡顿”现象

带宽使用

带宽的使用,其实就是网络的使用情况,查看网络情况我们可以使用 sysstat,安装命令如下:

$ sudo apt install sysstat

这是一个工具包,安装后有几个命令可以使用,分别是 sar、iostat 和 mpstat

yangan@yangan-X555LI:~$ sar -n DEV 1 1
Linux 4.15.0-47-generic (yangan-X555LI) 	2019年04月29日 	_x86_64_	(4 CPU)

08时48分46秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
08时48分47秒    enp2s0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
08时48分47秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
08时48分47秒    wlp3s0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00


# 说明
enp2s0为有线网卡, lo为本地回环网络, wlp3s0为无线网卡。
rxpck/s: 每秒接收的数据包数量
txpck/s:每秒发送的数据包数量
rxkB/s: 每秒接收的字节数
rxcmp/s: 每秒收到的压缩包数量
rxmcst/s: 每秒收到的广播包数量

磁盘使用

上文的sysstat工具包其实也包含了查看磁盘使用的工具,使用如下:

yangan@yangan-X555LI:~$ iostat -d -k

Linux 4.15.0-47-generic (yangan-X555LI) 	2019年04月29日 	_x86_64_	(4 CPU)
Device             tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.10         0.66         0.02     139205       3392
sdb               6.44        14.47       431.21    3072049   91530664
loop8             0.00         0.00         0.00        493          0
loop9             0.00         0.00         0.00        121          0

tps: 每秒处理的I/O请求数
kB_read/s: 每秒从设备读取的数据量
kB_wrtn/s: 每秒向设备写入的数据量
kB_read: 读取的数据总量
kB_wrtn: 写入的数据总量

写在最后

各位老板,创作不易,更需不断地磨练和总结,欢迎关注我,我是言淦,为你分享各种实用的编程知识与编程技巧,你们的点赞与关注是我前进和创作的最大动力!!