系统管理员的工具箱:sar

作者: Kyle Rankin

作为一名从事系统管理员工作多年的从业者,我很容易想当然地认为我长期使用的工具每个人都听说过。当然,每天都有新的系统管理员进入这个领域,即使是经验丰富的系统管理员也不都使用相同的工具。考虑到这一点,我决定撰写几篇专栏文章,重点介绍一些常见但容易被忽视的工具,这些工具可以使系统管理员(实际上是任何 Linux 用户)的生活更轻松。我将以一个经典的故障排除工具开始这个系列:sar。

有句老话说:“山中无老虎,猴子称大王。” 这对服务器来说也是如此。服务器似乎总是在您未登录时(通常是在您深度睡眠时)才出现问题。日志可以在很大程度上帮助您隔离过去机器上发生的问题,但如果问题是由于高负载引起的,日志通常不能说明全部情况。在我 2010 年 3 月的专栏文章“Linux 故障排除,第一部分:高负载”(https://linuxjournal.cn/article/10688)中,我讨论了如何使用诸如 uptime 和 top 之类的工具来排除高负载系统的故障。这些工具非常棒,只要系统在您登录时仍然处于高负载状态,但是如果系统在您午休或睡觉时处于高负载状态,您就需要某种方法来从过去提取 top 给您的相同统计信息。这就是 sar 的用武之地。

启用 sar 日志记录

sar 是一个经典的 Linux 工具,它是 sysstat 软件包的一部分,应该可以在几乎所有主要发行版中使用您常用的软件包管理器获得。安装后,它将在基于 Red Hat 的系统上启用,但在基于 Debian 的系统(如 Ubuntu)上,您可能需要编辑 /etc/default/sysstat,并确保 ENABLED 设置为 true。在基于 Red Hat 的系统上,sar 默认记录七天的统计信息。如果您想记录更多天数,您可以编辑 /etc/sysconfig/sysstat 并更改 HISTORY 选项。

一旦 sysstat 配置并启用,它将每十分钟收集一次有关您系统的统计信息,并通过 /etc/cron.d/sysstat 中的 cron 作业将其存储在 /var/log/sysstat 或 /var/log/sa 下的日志文件中。还有一个每日 cron 作业会在午夜之前运行,并轮换当天的统计信息。默认情况下,日志文件将以当月的当前日期进行时间戳标记,因此日志将自动轮换并覆盖一个月前的日志。

CPU 统计信息

在您的系统收集了一些统计信息后,您可以使用 sar 工具来检索它们。当不带其他参数运行时,sar 会显示当天的 CPU 统计信息


$ sar
. . .
07:05:01 PM  CPU  %user  %nice  %system  %iowait %steal  %idle
. . .
08:45:01 PM  all   4.62   0.00     1.82     0.44   0.00   93.12
08:55:01 PM  all   3.80   0.00     1.74     0.47   0.00   93.99
09:05:01 PM  all   5.85   0.00     2.01     0.66   0.00   91.48
09:15:01 PM  all   3.64   0.00     1.75     0.35   0.00   94.26
Average:     all   7.82   0.00     1.82     1.14   0.00   89.21

如果您熟悉命令行工具 top,那么上面的 CPU 统计信息应该看起来很熟悉,因为它们与您从 top 实时获得的统计信息相同。您可以像使用 top 一样使用这些统计信息,只是在这种情况下,您能够查看系统过去的状态,以及统计信息底部的总体平均值,以便您可以了解什么是正常的。因为我之前用整整一篇文章专门讨论了如何使用这些统计信息来排除高负载故障,所以我在这里不再赘述所有内容,但本质上,sar 为您提供了所有相同的统计信息,只是以过去十分钟的间隔提供。

RAM 统计信息

sar 还支持大量不同的选项,您可以使用这些选项来提取其他统计信息。例如,使用 -r 选项,您可以查看 RAM 统计信息


$ sar -r
. . .
07:05:01 PM kbmemfree kbmemused %memused kbbuffers  kbcached  
kbcommit  %commit
. . .
08:45:01 PM    881280   2652840     75.06    355284   1028636   
8336664    183.87
08:55:01 PM    881412   2652708     75.06    355872   1029024   
8337908    183.89
09:05:01 PM    879164   2654956     75.12    356480   1029428   
8337040    183.87
09:15:01 PM    886724   2647396     74.91    356960   1029592   
8332344    183.77
Average:       851787   2682333     75.90    338612   1081838   
8341742    183.98

与 CPU 统计信息一样,在这里我可以查看过去的 RAM 统计信息,类似于我在 top 中可以找到的。

磁盘统计信息

在我的负载故障排除专栏中,我引用 sysstat 作为一个很棒的磁盘 I/O 故障排除工具 iostat 的来源。尽管 iostat 提供了实时的磁盘 I/O 统计信息,但您也可以将 -b 选项传递给 sar,以从过去获取磁盘 I/O 数据


$ sar -b
. . .
07:05:01 PM    tps    rtps    wtps   bread/s   bwrtn/s
. . .
08:45:01 PM   2.03    0.33    1.70      9.90     31.30
08:55:01 PM   1.93    0.03    1.90      1.04     31.95
09:05:01 PM   2.71    0.02    2.69      0.69     48.67
09:15:01 PM   1.52    0.02    1.50      0.20     27.08
Average:      5.92    3.42    2.50     77.41     49.97

我认为这些列需要一些解释

  • tps:每秒事务数。

  • rtps:每秒读取事务数。

  • wtps:每秒写入事务数。

  • bread/s:每秒读取的块数。

  • bwrtn/s:每秒写入的块数。

sar 可以返回比我提到的更多的其他统计信息,但如果您想查看它提供的所有信息,只需传递 -A 选项,它将返回当天所有统计信息的完整转储(或者只是浏览其手册页)。

时光倒流

因此,默认情况下,sar 返回当天的统计信息,但通常您会想要获取过去几天的信息。如果您想通过将今天的数字与过去几天的数字进行比较来查看今天的数字是否正常,或者如果您要排除周末行为异常的服务器的故障,这将特别有用。例如,假设您今天注意到服务器在下午 5 点到 5 点 30 分之间出现问题。首先,使用 -s-e 选项告诉 sar 仅显示您指定的开始 (-s) 和结束 (-e) 时间之间的数据


$ sar -s 17:00:00 -e 17:30:00
Linux 2.6.32-29-server (www.example.net)  02/06/2012   _x86_64_
(2 CPU)

05:05:01 PM  CPU  %user  %nice %system %iowait  %steal  %idle
05:15:01 PM  all   4.39   0.00    1.83    0.39    0.00   93.39
05:25:01 PM  all   5.76   0.00    2.23    0.41    0.00   91.60
Average:     all   5.08   0.00    2.03    0.40    0.00   92.50

要将该数据与不同日期的同一时间段进行比较,只需使用 -f 选项并将 sar 指向 /var/log/sysstat 或 /var/log/sa 下与该日期对应的日志文件之一。例如,要从本月初提取统计信息


$ sar -s 17:00:00 -e 17:30:00 -f /var/log/sysstat/sa01 
Linux 2.6.32-29-server (www.example.net)  02/01/2012   _x86_64_
(2 CPU)

05:05:01 PM  CPU  %user  %nice  %system  %iowait %steal  %idle
05:15:01 PM  all   9.85   0.00     3.95     0.56   0.00   85.64
05:25:01 PM  all   5.32   0.00     1.81     0.44   0.00   92.43
Average:     all   7.59   0.00     2.88     0.50   0.00   89.04

您还可以在从过去的日志文件中提取数据时添加所有正常的 sar 选项,因此您可以运行相同的命令并添加 -r 参数以获取 RAM 统计信息


$ sar -s 17:00:00 -e 17:30:00 -f /var/log/sysstat/sa01 -r
Linux 2.6.32-29-server (www.example.net)  02/01/2012   _x86_64_
(2 CPU)

05:05:01 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  
kbcommit  %commit
05:15:01 PM    766452   2767668     78.31    361964   1117696   
8343936    184.03
05:25:01 PM    813744   2720376     76.97    362524   1118808   
8329568    183.71
Average:       790098   2744022     77.64    362244   1118252   
8336752    183.87

如您所见,sar 是一个相对简单但非常实用的故障排除工具。虽然存在许多其他程序可以从您的服务器中提取趋势数据并将其绘制成图表(我自己也使用它们),但 sar 的优点在于它不需要网络连接,因此如果您的服务器负载过重以至于不再通过网络响应,您仍然有可能使用 sar 获得有价值的故障排除数据。

工具箱图像 通过 Shutterstock.com。

Kyle Rankin 是 Linux Journal 的技术编辑和专栏作家,也是 Purism 的首席安全官。他是 Linux Hardening in Hostile NetworksDevOps TroubleshootingThe Official Ubuntu Server BookKnoppix HacksKnoppix Pocket ReferenceLinux Multimedia HacksUbuntu Hacks 的作者,也是许多其他 O'Reilly 书籍的贡献者。Rankin 经常在安全和开源软件方面发表演讲,包括 BsidesLV、O'Reilly Security Conference、OSCON、SCALE、CactusCon、Linux World Expo 和 Penguicon。您可以在 @kylerankin 上关注他。

加载 Disqus 评论