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、磁碟輸出入和網路。各直欄名稱是:

  • 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 輸出內容,看看有沒有封包重新傳輸率過高的問題(這已超出本文討論範圍),這也會很有用。

更多內容

對於非 Apple 製造之產品相關資訊,或是非 Apple 控制或測試之獨立網站,不得解釋 Apple 為其推薦或背書。Apple 對於協力廠商網站或產品的選擇、效能或使用,概不負責。Apple 對於協力廠商網站的準確性或可靠性不具有任何立場。使用 Internet 本具風險。如需更多資訊,請聯絡廠商。其他公司及產品名稱可能是其各自擁有者的商標。

發佈日期: