OS X 服务器:性能评估

这篇文章介绍了如何使用脚本来开始对运行 Mac OS X 服务器 v10.4 或更高版本的服务器进行性能评估。评估主要侧重于确定 CPU、磁盘储存空间和联网资源等重要资源的利用情况。

资源利用情况

你可以使用这个 perl 脚本(名为“top_guide.pl”)来评估服务器在一段时间内对重要资源的利用情况。这个脚本可以在 Mac OS X 服务器 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(CPU 使用率):user(用户):用户模式下的 CPU 利用率。这个值是系统上可用 CPU 资源总量的某一百分比。例如,在配备 8 核处理器的系统上,“50% User CPU”(50% 用户 CPU)表示所有正在运行的应用程序的 CPU 总利用率相当于 4 核处理器。

  • CPU usage(CPU 使用率):sys(系统):内核模式下的 CPU 利用率,以占可用 CPU 总量的百分比表示。

  • Idle(闲置):闲置的 CPU,以占可用资源总量的百分比表示。

  • 300-s avg(300 秒平均):在过去 300 秒内,占未用 CPU 的百分比的平滑平均值。(请注意,如果你使用 -roption 来调整平均间隔,则这个值会发生变化;列标题也会相应更改。)

  • Reads/sec - number(读取/秒 – 次数):采样期间,发出的唯一磁盘读取操作的次数。

  • Reads/sec - MB(读取/秒 – MB):采样期间,从磁盘读取的兆字节总数。

  • Writes/sec - number(写入/秒 – 次数):采样期间,发出的唯一写入操作的次数。

  • Writes/sec - MB(写入/秒 – MB):采样期间,写入的兆字节总数。

  • Net in/sec - pkts(网络输入/秒 – 数据包):采样期间,接收的数据包总数。

  • Net in/sec - Mb(网络输入/秒 – Mb):采样期间,每秒钟通过网络输入的兆位总数。

  • Net out/sec - pkts(网络输出/秒 – 数据包):采样期间,发送的网络数据包总数。

  • Net out/sec - Mb(网络输出/秒 – 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 可能没有得到充分利用:

  • 应用程序线程锁定

  • 内核资源锁定

plockstat(1) 命令在 Mac OS X 10.5 Leopard 中推出,可以针对某个特定应用程序运行,以调查 pthread 锁争用情况。你可以检查进程的 top -d 输出结果是不是包含大量上下文切换(CSW 列),以识别可能具有 pthread 锁争用的进程。在你确定要对哪个进程调查 pthread 锁争用情况后,请使用:# plockstat -C -e 10 -p

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

在这个示例中,脚本报告 375517140 处的内核互斥锁当前在以下路径中被阻止:tcp_output() 调用 tcp_setpersist(),tcp_setpersist() 又调用 ip_output_list()。这两处锁每秒的阻止数量为 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) 的更多信息,你可以参考这篇 Developer Connection 文稿

网络利用率

许多服务器可能有多个网络接口和客户端,这些网络接口和客户端分布在网络上,彼此之间的距离可能并不相等。性能分析可能较为复杂。但是,如果使用的是 LAN(即在已知速度的架构中直接连接到客户端),那么通过 top_guide.pl 以及 netstat -i 报告的指标可深入了解容量得到利用的程度。解读那些数字时,请记住以下准则:

千兆网络 – 全双工、1500 字节 MTU

最大速率 – 小数据包:1488 Kpps 762 Mbps

最大数据包速率 – 1500 字节数据包:81 Kpps 987 Mbps

(Kpps = 每秒千数据包)

分析网络性能时,查看 netstat -s 的输出结果也非常有用,可让你了解超大数据包重新发送率等问题(这不在本文的讨论范围内)。

进一步了解

  • 要进一步了解有关监视文件系统使用情况的信息,请参阅“Examining File System Usage”(检查文件系统使用情况)。

  • 有关 Shark 时间分析工具的信息,请参阅“Shark User Guide”(Shark 使用手册)。

  • 有关如何使用 Dtrace 的更多信息,请参阅“How To Use Dtrace”(如何使用 Dtrace)。

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

发布日期: