调优: 使用sar收集系统性能数据

Posted by fishcried on December 15, 2014

sar是一个非常优秀的工具,为什么那?

  1. 一站式服务.sar基本可以获取各个子系统的信息.主要是读取proc文件系统,然后解析.有种一sa在手,天下我有的感觉.
  2. sar每个10分钟就将统计信息写入统计文件,任何时候你都可以查看.信息收集这一点非常重要,系统出问题的时候常常向前回溯的.

当然,sar由于提供”一站式”服务,所以选项非常多,掌握起来有点麻烦,不过有个印象即可,随时换出你的男仆就好了.下面一张sar的总结图非常精彩,出自大神Brendan Gregg.

Berendan Gregg大牛总结的图

通过这张图可以看到,sar获取的信息覆盖了各个子系统.

1. sar选项总结

常用格式

sar [options] [-A] [-o file]  t      [n]
#             全部           间隔    次数
  • 控制选项
    • -s [hh:mm:ss]: 设置报告显示的开始时间
    • -e:设k显示报告的结束时间
    • -f:从指定文件提取报告
    • -i:设状态信息刷新的间隔时间
  • 内存管理
    • -B: 显示换页状态
    • -H: 大页统计
    • -r: 报告内存信息
    • -R:显示内存状态
    • -S: swap使用信息
    • -W: 交换统计
  • cpu与调度相关
    • -P {cpu [,…] | ALL}:报告CPU的状态
    • -q: 报告运行队列信息
    • -u [ALL]:显示CPU利用率
    • -w:显示进程创建与交换信息
    • -I {int [,…] | SUM | ALL | XALL}: 显示中断情况
  • 文件系统
    • -b: 显示I/O速率
    • -d:显示每个块设备的状态
    • -v:显示索引节点,文件和其他内核表的状态
    • -n NFS
    • -n NFSD
  • 网络系统
    • -n { keyword [,…] | ALL } :显示网络信息. keyword(DEV,EDEV,NFS,NFSD,SOCK,IP,EIP,ICMP,EICMP,TCP,ETCP,UDP…)
  • 其他
    • -A:显示所有的报告信息
    • -m { keyword [,…] | ALL} 显示电源信息.keyword(CPU,FAN,FREQ,IN,TEMP,USB)
    • -y: tty设备

2. SAR使用举例

2.1 cpu调度评估

1 sar -P ALL 1 1或者sar -u 1 1查看cpu整体状态

root@kali:~# sar -P ALL 1 1
Linux 3.14-kali1-amd64 (kali)   12/15/2014      _x86_64_        (4 CPU)

01:33:47 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
01:33:48 PM     all      1.25      0.00      0.25      0.00      0.00     98.50
01:33:48 PM       0      0.00      0.00      1.00      0.00      0.00     99.00
01:33:48 PM       1      4.00      0.00      0.00      0.00      0.00     96.00
01:33:48 PM       2      1.00      0.00      0.00      0.00      0.00     99.00
01:33:48 PM       3      0.00      0.00      1.98      0.00      0.00     98.02

Average:        CPU     %user     %nice   %system   %iowait    %steal     %idle
Average:        all      1.25      0.00      0.25      0.00      0.00     98.50
Average:          0      0.00      0.00      1.00      0.00      0.00     99.00
Average:          1      4.00      0.00      0.00      0.00      0.00     96.00
Average:          2      1.00      0.00      0.00      0.00      0.00     99.00
Average:          3      0.00      0.00      1.98      0.00      0.00     98.02

-u选项显示的整体的情况, -u ALL会显示更多列的信息哦,-P可以分core来显示.关于cpu利用率启示需要关注user,system,iowait字段.

  • user高 用户空间进程造成
  • system高 系统调用频繁 可以用strace等工具进一步查看那个系统造成,程序是否需要优化
  • iowait io可能存在问题 可以利用iostat -x,sar -d,iotop进一步查看
  1. steal只有在虚拟机中才有可能有值,表示被hyperv偷走的时间

2 sar -q 1 1查看调度情况

root@kali:~# sar -q 1 1
Linux 3.14-kali1-amd64 (kali)   12/15/2014      _x86_64_        (4 CPU)

01:35:16 PM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
01:35:17 PM         0       486      0.15      0.24      0.27         0
Average:            0       486      0.15      0.24      0.27         0
项目 说明
runq-sz 运行队列长度
plist-sz 任务列表中的任务数,包含了线程
ldavg-1/5/15 均衡负载
blocked 当前被io阻塞的任务数

3 sar -w 1 3查看进程的创建与上下文交换情况

root@kali:~# sar -w 1 3
Linux 3.14-kali1-amd64 (kali)   12/15/2014      _x86_64_        (4 CPU)

02:00:00 PM    proc/s   cswch/s
02:00:01 PM      5.00   1784.00
02:00:02 PM      0.00    684.00
02:00:03 PM      0.00    616.00
Average:         1.67   1028.00

4 sar -I ALL 3 1查看中断情况

root@kali:~# sar -I ALL 1 1
Linux 3.14-kali1-amd64 (kali)   12/15/2014      _x86_64_        (4 CPU)

01:32:15 PM      INTR    intr/s
01:32:16 PM         0      0.00
01:32:16 PM         1      0.00
01:32:16 PM         2      0.00
01:32:16 PM         3      0.00
01:32:16 PM         4      0.00
01:32:16 PM         5      0.00
01:32:16 PM         6      0.00
01:32:16 PM         7      0.00
01:32:16 PM         8      0.00
01:32:16 PM         9      0.00
01:32:16 PM        10      0.00
01:32:16 PM        11      0.00
01:32:16 PM        12      0.00
01:32:16 PM        13      0.00
01:32:16 PM        14      0.00
01:32:16 PM        15      0.00

2.2 内存相关

1. sar -r 1 1 查看内存使用状况

root@kali:~# sar -r 1 1
Linux 3.14-kali1-amd64 (kali)   12/15/2014      _x86_64_        (4 CPU)

02:02:26 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact
02:02:27 PM   1506888   2448124     61.90    134384    815160   3770280     31.07   1528428    712184
Average:      1506888   2448124     61.90    134384    815160   3770280     31.07   1528428    712184
项目 说明
kbmemfree 可使用的内存(单位k)
kbmemused 已经使用的内存 (单位k)
%memused 使用内存的百分比
kbbuffers buffers占用的内存
kbcached cached占用的内存
kbcommit 当前需要的RAM+swap量
%commit 百分比
kbactive 活跃内存量
kbinact 非活跃内存量

2. sar -R 1 1

root@kali:~# sar -R 1 1
Linux 3.14-kali1-amd64 (kali)   12/15/2014      _x86_64_        (4 CPU)

02:02:34 PM   frmpg/s   bufpg/s   campg/s
02:02:35 PM  -1738.00      0.00   1940.00
Average:     -1738.00      0.00   1940.00
项目 说明
frmpg/s 每秒空闲页数,负值表示系统申请了
bufpg/s 每秒buffer占用的页数
campg/s 每秒cache占用的页数

3. 查看swap使用状况

root@kali:~# sar -S 1 1
Linux 3.14-kali1-amd64 (kali)   12/15/2014      _x86_64_        (4 CPU)

02:03:35 PM kbswpfree kbswpused  %swpused  kbswpcad   %swpcad
02:03:36 PM   8178684         0      0.00         0      0.00
Average:      8178684         0      0.00         0      0.00


root@kali:~# sar -W 1 1
Linux 3.14-kali1-amd64 (kali)   12/15/2014      _x86_64_        (4 CPU)

02:03:42 PM  pswpin/s pswpout/s
02:03:43 PM      0.00      0.00
Average:         0.00      0.00

4. sar -B 1 3查看换页统计

root@kali:~# sar -B 1 3
Linux 3.14-kali1-amd64 (kali)   12/15/2014      _x86_64_        (4 CPU)

11:19:42 AM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
11:19:43 AM      0.00      0.00    168.00      0.00    101.00      0.00      0.00      0.00      0.00
11:19:44 AM      0.00     12.00    115.00      0.00    107.00      0.00      0.00      0.00      0.00
11:19:45 AM      0.00      0.00    158.00      0.00    119.00      0.00      0.00      0.00      0.00
Average:         0.00      4.00    147.00      0.00    109.00      0.00      0.00      0.00      0.00
项目 说明
pgpgin/s 每秒从磁盘paged到内存的kilobytes
pgpgout/s 每秒paged到磁盘的kilobytes
fault/s 每秒page faults数量(major +minor)
majflt/s major faults number per second
pgfree/s free pages number per second
pgscank/s Number of pages scanned by the kswapd daemon per second
pgscand/s Number of pages scaned directly per second
pgsteal/s 每秒从pagecache和swapcache回收的pages
%vmeff pgsteal / pgscan

2.3 io系统评估

1. sar -b 1 3查看io请求

root@kali:~# sar -b 1 3

Linux 3.14-kali1-amd64 (kali)   12/15/2014      _x86_64_        (4 CPU)

11:11:31 AM       tps      rtps      wtps   bread/s   bwrtn/s
11:11:32 AM      0.00      0.00      0.00      0.00      0.00
11:11:33 AM     18.00      0.00     18.00      0.00    152.00
11:11:34 AM      0.00      0.00      0.00      0.00      0.00

Average:         6.00      0.00      6.00      0.00     50.67
项目 说明
tps 每秒向物理设备发起的I/O请求数,iops
rtps 每秒向物理设备发起的读I/O请求数
wtps 每秒向物理设备发起的写I/O请求数
bread/s 每秒从物理设备去读的块个数
bwrtn/s 每秒从物理设备去写的块个数

2. sar -d 1 3查看块设备性能

root@kali:/etc/cron.d# sar -d 1 3
Linux 3.14-kali1-amd64 (kali)   12/15/2014      _x86_64_        (4 CPU)

11:05:06 AM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
11:05:07 AM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

11:05:07 AM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
11:05:08 AM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

11:05:08 AM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
11:05:09 AM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
Average:       dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
项目 说明
tps 每秒向物理设备发起的I/O请求数
rd_sec/s 每秒读取的扇区数
wr_sec/s 每秒写入的扇区数
avgrq-sz 设备扇区请求的平均大小
avgqu-sz 设备队列请求的平均大小
await 平均每次io设备操作的等待时间,毫秒
svctm 平均每次io设备操作的服务时间,毫秒
%util 设备io请求期间的cpu时间的百分比,一秒钟百分之几的时间用于io操作

一般比较关注svctm,await.一般svctm小于await.如果两者接近,表示io基本没有等待,性能很好.如果await远远大于svctm,可能是io队列较长.如果util比较接近100%,表示系统满载,可能磁盘性能存在性能瓶颈.

iostat -x也能提供详细的io信息.

3. sar -v 1 1查看索引信息

root@kali:/etc/cron.d# sar -v 1 1
Linux 3.14-kali1-amd64 (kali)   12/15/2014      _x86_64_        (4 CPU)

02:20:54 PM dentunusd   file-nr  inode-nr    pty-nr
02:20:55 PM    104936      7904     46795        16
Average:       104936      7904     46795        16
项目 说明
dentunusd Number of unused cache entries in the direcotry cache
file-nr Num ber of file handlers used by the system
inode-nr Number of inode handlers used by the system
pty-nr Number of pseudo-terminals used by the system.

2.4 网络相关

1. sar -n DEV查看网口数据统计

root@kali:~# sar -n DEV 1 1
Linux 3.14-kali1-amd64 (kali)   12/15/2014      _x86_64_        (4 CPU)

02:30:10 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
02:30:11 PM      eth0     28.00     20.00      7.87      1.43      0.00      0.00      0.00
02:30:11 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:30:11 PM    virbr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:30:11 PM     wlan0      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
Average:         eth0     28.00     20.00      7.87      1.43      0.00      0.00      0.00
Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:       virbr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:        wlan0      0.00      0.00      0.00      0.00      0.00      0.00      0.00

sar -n EDEV可以查看错误统计.

2. sar -n SOCK查看sock统计

root@kali:~# sar -n SOCK 1 1
Linux 3.14-kali1-amd64 (kali)   12/15/2014      _x86_64_        (4 CPU)

02:32:01 PM    totsck    tcpsck    udpsck    rawsck   ip-frag    tcp-tw
02:32:02 PM       618        31         3         0         0         0
Average:          618        31         3         0         0         0
root@kali:~#

可以通过关键字IP,ICMP,TCP,UPD查看各个协议的情况,前面加上E表示错误统计.

3. 数据可视化

将sar数据可视化很诱人啊,sadf能够将/var/log/sysstat/saNN数据转换成各种格式,python将格式化的数据进行可视化并不难.既然我有这个想法,那么有没有人已经实现了那?到github search一下,发现确实有几个项目.

大概看了一下几个项目,都是几年前的.没由来啊,可视化sar数据需求应该很强烈的,又翻了翻,终于发现了ksar.这个东西不进行详细介绍了,可以参考使用 ksar 工具分析系统性能 .贴一张图,表示我确实用过.

ksar

4. 问题

1.手动建立数据文件

执行sar命令需要使用/var/log/saNN文件,nn为日期,可以使用sar -o建立

2.版本问题

如果遇到参数不同,可以升级到最新版本,当前最新版本为11.0.2.不过本篇中使用的是10.0.5.最新版本提供了irqstat,irqtop试用命令.

5. 推荐文档

  1. sar访谈,入门很好
  2. 10 Useful Sar (Sysstat) Examples for UNIX / Linux Performance Monitoring,geek stuff网站的
  3. 使用 ksar 工具分析系统性能

变更记录

Why Who When
记录sar的选项 fishcired 2014-11-05
添加举例,与ksaZ fishcired 2014-12-15