Posts Linux性能分析
Post
Cancel

Linux性能分析

1. uptime

1
2
[pengzhangjie]$ uptime
 20:11:28 up 148 days,  8:09,  1 user,  load average: 0.08, 0.08, 0.03

这个命令显示了要运行的任务(进程)数,通过它能够快速了解系统的平均负载。在Linux上,这些数值既包括正在或准备运行在CPU上的进程,也包括阻塞在uninterruptible I/O(通常是磁盘I/O)上的进程。它展示了资源负载(或需求)的大致情况。

最右的三个数值分别是1分钟、5分钟、15分钟系统负载的平均值。

2. dmesg | tail

1
2
3
[pengzhangjie@centos217 ~]$ dmesg | tail
UDP: bad checksum. From 60.191.23.60:8312 to 183.36.122.217:1080 ulen 109
……

这个命令显示了最新的10个系统信息,如果有的话。注意会导致性能问题的错误信息。上面的例子里就包括对过多占用内存的进程错误(oom),还有丢弃TCP请求的公告。

3. free -m

1
2
3
4
5
6
[pengzhangjie]$ free -m
             total       used       free     shared    buffers     cached
Mem:         48135      14972      33162          0        461       5622
-/+ buffers/cache:       8889      39246
Swap:         7629          0       7629

右边的两列显示: buffers:用于块设备I/O的缓冲区缓存 cached:用于文件系统的页缓存 它们的值接近于0时,往往导致较高的磁盘I/O(可以通过iostat确认)。

比起第一行,-/+ buffers/cache提供的内存使用量会更加准确些。Linux会把暂时用不上的内存用作缓存,一旦应用需要的时候立刻重新分配给它。所以部分被用作缓存的内存其实也算是空闲内存,第二行以此修订了实际的内存使用量。为了解释这一点, 有人专门建了个网站: linuxatemyram。

4. vmstat 1

1
2
3
4
5
[pengzhangjie]$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 38261304 471000 5813820    0    0     0     2    0    0  1  0 99  0  0	
 0  0      0 38224276 471000 5813824    0    0     0     4 9365 14501  9  2 89  0  0	

vmstat,是“virtual memory stat”的简称,几十年前就已经包括在BSD套件之中。它会逐行输出服务器关键数据的统计结果。(1表示每秒采样一次)。

检查下面各列:

procs 进程信息字段

r:等待CPU的进程数。该指标能更好地判定CPU是否饱和,因为它不包括I/O。简单地说,r值高于CPU数时就意味着饱和。数量越大,系统越繁忙

b: 等待IO的进程数量,数量越大,系统越繁忙

memory 内存信息字段(单位为 KB)

swpd:虚拟内存的使用情况

free:空闲的内存千字节数。如果你数不清有多少位,就说明系统内存是充足的。使用free -m,能够更清楚地说明空闲内存的状态。

swap 交换分区信息字段

si,so:Swap-ins和Swap-outs,每秒从磁盘读入/写入磁盘的大小。如果它们不为零,意味着内存已经不足,开始动用交换空间了需要经常在磁盘和内存之间进行交换,系统性能越差。

io 磁盘读/写信息字段

bi bo:块设备每秒接收/发送的块数量。两个数越大,代表系统的 I/O 越繁忙。

system 系统信息字段

in:每秒被中断的进程次数 cs:每秒进行的事件切换次数 这两个数越大,代表系统与接口设备的通信越繁忙

cup CPU信息字段(单位:百分比)

us,sy,id,wa,st:它们是所有CPU的使用百分比。它们分别表示user time,system time(处于内核态的时间),idle(空闲),wait(等待) I/O和steal time(偷取时间,与虚拟机相关)。

通过相加us和sy的百分比,你可以确定CPU是否处于忙碌状态。一个持续不变的wait I/O意味着瓶颈在硬盘上,这种情况往往伴随着CPU的空闲,因为任务都卡在磁盘I/O上了。你可以把wait I/O当作CPU空闲的另一种形式,它额外给出了CPU空闲的线索。

5. mpstat -P ALL 1

1
2
3
4
5
6
7
8
[pengzhangjie@centos ~]$ mpstat -P ALL 1
Linux 2.6.32-504.16.2.el6.x86_64 (centos) 09/19/2018 	_x86_64_	(16 CPU)

08:19:56 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
08:19:57 PM  all    0.44    0.00    0.13    0.00    0.00    0.00    0.00    0.00   99.44
08:19:57 PM    0    2.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   97.00
08:19:57 PM    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
08:19:57 PM    2    1.01    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.99

mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。mpstat最大的特点是:可以查看多核心cpu中每个计算核心的统计数据;而类似工具vmstat只能查看系统整体cpu情况。这个命令显示每个CPU的时间使用百分比,可以用它来检查CPU是否存在负载不均衡。单个过于忙碌的CPU可能意味着整个应用只有单个线程在工作。

6. pidstat 1

1
2
3
4
5
6
7
[pengzhangjie]$ pidstat 1
Linux 2.6.32-504.16.2.el6.x86_64 (centos) 	09/19/2018 	_x86_64_	(16 CPU)

08:21:13 PM       PID    %usr %system  %guest    %CPU   CPU  Command
08:21:14 PM     14721    0.98    0.00    0.00    0.98     0  fts_task_redis_
08:21:14 PM     17931    0.98    0.00    0.00    0.98     1  python
08:21:14 PM     19907    0.98    0.00    0.00    0.98    10  yyms_agent_d

pidstat看上去就像top,不过top的输出会覆盖掉之前的输出,而pidstat的输出则添加在之前的输出的后面。这有利于观察数据随时间的变动情况,也便于把你看到的内容复制粘贴到调查报告中。

7. iostat -xz 1

1
2
3
4
5
6
7
8
9
[pengzhangjie]$ iostat -xz 1
Linux 2.6.32-504.16.2.el6.x86_64 (centos) 	09/19/2018 	_x86_64_	(16 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.33    0.00    0.20    0.01    0.00   99.46

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     6.49    0.03    3.57     0.90    80.49    22.60     0.00    0.54   0.39   0.14
sdb               0.00     0.00    0.00    0.07     0.00     0.55     8.24     0.00    0.73   0.73   0.00

iostat参数 -x 显示详细信息
-z 只显示在采样周期内有活动的磁盘

这个命令可以弄清块设备(磁盘)的状况,包括工作负载和处理性能。注意以下各项:

r/s,w/s,rkB/s,wkB/s:分别表示每秒设备读次数,写次数,读的KB数,写的KB数。它们描述了磁盘的工作负载。也许性能问题就是由过高的负载所造成的。

await:I/O平均时间(毫秒)。它是应用中I/O处理所实际消耗的时间,因为其中既包括排队用时也包括处理用时。如果它比预期的大,就意味着设备饱和了,或者设备出了问题。

svctm:平均每次设备I/O操作的服务时间 (毫秒).即 delta(use)/delta(rio+wio).

avgqu-sz:分配给设备的平均请求数。大于1表示设备已经饱和了。(不过有些设备可以并行处理请求,比如由多个磁盘组成的虚拟设备)

%util:设备使用率,一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比。接近100%通常意味着饱和。

cup使用率与负载区别?

如果某个存储设备是由多个物理磁盘组成的逻辑磁盘设备,100%的使用率可能只是意味着I/O占用

请牢记于心,disk I/O性能低不一定是个问题。应用的I/O往往是异步的(比如预读(read-ahead)和写缓冲(buffering for writes)),所以不一定会被阻塞并遭受延迟。

如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。 idle小于70% IO压力就较大了,一般读取速度有较多的wait。 同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)。

另外 await 的参数也要多和 svctm 来参考。差的过高就一定有 IO 的问题。

avgqu-sz 也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小。如果数据拿的大,才IO 的数据会高。也可以通过 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s。也就是讲,读定速度是这个来决定的。

svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。

队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的I/O量。

形象的比喻:
r/s+w/s 类似于交款人的总数
平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数
平均服务时间(svctm)类似于收银员的收款速度
平均等待时间(await)类似于平均每人的等待时间
平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少
I/O 操作率 (%util)类似于收款台前有人排队的时间比例
设备IO操作:总IO(io)/s = r/s(读) +w/s(写)

平均等待时间=单个I/O服务器时间*(1+2+…+请求总数-1)/请求总数
每秒发出的I/0请求很多,但是平均队列就4,表示这些请求比较均匀,大部分处理还是比较及时。

sar是System Activity Reporter(系统活动情况报告)的缩写。sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,所需的负载很小。sar是目前Linux上最为全面的系统性能分析工具之一,可以从14个大方面对系统的活动进行报告,包括文件的读写情况、系统调用的使用情况、串口、CPU效率、内存使用状况、进程活动及IPC有关的活动等,使用也是较为复杂。

8. sar -n DEV 1

1
2
3
4
5
6
7
8
9
10
[pengzhangjie]$ sar -n DEV 1
Linux 2.6.32-504.16.2.el6.x86_64 (centos) 	09/19/2018 	_x86_64_	(16 CPU)

08:25:37 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
08:25:38 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
08:25:38 PM      eth0   2107.07   1957.58    347.10   1035.85      0.00      0.00      0.00
08:25:38 PM      eth1      4.04      1.01      0.27      0.10      0.00      0.00      0.00
08:25:38 PM      eth2      0.00      0.00      0.00      0.00      0.00      0.00      0.00
08:25:38 PM      eth3      0.00      0.00      0.00      0.00      0.00      0.00      0.00

这个命令可以用于检查网络流量的工作负载:rxkB/s 和 txkB/s,以及它是否达到限额了。上面的例子中,eth0接收的流量达到 2Mbytes/s。

9. sar -n TCP,ETCP 1

1
2
3
4
5
6
7
8
9
[pengzhangjie]$ sar -n TCP,ETCP 1
Linux 2.6.32-504.16.2.el6.x86_64 (centos) 	09/19/2018 	_x86_64_	(16 CPU)

02:49:37 PM  active/s passive/s    iseg/s    oseg/s
02:49:38 PM      2.00      1.00   6753.00   8823.00

02:49:37 PM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s
02:49:38 PM      0.00      0.00      1.00      0.00      1.00

这个命令显示一些关键TCP指标的汇总。其中包括:
active/s:本地每秒创建的TCP连接数(比如connect()创建的)
passive/s:远程每秒创建的TCP连接数(比如accept()创建的)
iseg/s:接收的段(传输层以段为传输单位),单位是:段/s
oseg/s:发送的段

atmptf/s:每秒尝试连接但失败的连接数
estres/s:每秒从ESTABLISHED/CLOSE-WAIT状态转移到到CLOSED状态的TCP连接數目
retrans/s:每秒TCP重传次数
isegerr/s:每秒收到的error的segments數量(比如checksum错误)
orsts/s:每秒送出的的包含RST flag的segments數量

retrans 重传是网络或系统问题的一个信号;它可能是不可靠的网络(比如公网)所造成的,也有可能是服务器已经过载并开始丢包。

10. top

1
2
3
4
5
6
7
8
9
10
11
[pengzhangjie]$ top
top - 20:11:53 up 148 days,  8:10,  2 user,  load average: 0.06, 0.08, 0.03
Tasks: 316 total,   1 running, 315 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.9%us,  0.3%sy,  0.0%ni, 98.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  49290640k total, 11046268k used, 38244372k free,   471000k buffers
Swap:  7813116k total,        0k used,  7813116k free,  5813764k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                  
23715 rabbitmq  20   0 9715m 259m 4212 S 113.4  0.5  29651:55 beam.smp                                                                                                                 
45098 root      20   0 4259m 3.1g 1244 S  3.9  6.6  32:10.98 fts_shared_redi                                                                                                           
23936 root      20   0 1915m  44m 4272 S  2.0  0.1 639:18.96 yyac_worker_ant 

统计信息区:

前五行是当前系统情况整体的统计信息区。下面我们看每一行信息的具体意义。

第一行,任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下:

20:11:53 — 当前系统时间

up 148 days, 8:10 — 系统已经运行了148天8小时10分钟(在这期间系统没有重启过的吆!)

2 users — 当前有2个用户登录系统

load average: 0.06, 0.08, 0.03 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。

load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

第二行,Tasks — 任务(进程),具体信息说明如下:

系统现在共有316个进程,其中处于运行中的有1个,315个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。

第三行,cpu状态信息,具体属性说明如下:

0.9%us — 用户空间占用CPU的百分比。

0.3%sy — 内核空间占用CPU的百分比。

0.0%ni — 改变过优先级的进程占用CPU的百分比

98.8% id — 空闲CPU百分比

0.0% wa — IO等待占用CPU的百分比

0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比

0.2% si — 软中断(Software Interrupts)占用CPU的百分比

第四行 内存状态,具体信息如下:

49290640k total — 物理内存总量(49GB)

11046268k used — 使用中的内存总量(11GB)

38244372k free — 空闲内存总量(38GB)

471000k buffers — 缓存的内存量 (471M)

第五行,swap交换分区信息,具体信息说明如下:

7813116k total — 交换区总量(7.8GB)

0k used — 使用的交换区总量(0K)

7813116k free — 空闲交换区总量(7.8GB)

5813764k cached — 缓冲的交换区总量(5.8GB)

备注:

第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。

对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。

第六行,空行。

第七行以下:各进程(任务)的状态监控,项目列信息说明如下:

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 — 进程名称(命令名/命令行)

其他使用技巧:

  • 多U多核CPU监控,在top基本视图中,按键盘数字“1”,可监控每个逻辑CPU的状况

  • 高亮显示当前运行进程,敲击键盘“b”(打开/关闭加亮效果)

  • 进程字段排序 默认进入top时,各进程是按照CPU的占用量来排序的,敲击键盘“x”(打开/关闭排序列的加亮效果)

  • 通过”shift + >”或”shift + <”可以向右或左改变排序列

  • top交互命令

    在top 命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了s 选项, 其中一些命令可能会被屏蔽。

    h 显示帮助画面,给出一些简短的命令总结说明

    k 终止一个进程。

    i 忽略闲置和僵死进程。这是一个开关式命令。

    q 退出程序

    r 重新安排一个进程的优先级别

    S 切换到累计模式

    s 改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s

    f或者F 从当前显示中添加或者删除项目

    o或者O 改变显示项目的顺序

    l 切换显示平均负载和启动时间信息

    m 切换显示内存信息

    t 切换显示进程和CPU状态信息

    c 切换显示命令名称和完整命令行

    M 根据驻留内存大小进行排序

    P 根据CPU使用百分比大小进行排序

    T 根据时间/累计时间进行排序

    W 将当前设置写入~/.toprc文件中

常用参数

  • 显示 完整命令 top -c
  • 以批处理模式显示程序信息 top -b
  • 以累积模式显示程序信息 top -S
  • 设置信息更新次数 top -n 2
  • 设置信息更新时间 top -d 3
  • 显示指定的进程信息 top -p 574

例:指定显示进程 9836,每隔 5 秒的进程的资源的占用情况

1
# top –d 5 –p 9836 -c
This post is licensed under CC BY 4.0 by the author.