linux 服务器性能监控(一)


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

几个问题

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

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

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

free

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

[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~]# sar -u 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost)       2016年11月02日  _i686_  (1 CPU)

06时58分50秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
06时58分52秒     all      0.00      0.00      0.50      0.00      0.00     99.50
06时58分54秒     all      0.00      0.00      0.50      0.00      0.00     99.50
06时58分56秒     all      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 -r 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost)       2016年11月02日  _i686_  (1 CPU)

07时22分04秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
07时22分06秒    241108    269556     52.79     12736     90360    543584     21.11
07时22分08秒    241108    269556     52.79     12736     90360    543584     21.11
07时22分10秒    241108    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 -W 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost)       2016年11月02日  _i686_  (1 CPU)
08时31分10秒  pswpin/s pswpout/s
08时31分12秒      0.00      0.00
08时31分14秒      0.00      0.00
08时31分16秒      0.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 -v 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost)       2016年11月02日  _i686_  (1 CPU)

09时43分12秒 dentunusd   file-nr  inode-nr    pty-nr
09时43分14秒      4466       768     11506         1
09时43分16秒      4466       768     11506         1
09时43分18秒      4466       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~]# iostat -x
Linux 2.6.32-573.22.1.el6.i686 (localhost)       2016年11月02日  _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 -c  2 3 
Linux 2.6.32-573.22.1.el6.i686 (localhost)       2016年11月02日  _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 命令可以查看即时活跃的进程。

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