OS X Server:评估性能

本文介绍了您该如何使用脚本开始评估运行 Mac OS X Server v10.4 或更高版本的服务器性能。重点在于确认主要资源的利用情况:CPU、磁盘存储情况和联网情况。

资源利用情况

您可以使用此 perl 脚本(名为“top_guide.pl”)来评估服务器上一段时间内主要资源的利用情况。此脚本适用于 Mac OS X Server v10.4 及更高版本。

该脚本会运行 top -d,但会提取和总结一段时间内主要资源的利用情况。top_guide.pl 的输出结果不含参数,与以下内容类似:

--------  -----------  ------------  -------------  -------------  -------------  -------------  ------
          CPU usage:          300-s  Reads/sec:     Writes/sec:    Net in/sec:    Net out/sec:   kernel
Time:     user  sys    Idle   avg.   number MB      number MB      pkts   Mb      pkts   Mb      CPU%
--------  ----- -----  -----  -----  ------ ------  ------ ------  ------ ------  ------ ------  ------
08:44:36    0.1   0.1   99.8   99.8       0    0.0       0    0.0      11    0.0       0    0.0     0.4
08:44:46    0.1   0.3   99.6   99.8       0    0.0       0    0.1      12    0.0       0    0.0     0.4
08:44:56    0.0   0.2   99.8   99.8       0    0.0       0    0.0      17    0.0       0    0.0     0.4
08:45:06    0.0   0.2   99.8   99.8       0    0.0       0    0.0       6    0.0       0    0.0     0.4
08:45:16    0.0   0.2   99.8   99.8       0    0.0       0    0.0       9    0.0       0    0.0     0.4
08:45:26    8.7  24.6   66.7   98.6      43    0.8      98    0.6     803    1.0    1399    1.1     5.0
08:45:37    5.7  83.6   10.7   95.7      48    0.4    1085  116.9   95366 1053.1   61830   35.4    72.4
08:45:47   11.5  88.5    0.0   92.4      23    0.2    3228  426.9  337955 3843.6  207872  114.0   284.8
08:45:58    4.6  95.4    0.0   89.0       4    0.0     594  596.7  447499 5215.5  266449  140.9   370.0

您可以看到确认了三个主要方面:CPU、磁盘 I/O 和联网。各栏内容如下:

  • Time:最新摘要行的结束时间。默认情况下,采样时间间隔为 10 秒。
  • CPU usage: user:用户模式下的 CPU 利用率。该值是占此系统上可用 CPU 资源总量的百分比。例如,在 8 核处理器系统上,50% 的用户 CPU 表示所有运行中应用软件的 CPU 总利用率相当于 4 核处理器。
  • CPU usage: sys:内核模式下的 CPU 利用率,表示占可用 CPU 总量的百分比。
  • Idle:闲置的 CPU,表示占可用资源总量的百分比。
  • 300-s avg:最近 300 秒内占未使用 CPU 的百分比的平滑平均值。(请注意,如果您使用 -roption 来调整平均间隔,则结果有所不同;栏标题也会产生相应的变化。)
  • Reads/sec - number:采样期间产生的唯一磁盘读取操作的次数。
  • Reads/sec - MB:采样期间从磁盘读取的兆字节总数。
  • Writes/sec - number:采样期间产生的唯一写入操作的次数。
  • Writes/sec - MB:采样期间写入的兆字节总数。
  • Net in/sec - pkts:采样期间接收的数据包总数。
  • Net in/sec - Mb:采样期间每秒的网络输入兆位总数。
  • Net out/sec - pkts:采样期间发送的网络数据包总数。
  • Net out/sec - Mb:采样期间每秒的网络输出兆位总数。

该脚本提供的其他选项包括:

  • -h:显示完整的使用信息。
  • -o filename:将制表符分隔的输出结果副本置于一个文件中。此输出格式适用于导入电子表格或其他数据分析脚本。第一行包含栏标头,以确保始终提供自描述性输出结果。
  • -d:显示日期和时间戳。对于长期登录一个服务器而管理员想要留存历史记录的情况,此选项特别有用。
  • -S processNames:监控单一实例进程。如果服务器上仅有单一进程 ID 的特定服务尤为值得关注,则此选项很有用。例如主要用作 AFP 服务器的服务器。在这种情况下,可使用参数 -S AppleFileServer 针对 AppleFileServer 进程的用户 CPU 利用率添加单独一栏。以逗号分隔进程名称可列出多个进程。
  • -M processNames:类似于 -S,应用软件使用多个进程时的使用情况除外。例如 smbd,每次连接时都需要一个。在主要用于 Samba 的系统上,使用 -M smbd 调取一栏,总结所有 Samba 活动的用户 CPU 使用情况。

尽管本文不含服务器性能的完整分析,但 top_guide.pl 的输出结果提供了系统上 CPU、磁盘和网络资源使用情况的摘要。将其与硬件及系统负载进行对比,以便管理员决定哪方面需要更为详细的调查。下文介绍了可能有助于调查每一方面的一些其他工具。

CPU 利用率

如果 CPU 利用率较高,则调查的主要途径是提高应用软件的效率。这不在本文讨论范围内;但是,有时候 CPU 并未处于使用状态。可使用多种工具帮助您调查网络和磁盘资源足以用于更高的负载,但大量 CPU 仍处于闲置状态的情况。

以下两种情况的 CPU 利用率可能较低:

  • 应用软件线程锁定
  • 内核资源锁定

可针对某个特定应用软件运行 Mac OS X 10.5 Leopard 中引入的 plockstat(1) 命令,以调查 pthread 锁争用的情况。您可以检查 top -d 输出结果,找到上下文切换(CSW 栏)次数较多的进程,从而确认可能存在 pthread 锁争用问题的进程。确认要调查的进程存在 pthread 锁争用问题后,请使用: # plockstat -C -e 10 -p <pid>

 Mutex block
   
   Count     nsec Lock                       Caller
   -------------------------------------------------------------------------------
  8540    29622 0x805eb0                     a.out`process_request+0x3d1
  8361    28284 0x805eb0                     a.out`release_block+0xac
  
 R/W reader block
 
 Count     nsec Lock                         Caller
 -------------------------------------------------------------------------------
     1  3014987 0xa781e8                     a.out`key_find+0x121
     5    78831 0xa3d158                     a.out`key_find+0x121
     2   120532 0xa3d158                     a.out`key_delete+0x137
 
 R/W writer block
 
 Count     nsec Lock                         Caller
 -------------------------------------------------------------------------------
    10  5336318 0xa781e8                     a.out`key_replace+0x80
    13  3827632 0xa75fe8                     a.out`key_replace+0x80
     3  3644946 0xa5fde8                     a.out`key_create+0x37
     6   161055 0xa3d158                     a.out`key_replace+0x80
     1   785267 0xa37758                     a.out`key_create+0x37

您可以检查此输出结果,并查看被各种锁阻塞的 nsec 总量。如果相较于总数而言此值很高,则锁争用会影响执行时间。该信息可帮助应用软件开发者确定并改进应用软件的性能。如果符号可用,则“Caller”字段将包含被阻止的功能的符号名称。此外,如果阻塞的总次数很高(约每秒 250 次以上),则会因线程间的重新调度而降低效率。尽管尚不足以断定这就是性能的限制因素,但高阻塞率确实有待调查,因为大多数情况下,这表明应用软件可能不够高效。

有时内核中的资源会出现资源争用问题。Mac OS X 内核管理大多数带有内核互斥锁和读写锁的多线程资源。可通过如下 dtrace(1M) 脚本来评估互斥锁争用情况:

lockstat:::adaptive-block

{

        @often[arg0, stack(5)] = count();

}


profile:::tick-5sec

{

        normalize(@often, 5);

        printa(@often);

}

此脚本会打印一个分类表,其中争用最频繁的锁和路径排在每项输出结果最后,该结果在采样五秒后打印。输出结果示例为:

        375517140

              mach_kernel`lck_mtx_lock_wait_x86+0x1c7

              mach_kernel`lck_mtx_lock+0x217

              mach_kernel`ip_output_list+0xd34

              mach_kernel`tcp_setpersist+0x18b

              mach_kernel`tcp_output+0x17a0

                0

        375571960

              mach_kernel`lck_mtx_lock_wait_x86+0x1c7

              mach_kernel`lck_mtx_lock+0x217

              mach_kernel`vnode_ref+0x32

              mach_kernel`fcntl_nocancel+0x4b3

              mach_kernel`unix_syscall64+0x26d

                0

在这种情况下,脚本将报告通过 tcp_output() 调用 tcp_setpersist()(后者会调用 ip_output_list())的路径阻塞了位于 375517140 的内核互斥锁。这两个锁上每秒的阻塞次数均为 0,因此不存在锁争用问题。请注意,这一脚本格式不会针对单个锁计算所有实例总数。如果将脚本更改为:

lockstat:::adaptive-block

{

        @often[arg0] = count();

}


profile:::tick-5sec

{

        normalize(@often, 5);

        printa(@often);

}

输出结果可能会变为:

       1301055072                9

       1417504384                9

        353318336               10

        359381776               10

       1301055088               11

          5387344              165

这表示只有位于内核地址 5387344 的锁存在明显的争用情况,并且即便如此也无需太过担心,因为其不满 250。

最后,将脚本按照如下所示稍作更改,即可着重评估读写锁:

lockstat:::rw-block

{

    @often[arg0, stack(4)] = count();

}


profile:::tick-5sec

{

    normalize(@often, 5);

    printa(@often);

    clear(@often);

}

使用 dtrace(1M) lockstat 脚本和 plockstat(1) 时需要记住下列内容:

  • 收集锁定统计数据会影响性能。这些工具可能会使系统速度变慢。小心运行这些工具,记住性能影响会增加正常运行时不存在的争用问题。
  • 某些设计不受锁阻塞影响。考虑在变化非常缓慢的资源上使用锁,即可选择用锁进行管理。可在适当的位置保留锁,以等待完成长时间运行操作。

此类实例需要占用较长的保留时间,实际可能不会降低性能。

磁盘利用率

iopending(1) 以队列深度直方图形式指示 I/O 队列的深度。例如:

2008 May 21 10:35:26,  load: 0.99,  disk_r:      0 KB,  disk_w:    392 KB
           value  ------------- Distribution ------------- count   
             < 0 |                                         0       
               0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9298    
               1 |                                         12      
               2 |                                         5       
               3 |                                         4       
               4 |                                         2       
               5 |                                         3       
               6 |                                         2       
               7 |                                         2       
               8 |                                         3       
               9 |                                         2       
              10 |                                         3       
              11 |                                         2       
              12 |                                         2       
              13 |                                         2       
              14 |                                         2       
              15 |                                         0       

这表示某些磁盘活动,但不用担心,因为几乎所有 I/O 队列深度都为 0。此外,您还可以使用 iopending 来着重评估某个特定磁盘或文件系统宗卷。例如,要着重评估“/Volumes/MyRAID”,请使用 iopending -m MyRAID

最后,您可以使用 fs_usage(1)将 I/O 归为特定进程并评估延迟。您可以通过以下文稿了解有关使用 Shark 和 fs_usage(1) 的更多信息:开发者连接文稿

网络利用率

许多服务器可能有多个网络接口,且网络上的不同位置有多个客户端。性能分析可能非常复杂。但是,在使用 LAN 的情况下,即在速度已知的构架间直接连接客户端,通过 top_guide.pl 报告的指标以及 netstat -i 可了解容量利用情况。解释这些数字时请谨记下列准则:

千兆位网络 - 全双工、1500 字节 MTU
最高速率 - 小数据包:    1488 Kpps   762 Mbps
最高数据包速率 - 1500 字节数据包:  81 Kpps   987 Mbps
(Kpps = 每秒千计的数据包)

分析网络性能时,检查 netstat -s 输出结果,看是否存在超大数据包重新传输速率等问题(不在本文讨论范围内),这也很有用。

了解详情

有关非 Apple 制造的产品或非 Apple 控制或测试的独立网站的信息仅供参考,不代表 Apple 的任何建议或保证。Apple 对于第三方网站或产品的选择、性能或使用不承担任何责任。Apple 对于第三方网站的准确性和可靠性不作任何担保。互联网的使用具有一定风险。请联系供应商以了解其他信息。其他公司和产品名称可能是其各自所有公司的商标。

发布日期: