「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: 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:取樣期間從磁碟讀取的總 MB 數。

  • Writes/sec - number:取樣期間發出的獨有寫入操作數量。

  • Writes/sec - MB:取樣期間寫入的總 MB 數。

  • Net in/sec - pkts:取樣期間接收的總封包數。

  • Net in/sec - Mb:取樣期間每秒的總網路輸入 Mbit 數。

  • Net out/sec - pkts:取樣期間傳送的總網路封包數。

  • Net out/sec - Mb:取樣期間每秒的總網路輸出 Mbit 數。

工序指令提供的其他選項包括:

  • -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

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 核心透過核心互斥鎖(Mutex)和讀寫鎖來管理大部分的多執行緒資源。你可以透過如下的 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

最後,你可以將 I/O 歸因於特定程序,並使用 fs_usage(1) 來評估延遲。若要進一步了解如何使用 Shark 和 fs_usage(1),請參閱這份開發者連線文件

網路使用率

許多伺服器可能有多個網路介面和用戶端散佈在網路上的各種不同距離。效能分析可能會很複雜。然而,在 LAN 中,用戶端在已知速度結構中直接連線的情況下,top_guide.pl 回報的指標以及 netstat -i 都會提供容量使用率的深入解析。在解讀這些數字時,請記得以下準則:

Gigabit 網路 - 全雙工,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 對於第三方網站的準確性或可靠性不做任何保證。如需其他資訊,請聯絡廠商

發佈日期: