資源使用率
您可以利用這個 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、磁碟輸出入和網路。各直欄名稱是:
- Time:最近摘要行的結束時間。依預設每隔 10 秒採樣一次。
- CPU usage: user:使用者模式 CPU 使用率。這個值是本系統可使用的 CPU 資源總量百分比。舉例來說,配備 8 顆處理器的系統如果使用 50% 的使用者 CPU,代表所有執行中應用程式的 CPU 總使用率等於 4 顆處理器。
- CPU usage: sys:核心模式 CPU 使用率佔可使用 CPU 資源總量的百分比。
- Idle:閒置 CPU 佔可使用資源總量的百分比。
- 300-s avg:過去 300 秒內未使用 CPU 資源的平滑移動平均百分比。(請注意,若您使用 -r 選項調整平均數計算間隔,數值就會有所改變,直欄標題也會跟著改變)。
- 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 的鎖定搶奪。您可以識別可能發生 pthread 鎖定搶奪的程序,方法是檢查 top -d
輸出資料中有大量環境切換的程序(CSW 欄)。一旦您找到出現 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 核心以核心 Mutex 鎖定和讀寫鎖定來管理大部分的多執行緒資源。您可利用 dtrace(1M) 工序指令評估 Mutex 搶奪問題,例如:
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 的核心 Mutex 遭到阻擋,所採用的路徑由 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
。
最後,您可以將 I/O 指定給特定程序,並利用 fs_usage(1)
評估延遲。若要進一步瞭解如何使用 Shark 和 fs_usage(1)
,請參閱這篇 Developer Connection 文件。
網路使用率
很多伺服器在網路上都有多重網路介面與用戶端,而且距離有遠有近,因此性能分析可能極為複雜。不過在 LAN 的情況下,所有用戶端都是透過已知速度的光纖直接連線,因此 top_guide.pl 和 netstat -i
回報的指標可用來分析網路產能的完整使用率。解讀這些數字時,請記住以下準則:
Gb 網路:全雙工,1500 個位元組 MTU
最高速率:小封包:1488 Kpps 762 Mbps
最高峰包速率:1500 個位元組封包:81 Kpps 987 Mbps
(Kpps = 每秒千個封包)
分析網路效能時,檢查 netstat -s
輸出內容,看看有沒有封包重新傳輸率過高的問題(這已超出本文討論範圍),這也會很有用。
更多內容
- 如需監控檔案系統使用的更多資訊,請參閱「檢查檔案系統用途」。
- 如需 Shark time-profiling 工具相關資訊,請參閱「Shark 使用手冊」。
- 如需進一步瞭解如何使用 Dtrace,請參閱「如何使用 Dtrace」。