linux 服务器性能监控(一)

这篇文章主要介绍一些常用的linux服务器性能监控命令,包括命令的常用参数、指标的含义以及一些交互操作。

几个问题

命令本身并不复杂,关键是你对操作系统基础知识的掌握和理解,先来看看下面几个问题:

  • CPU、内存以及硬盘的关系是怎样的?
  • 进程和线程是什么?有什么区别?有什么优缺点?
  • 什么是物理内存?什么是虚拟内存?什么时候要用到虚拟内存?
  • 什么是CPU中断?CPU上下文切换?CPU缺页计算?
  • 怎么理解系统负载?如何通过load average的值来判断系统负载是否过高?
  • ...

相信基础好的司机心里已经有个大致的答案,那如果你一知半解,请仔细阅读全文,部分答案会在相关的命令讲解中揭晓。对于理解错误或者不到位的地方希望老司机不吝赐教。

free

free 命令是监控linux 内存使用最常用的命令,参数[-m]表示以M 为单位查看内存使用情况(默认为kb)。

[root@localhost ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           482        130        352          0          9         36
-/+ buffers/cache:         83        399
Swap:          991          0        991
  • Mem:物理内存大小。
  • total:总计物理内存的大小。
  • used:已使用多大。
  • free:可用有多少。
  • shared:多个进程共享的内存总额。
  • buffers:缓冲区内存总量。
  • cached:交换区缓冲区内存总量。
  • 第三行(-/+ buffers/cached):系统的物理内存真实使用量,可通过used-buffers-cached计算得到,因为buffers和cached也是占用物理内存得来,可以通过释放它们来获得这部分内存。
  • Swap:交换区总量,也叫虚拟内存。

那么,什么是虚拟内存?

虚拟内存是计算机系统内存管理的一种技术,通过使用硬盘空间来当做内存以弥补计算机物理内存(RAM空间)的缺乏。当物理内存不够用时(不够用前),系统在磁盘上划分一块虚拟的内存空间,这样虚拟内存就在硬盘上创建了。

现在明白什么是虚拟内存,什么时候要用到虚拟内存了吧。所以,当你在监控linux操作系统的时候,如果发现系统使用了交换内存,那么说明系统的 ** 物理内存已经用完了**,需要排查是哪些程序占用了物理内存,对内存进行进一步的深入分析。还有一点要说的就是,交换内存的速度是非常慢的。

uptime

uptime 命令是监控系统性能最常用的一个命令,主要是来统计系统当前的运行状态,即负载情况。

[root@localhost~]# uptime 
 05:41:01 up 3 min,  1 user,  load average: 0.23, 0.33, 0.15

输出信息依次是:系统现在的时间,系统从上次开机到现在运行了多长时间,系统当前有多少个登录用户,系统在1分钟内、5 分钟内、15 分钟内的平均负载。
如果load average值长期大于系统CPU的个数则说明CPU很繁忙,负载很高,可能会影响系统性能,导致系统卡顿响应时间长等等。
load average值与系统CPU的个数对比怎么理解?load average的值表示在单位时间内运行的进程数,而CPU一个内核同一时间只能处理一个进程,一台16核CPU的服务器如果load average大于16,那说明系统正处于超负荷运行状态。

vmstat

vmstat 可以对操作系统的内存信息、进程状态、CPU 活动、磁盘等信息进行监控,不足之处是无法对某个进程进行深入分析。

[root@localhost~]# vmstat 2 3 -S M
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0    235     11     88    0    0    32     2   21   23  0  1 98  1  0
 0  0      0    235     11     88    0    0     0     0   16   19  0  0 100  0  0
 0  0      0    235     11     88    0    0     0     0   13   19  0  0 100  0  0

2表示每2秒取样一次,3表示取数3次,-S表示单位,可选有 k 、K 、m 、M。

  • procs
    R 列表示运行和等待 CPU 时间片的进程数,这个值如果长期大于系统 CPU 个数,说明CPU 不足,需要增加 CPU。
    B 列表示在等待资源的进程数,比如正在等待 I/O 或者内存交换等。

  • memory
    swpd 列表示切换到内存交换区的内存大小(单位 KB),通俗讲就是虚拟内存的大小。如果 swap 值不为 0 或者比较大, 只要 si、so 的值长期为 0,这种情况一般属于正常情况
    free 列表示当前空闲的物理内存(单位 KB) 。
    buff 列表示 buffers cached 内存大小,也就是缓冲区大小,一般对块设备的读写才需要缓冲。
    cache 列表示 page cached 的内存大小,也就是缓存大小,一般作为文件系统进行缓冲,频繁访问的文件都会被缓存,如果 cache 值非常大说明缓存文件比较多,如果此时 io中的 bi 比较小,说明文件系统效率比较好。

  • swap
    si 列表示由磁盘调入内存,也就是内存进入内存交换区的内存大小。
    so 列表示由内存进入磁盘,也就是有内存交换区进入内存的内存大小。
    一般情况下,si、so 的值都为 0,如果 si、so 的值长期不为 0,则说明系统内存不足,需要增加系统内存。

  • io
    bi 列表示由块设备读入数据的总量,即读磁盘,单位 kb/s。
    bo 列表示写到块设备数据的总量,即写磁盘,单位 kb/s。
    如果 bi+bo 值过大,且 wa 值较大,则表示系统磁盘 IO 瓶颈。

  • system
    in 列表示某一时间间隔内观测到的每秒设备中断数。
    cs 列表示每秒产生的上下文切换次数。
    这 2 个值越大,则由内核消耗的 CPU 就越多。

  • cpu
    us 列表示用户进程消耗的 CPU 时间百分比,us 值越高,说明用户进程消耗 cpu 时间越多,如果长期大于 50%,则需要考虑优化程序或者算法。
    sy 列表示系统内核进程消耗的 CPU 时间百分比,一般来说 us+sy 应该小于 80%,如果大于 80%,说明可能处于 CPU 瓶颈。
    id 列表示 CPU 处在空闲状态的时间百分比。
    wa 列表示 IP 等待所占的 CPU 时间百分比,wa 值越高,说明 I/O 等待越严重,根据经验 wa 的参考值为 20%,如果超过 20%,说明 I/O 等待严重,引起 I/O 等待的原因可能是磁盘大量随机读写造成的, 也可能是磁盘或者此哦按监控器的贷款瓶颈 (主要是块操作)造成的。

vmstat命令的结果显示比较全面,可以看到操作系统的内存信息、进程状态、CPU 活动、磁盘等信息,不足之处是无法对某个进程进行深入分析。但是以上每一列的含义都是要重点掌握!具体的参数和用法在这里就不列举了,需要的可自行百度了解。

sar

Nick Young.jpg

好吧,我只是为了引起大家的注意。

sar 是非常强大性能分析命令,通过 sar 命令可以全面的获取系统的 CPU、运行队列、磁盘 I/O、交换区、内存、cpu 中断、网络等性能数据。老司机必备!
sar安装直接yum install -y sysstat,这里有个坑就是安装完成后直接使用的话会报错,提示文件不存在,解决办法是先执行sar -o 2 3,来生成所需文件,之后使用就正常啦。

sar监控CPU
[root@localhost~]# sar -u 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost)       20161102日  _i686_  (1 CPU)

065850秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
065852all      0.00      0.00      0.50      0.00      0.00     99.50
065854all      0.00      0.00      0.50      0.00      0.00     99.50
065856all      0.00      0.00      0.50      0.00      0.00     99.50
平均时间:        all      0.00      0.00      0.50      0.00      0.00     99.50

2表示每2秒取样一次,3表示取数3次,-u表示CPU使用率

  • %usr:用户进程消耗的 CPU 时间百分比。
  • %nice: 运行正常进程消耗的 CPU 时间百分比。
  • %system:系统进程消耗的 CPU 时间百分比。
  • %iowait:I/O 等待所占 CPU 时间百分比。
  • %steal:在内存紧张环境下,pagein 强制对不同的页面进行的 steal 操作。虚拟服务占用的CPU时间百分比,这个值一般为0.
  • %idle:CPU 空闲状态的时间百分比。

在所有的显示中,我们应主要注意%iowait 和%idle,%iowait 的值过高,表示硬盘存在 I/O 瓶颈, %idle 值高,表示 CPU 较空闲,如果%idle 值高但系统响应慢时,有可能是 CPU 等待分配内存, 此时应加大内存容量。%idle 值如果持续低于 10,那么系统的 CPU 处理能力相对较低,表 明系统中最需要解决的资源是 CPU。

[root@localhost~]# sar -q 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost)       20161102日  _i686_  (1 CPU)

071631秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
0716330       118      0.16      0.07      0.09
0716350       118      0.16      0.07      0.09
0716370       118      0.15      0.07      0.09
平均时间:            0       118      0.16      0.07      0.09

2表示每2秒取样一次,3表示取数3次,-q显示运行队列的大小,它与系统当时的平均负载相同。

  • runq-sz:运行队列的长度(等待运行的进程数) 。
  • plist-sz:进程列表中进程(processes)和线程(threads)的数量。
  • ldavg-1:最后 1 分钟的系统平均负载(System load average) 。
  • ldavg-5:过去 5 分钟的系统平均负载。
  • ldavg-15:过去 15 分钟的系统平均负载。
sar监控内存
[root@localhost~]# sar -r 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost)       20161102日  _i686_  (1 CPU)

072204秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
072206241108    269556     52.79     12736     90360    543584     21.11
072208241108    269556     52.79     12736     90360    543584     21.11
072210241108    269556     52.79     12736     90360    543584     21.11
平均时间:       241108    269556     52.79     12736     90360    543584     21.11

2表示每2秒取样一次,3表示取数3次,-r显示显示系统内存使用情况

  • kbmemfree: 这个值和 free 命令中的 free 值基本一致,所以它不包括 buffer 和 cache 的空间。
  • kbmemused:这个值和 free 命令中的 used 值基本一致,所以它包括 buffer 和 cache 的空间。
  • %memused:这个值是 kbmemused 和内存总量(不包括 swap)的一个百分比。
  • kbbuffers 和 kbcached:这两个值就是 free 命令中的 buffer 和 cache。
  • kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap)。
  • %commit:这个值是 kbcommit 与内存总量(包括 swap)的一个百分比。

[root@localhost~]# sar -B 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost)       20161102日  _i686_  (1 CPU)

072626秒  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
0726280.00      0.00     18.91      0.00     52.24      0.00      0.00      0.00      0.00
0726300.00      0.00     19.60      0.00     52.76      0.00      0.00      0.00      0.00
0726320.00      5.97     15.42      0.00     52.24      0.00      0.00      0.00      0.00
平均时间:         0.00      2.00     17.97      0.00     52.41      0.00      0.00      0.00      0.00

2表示每2秒取样一次,3表示取数3次,-B显示系统内存分页情况

  • pgpgin/s:表示每秒从磁盘或 SWAP 置换到内存的字节数(KB)。
  • pgpgout/s:表示每秒从内存置换到磁盘或 SWAP 的字节数(KB)。
  • fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)。
  • majflt/s:每秒钟产生的主缺页数。
[[root@localhost~]# sar -W 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost)       20161102日  _i686_  (1 CPU)
083110秒  pswpin/s pswpout/s
0831120.00      0.00
0831140.00      0.00
0831160.00      0.00
平均时间:         0.00      0.00

2表示每2秒取样一次,3表示取数3次,-W显示系统虚拟内存分页情况

  • pswpin/s:每秒系统换入的交换页面(swap page)数量。
  • pswpout/s:每秒系统换出的交换页面(swap page)数量。
sar监控I/O
[root@localhost~]# sar -b 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost)       20161102日  _i686_  (1 CPU)

083627秒       tps      rtps      wtps   bread/s   bwrtn/s
0836290.00      0.00      0.00      0.00      0.00
0836310.00      0.00      0.00      0.00      0.00
0836330.00      0.00      0.00      0.00      0.00
平均时间:         0.00      0.00      0.00      0.00      0.00

2表示每2秒取样一次,3表示取数3次,-b显示缓冲区使用情况

  • tps:每秒钟物理设备的 I/O 传输总量。
  • rtps:每秒钟从物理设备读入的数据总量。
  • wtps:每秒钟向物理设备写入的数据总量。
  • bread/s:每秒钟从物理设备读入的数据量,单位为 块/s。
  • bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s。
sar监控文件和内核
[root@localhost~]# sar -v 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost)       20161102日  _i686_  (1 CPU)

094312秒 dentunusd   file-nr  inode-nr    pty-nr
0943144466       768     11506         1
0943164466       768     11506         1
0943184466       768     11506         1
平均时间:         4466       768     11506         1

2表示每2秒取样一次,3表示取数3次,-v显示进程、节点、文件和锁表状态

  • inode-sz:目前核心中正在使用或分配的节点表的表项数,由核心参数 MAX-INODE 控制。
  • file-sz:目前核心中正在使用或分配的文件表的表项数, 由核心参数 MAX-FILE 控 制。
  • super-sz:溢出出现的次数。
  • dentunusd:目录高速缓存中未被使用的条目数量 。
sar监控设备使用情况
[root@localhost~]# sar -d 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost)       20161102日  _i686_  (1 CPU)

093746秒       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
093748秒    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
093748秒  dev253-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
093748秒  dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

2表示每2秒取样一次,3表示取数3次,-d显示设备使用情况

  • tps:每秒从物理磁盘 I/O 的次数.多个逻辑请求会被合并为一个 I/O 磁盘请求,一次传输的大小是不确定的。
  • rd_sec/s:每秒读扇区的次数。
  • wr_sec/s:每秒写扇区的次数。
  • avgrq-sz:平均每次设备 I/O 操作的数据大小(扇区)。
  • avgqu-sz:磁盘请求队列的平均长度。
  • await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1 秒=1000 毫秒)。
  • svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间。
  • %util:I/O 请求占 CPU 的百分比,比率越大,说明越饱和。
  • avgqu-sz 的值较低时,设备的利用率较高。
  • 当%util 的值接近 1% 时,表示设备带宽已经占满。
  • await-svctm=io等待时间。
sar总结
  • 要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来
  • 怀疑 CPU 存在瓶颈,可用 sar -u 和 sar -q 等来查看
  • 怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看
  • 怀疑 I/O 存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看
  • 参数列表
    -u:CPU 利用率
    -v:进程、节点、文件和锁表状态。
    -d:硬盘使用报告。
    -q:显示运行队列的大小,它与系统当时的平均负载相同
    -B:内存分页情况
    -b:缓冲区使用情况。
    -W:系统交换活动,虚拟内存。

iostat

iostat 是对系统的磁盘 I/O 操作进行监控,它的输出主要显示磁盘读写操作的统计信息,同时给出 CPU 的使用情况。同 vmstat 一样,iostat 不能对某个进程进行深入分析,仅对操作系统的整体情况进行分析。

iostat监控磁盘
[root@localhost~]# iostat -x
Linux 2.6.32-573.22.1.el6.i686 (localhost)       20161102日  _i686_  (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.04    0.00    0.30    0.23    0.00   99.43

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.16     0.07    0.23    0.12    13.67     1.51    43.06     0.01   22.07    8.37   49.13  11.15   0.39
dm-0              0.00     0.00    0.31    0.19    13.08     1.50    29.58     0.01   29.07   18.88   45.61   7.92   0.39
dm-1              0.00     0.00    0.02    0.00     0.15     0.00     8.00     0.00    5.47    5.47    0.00   4.12   0.01

-x显示所有磁盘分区的情况。

  • rrqm/s:每秒进行 merge 的读操作数目,即 delta(rmerge)/s 。
  • wrqm/s:每秒进行 merge 的写操作数目,即 delta(wmerge)/s 。
  • r/s:每秒完成的读 I/O 设备次数,即 delta(rio)/s 。
  • w/s: 每秒完成的写 I/O 设备次数,即 delta(wio)/s 。
  • rsec/s:每秒读扇区数,即 delta(rsect)/s。
  • wsec/s:每秒写扇区数,即 delta(wsect)/s
  • rkB/s:每秒读 K 字节数,是 rsect/s 的一半,因为每扇区大小为 512 字节。
  • wkB/s:每秒写 K 字节数,是 wsect/s 的一半
  • avgrq-sz:平均每次设备 I/O 操作的数据大小 (扇区),即
    delta(rsect+wsect)/delta(rio+wio) 。
  • avgqu-sz:平均 I/O 队列长度,即 delta(aveq)/s/1000 (因为 aveq 的单位为毫秒)。
  • Await: 平均每次设备 I/O 操作的等待时间 (毫秒), 即 delta(ruse+wuse)/delta(rio+wio) 。
  • **Svctm:平均每次设备 I/O 操作的服务时间 (毫秒),即delta(use)/delta(rio+wio) **
  • %util:一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的,即 delta(use)/s/1000 (因为 use 的单位为毫秒) 。
[root@localhost~]# iostat -d
Linux 2.6.32-573.22.1.el6.i686 (localhost)       20161102日  _i686_  (1 CPU)

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.35        13.40         1.50     212052      23818
dm-0              0.49        12.82         1.50     202898      23800
dm-1              0.02         0.15         0.00       2400          0

-d显示磁盘使用情况。

  • tps:每秒从物理磁盘 I/O 的次数.多个逻辑请求会被合并为一个 I/O 磁盘请求,一次传输的大小是不确定的。磁盘的一次读或者写都是一次 I/O 操作
  • Blk_read/s:每秒读取的数据块数。
  • Blk_wrtn/s :每秒写入的数据块数。
  • Blk_read:读取的所有块数。
  • Blk_wrtn :写入的所有块数。
iostat监控CPU
[root@localhost~]# iostat -c  2 3 
Linux 2.6.32-573.22.1.el6.i686 (localhost)       20161102日  _i686_  (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.04    0.00    0.29    0.24    0.00   99.43

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.00    0.00    0.00  100.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.50    0.00    0.00   99.50

-c显示系统CPU使用情况,2表示时间间隔2s,3表示取数3次。

  • %usr:用户进程消耗的 CPU 时间百分比。
  • %nice: 运行正常进程消耗的 CPU 时间百分比。
  • %system:系统进程消耗的 CPU 时间百分比。
  • %iowait:I/O 等待所占 CPU 时间百分比。
  • %steal:在内存紧张环境下,pagein 强制对不同的页面进行的 steal 操作。
  • %idle:CPU 空闲状态的时间百分比。

top

我想这个命令大家肯定已经相当熟悉,甚至有些童鞋有用过。top 命令能够实时监控系统的运行状态, 并且可以按照 CPU、 内存和执行时间进行排序,同时 top 命令还可以通过交互式命令进行设定显示,通过 top 命令可以查看即时活跃的进程。

top - 05:57:44 up 2 min,  1 user,  load average: 0.47, 0.37, 0.15
Tasks:  92 total,   1 running,  91 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:    510664k total,   268192k used,   242472k free,    11464k buffers
Swap:  2064380k total,        0k used,  2064380k free,    90252k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                 
  745 root      20   0     0    0    0 S  0.3  0.0   0:00.04 flush-253:0                                                             
 1724 root      20   0 12468 3392 2640 S  0.3  0.7   0:00.45 sshd                                                                    
    1 root      20   0  2900 1408 1204 S  0.0  0.3   0:03.05 init                                                                    
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.01 kthreadd                                                                
    3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0                                                             
    4 root      20   0     0    0    0 S  0.0  0.0   0:00.02 ksoftirqd/0                                                             
    5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/0                                                               
    6 root      RT   0     0    0    0 S  0.0  0.0   0:00.02 watchdog/0                                                              
    7 root      20   0     0    0    0 S  0.0  0.0   0:00.19 events/0                                                                
    8 root      20   0     0    0    0 S  0.0  0.0   0:00.00 events/0                                                                
    9 root      20   0     0    0    0 S  0.0  0.0   0:00.00 events_long/0                                                           
   10 root      20   0     0    0    0 S  0.0  0.0   0:00.00 events_power_ef                                                         
   11 root      20   0     0    0    0 S  0.0  0.0   0:00.00 cgroup                                                                  
   12 root      20   0     0    0    0 S  0.0  0.0   0:00.00 khelper                                                                 
   13 root      20   0     0    0    0 S  0.0  0.0   0:00.00 netns                                                                   
   14 root      20   0     0    0    0 S  0.0  0.0   0:00.00 async/mgr                                                               
   15 root      20   0     0    0    0 S  0.0  0.0   0:00.00 pm                                                                      
   16 root      20   0     0    0    0 S  0.0  0.0   0:00.00 sync_supers                                                             
   17 root      20   0     0    0    0 S  0.0  0.0   0:00.00 bdi-default                                                             
   18 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kintegrityd/0                                                           
   19 root      20   0     0    0    0 S  0.0  0.0   0:00.21 kblockd/0                                                               
   20 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kacpid                                                                  
   21 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kacpi_notify                                                            
   22 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kacpi_hotplug                                                           
   23 root      20   0     0    0    0 S  0.0  0.0   0:00.00 ata_aux                                                                 
   24 root      20   0     0    0    0 S  0.0  0.0   0:00.02 ata_sff/0                                                               
   25 root      20   0     0    0    0 S  0.0  0.0   0:00.00 ksuspend_usbd                                                           
   26 root      20   0     0    0    0 S  0.0  0.0   0:00.01 khubd   

直接在命令行输入top回车之后就可以看到上面的效果了,内容是不是很丰富,先逐个介绍参数的含义。

参数含义
05:57:44 系统时间
up 2 min 系统运行时间
user 系统当前登录用户数
load average: 0.47, 0.37, 0.15 过去一分钟五分钟十五分钟系统负载
-- --
Tasks 进程/任务
total 总进程数
running 正在运行进程数
sleeping 休眠状态进程数
stopped 停止进程数
zombie 僵尸进程数(处于无响应状态)
-- --
%us 用户进程消耗的 CPU 时间百分比
%sy 系统进程消耗的 CPU 时间百分比
%ni 运行正常进程消耗的 CPU 时间百分比
%id CPU 空闲状态的时间百分比
%wa I/O 等待所占 CPU 时间百分比
%hi 硬中断(Hardware IRQ)占用CPU的百分比
%si 软中断(Software Interrupts)占用CPU的百分比
%st 在内存紧张环境下,pagein 强制对不同的页面进行的 steal 操作
-- --
Mem total 物理内存总量
Mem used 使用中的内存总量
Mem free 空闲内存总量
Mem buffers 缓存的内存量
-- --
Swap total 交换区总量
Swap free 使用的交换区总量
Swap used 空闲交换区总量
Swap cached 缓冲的交换区总量
-- --
PID 进程id
USER 进程所有者
PR 进程优先级
NI nice值。负值表示高优先级,正值表示低优先级
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR 共享内存大小,单位kb
S 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU 次更新到现在的CPU时间占用百分比
%MEM 进程使用的物理内存百分比
TIME+ 进程使用的CPU时间总计,单位1/100秒
COMMAND 进程名称(命令名/命令行)

其实不难发现,top包含了前面介绍的一些命令的结果,如uptime、free、iostat等,那除了内容比较全面之外,top还提供了一些交互操作,让我们能更进一步的分析系统性能。
下面我介绍几个常用的交互操作:

  • 展开Cpu(s)
    在top交互界面直接按键盘的数字1。
    这里还是要强调一下,%cpu的值是跟内核数成正比的,如8核cpu的%cpu最大可以800%。

  • 显示线程
    在top交互界面按ctrl+h显示线程,再按一次关闭显示。

  • 帮助
    在top交互界面按h进入帮助界面。

  • 增加或删除显示列
    在top交互界面按h进入,输入想显示的列的首字母如n,退出直接回车。

  • 排序
    Cpu : 在top交互界面按shift+p。
    Mem :在top交互界面按shift+m。
    Time :在top交互界面按shift+t。

  • 显示程序名
    在top交互界面按c。

  • 监控进程下的线程
    在命令行输入top -H -p pid,其中pid为进程id,进入界面后显示的PID为线程ID;或者使用命令top -H -p pid进入界面之后在按shift+h来显示线程。

netstat

Netstat 命令用于显示本机网络连接、运行端口、路由表等信息,常用命令有两个netstat -plnt和netstat -i,我们来看看。

[root@localhost~]# netstat -i
Kernel Interface table
Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth1       1500   0     4249      0      0      0     5786      0      0      0 BMRU
lo        65536   0        0      0      0      0        0      0      0      0 LRU
  • Iface:表示网络设备的接口名称。
  • MTU:表示最大传输单元,单位为字节。
  • RX-OK/TX-OK:表示已经准确无误地接收/发送了多少数据包。
  • RX-ERR/TX-ERR:表示接收/发送数据包时候产生了多少错误。
  • RX-DRP/TX-DRP:表示接收/发送数据包时候丢弃了多少数据包。
  • RX-OVR/TX-OVR:表示由于误差而丢失了多少数据包。
  • Flg 表示接口标记,其中
    B 已经设置了一个广播地址。
    L 该接口是一个回送设备。
    M 接收所有数据包(混乱模式) 。
    N 避免跟踪。
    O 在该接口上,禁用 AR P。
    P 这是一个点到点链接。
    R 接口正在运行。
    U 接口处于“活动”状态。
  • 其中 RX-ERR/TX-ERR、 RX-DRP/TX-DRP 和 RX-OVR/TX-OVR 的值应该都为 0,如果不为 0,并且很大,那么网络质量肯定有问题,网络传输性能也一代会下降。
[root@localhost~]# netstat -plnt
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      1073/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1152/master         
tcp        0      0 :::3306                     :::*                        LISTEN      1623/mysqld         
tcp        0      0 :::80                       :::*                        LISTEN      1209/httpd          
tcp        0      0 :::21                       :::*                        LISTEN      1265/proftpd        
tcp        0      0 :::22                       :::*                        LISTEN      1073/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      1152/master         
tcp        0      0 :::443                      :::*                        LISTEN      1209/httpd
  • Proto :协议
  • Recv-Q:表示接收队列。
  • Send-Q :表示发送队列。
  • LocalAddress :表示本地机器名、端口
  • Foreign Address :表示远程机器名、端口
  • State:表示状态,其中
    LISTEN :在监听状态中。
    ESTABLISHED:已建立联机的联机情况。
    TIME_WAIT:该联机在目前已经是等待的状态。
  • PID/Program name:进程id/进程名

strace

strace 常用来跟踪进程执行时的系统调用和所接收的信号。 在 Linux 世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace 可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
那在什么情况下需要用到strace呢?比如用户CPU高的时候,你可以通过dump线程栈等方式进行深入分析,而系统CPU高时,先分析I/O,此时如果I/O高那么就可以确定是I/O问题了,如果I/O不高,那么想进一步分析就需要用到strace啦。

[root@localhost~]# strace -c -f -r -t -p 1724
Process 1724 attached
^CProcess 1724 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.000039          20         2           read
  0.00    0.000000           0         2           write
  0.00    0.000000           0         3           select
  0.00    0.000000           0         8           rt_sigprocmask
------ ----------- ----------- --------- --------- ----------------
100.00    0.000039                    15           total

以上命令中-p 172的172指的是你的进程id。

  • % time :调用该行命令占总时间的百分比
  • Seconds :调用总时长
  • usecs/call :用户调用次数
  • Calls:系统调用次数
  • Errors:错误总数
  • Syscall:调用的内核命令

总结

篇幅比较长,读起来难免枯燥,学习linux监控我认为首先要知道它有哪些命令,分别能做什么,其次要掌握每个命令的用法,最后一定要了解命令输出参数的含义。做到以上几点,我觉得你就已经具备了简单的监控和分析的能力,这个再去使用一些监控工具,就so easy了。

我的答案

  1. CPU、内存以及硬盘的关系?
    我们都知道,CPU是计算机的大脑,主要负责计算和逻辑判断,且自带一块容量比较小的高速缓存区,内存是CPU运行时数据存储的空间,硬盘的作用是数据保存。那么他们的工作流程到底是怎么样的呢,还是先看一个比较形象的例子。
    把CPU比喻成车间工人,每个工人看做一个CPU内核,把内存比喻成车间,硬盘比喻成仓库。车间的物件(数据)来自于仓库,车间工人在车间工作,处理车间内的物件(数据),当车间内的物件(数据)处理好后存放回仓库。很明显,车间越大车间工人越多,那么整个工厂单位时间能干的活也就越多。

  2. buff和cach的区别?
    buff:缓冲区,在进程通信时由于设备读写速度不一致产生,慢的一方先将数据存放到buff中,达到一定程度存储快的设备再读取buffer的数据,通过buffer可以减少进程间通信需要等待的时间。
    cache:缓存区,高速缓存,位于CPU和主内存之间的容量较小但速度很快的存储器,它减少了CPU等待的时间。

  3. 线程与进程的区别及优缺点?
    一个进程包含至少一个线程,进程是资源集合体,是系统资源分配调度的基本单位,线程是进程的执行单元,进程和线程都可以并发,进程在执行过程中拥有独立的内存单元,而线程之间共享内存

 

posted @   专注it  阅读(331)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示