自從蘋果電腦改用Intel處理器之後,除了時脈提高,變成雙核心,在軟體方面也有了方便的VMware Fusion和BootCamp,而且網路上也有人提供在PC上安裝Leopard的方法,因此不少人想養一隻Leopard看看。不過也有人抱著觀望的態度,認為台灣的蘋果使用者畢竟算少數,遇到問題不容易找到朋友幫忙。而網路上常有人抱怨Mac版的MSN不好用,例如無法接受離線留言等等,也有人覺得在蘋果上用AlienBBS和PCMan X for Mac上BBS不方便,比起Open PCMan 2007較不好用。
而且,許多學生常常把電腦當學術機用,也就是跑統計等比較複雜的數學運算或是文書處理,但Mac OS沒有Microsoft Office 2007和Matlab或SAS怎麼辦?其實可以用VMware Fusion執行Winodws版的MSN,拿蘋果當學術機的人,也可以用VMware Fusion或Bootcamp另外灌一個Windows作業系統,來跑對系統資源要求較高的Matlab,而Microsoft Office 2008 for Mac對於Office 2007 for Windows 的相容性也已經比2004高了,對於用不慣iWork '08的人來說,可以選擇Office 2008或是透過虛擬化來跑Office 2007。而現在已經有Nally這套Leopard限定的BBS軟體,能解決以往在PCMan X for Mac和AlienBBS的問題,使用介面的風格也跟Leopard蠻搭的。VMware Fusion目前也改進了Beta版速度緩慢的問題。
Leopard與POSIX的關係
說了這麼多理由,我想還是有很多人卻步,因為平常已經習慣了Windows,即使轉換到Leopard需要的適應時間很短,但是以前慣用的系統效能監控工具,一時之間卻找不到替代軟體。如果不能發揮蘋果的優點,透過系統數據觀察系統執行的效率,趕流行買台蘋果回家淪為高級裝飾品,未免可惜。因此,我們要來談談Leopard的系統監控與效能評估。談Leopard系統的時候最好要有操作UNIX指令的基礎,怎麼說呢?Leopard已經有這麼方便的圖形介面,還學UNIX指令幹嘛?我們要了解,Leopard的架構基本上是UNIX-based的,先看一看蘋果網頁上寫的Leopard三百項新改良,其中關於UNIX的部分:
Leopard為經過完全認證的UNIX作業系統,符合Single UNIX Specification(SUSv3)與POSIX 1003.1規範。
POSIX是Portable Operating System Interface(可移植作業系統介面)的縮寫,而X則表明其對UNIX API的傳承。Windows NT也有部份相容POSIX ,而Linux基本上已經逐步相容POSIX,但沒有參加正式的POSIX認證。只有Leopard是通過完全相容UNIX環境的認證。所以我們可以說,用Leopard學UNIX要比用Linux學還來得方便且容易,因為Leopard就是純正的UNIX系統。也因為Leopard是UNIX,所以除了用Leopard的圖形介面工具,也能學習用UNIX的思維來操作。很多人一定會羨慕UNIX高手,在命令列下劈哩趴啦打了一堆指令,不靠圖形介面就能操作,很酷,但是真正有心要學好像無從下手,這時候,Leopard的終端機搭配其他圖形介面工具就是一個很友善的環境,可供初學者學習UNIX指令。
Leopard通過UNIX的認證標準,是初學者學習UNIX的好環境。
由於程式所使用的Framework限制,Nally只能在Leopard上執行,不過功能及介面都比以往的蘋果BBS軟體完善,字形也能正常顯示,也有反閒置被踢下站的功能。
終端機環境設定
GeekTool:http://projects.tynsoe.org/en/geektool/
在Leopard的三百項新功能清單裡,還有個?目錄工具程式?,能讓使用者在同一個地方圖形化管理所有本機與遠端目錄項目與服務,不必依賴複雜的命令列就能做到。但是習慣用Tiger的人可能會不知道要在這裡改Root的密碼,因為很多系統調校指令需要Root權限才能執行,要在終端機登入成為Root。之前在Mac OS X Tiger上登入Root,只要在終端機中輸入預設密碼即可生效,但是Leopard 不能這麼做,這時就得靠目錄工具程式了。
在Leopard點選「應用程式 > 工具程式 > 目錄工具程式」把左下角的鎖頭打開,然後點選「編輯 > ?用Root使用者 > 輸入密碼」,Root使用者就會顯示在登入視窗裡了。
設定好Root以後,還可以怎麼玩呢?在Mac上有一套跟終端機相關的工具叫GeekTool,可以將log記錄檔或是Unix指令執行後的結果,動態顯示在桌面上,例如每三秒就更新顯示CPU的負載等,就能在桌面上隨時監控系統資源了。
查看執行中的程序
再來看看Leopard的三百項新改良中關於系統資源調配的部分:
多核心最佳化
以改良式排程、記憶體管理,以及處理器關聯演算法,將配備多處理器核心的現代架構效能完全發揮。
不過蘋果並沒有在網頁上公布測試數據,我們可以自行透過Unix指令監控系統資源調配的數據。首先當然是要登入為Root,打開終端機以後,輸入login、輸入root、再輸入密碼,就可以用Root身分登入。再來看看整個系統有哪些程序在執行,這對Windows的使用者很熟悉,在Windows底下同時按「Ctrl + Shift + ESC」,就會跳出工作管理員,點選處理程序的頁面就會列出執行中的程序。而在Leopard則是執行Finder以後,點選應用程式,打開工具程式的資料夾,執行?活動監視器?,或是直接在Spotlight裡輸入?活動監視器?也可以。在Unix環境下,可以輸入top,注意到在top輸入後看到的程序,好像比活動監視器看到的多?因為活動監視器預設只顯示?我的程序?,也就是說只顯示以一般使用者登入身分執行的程序,以Root身分執行的程序是看不到的。還記得剛剛提到的GeekTool嗎?如果讓GeekTool顯示Top的話,就可以在桌面上顯示各個程序占多少記憶體和CPU資源,以隨時監控系統資源的分配。
Groups可以分類指令,將系統調校相關的指令放一類。Enable GeekTool記得打勾才會開始執行。Command欄位能夠輸入指令。右下角的Location則是最後Geektool顯示的地方,預設顯示在螢幕左上角。
fs_usage指令
接著我們輸入fs_usage看看,fs代表 file system,也就是檔案系統,而fs_usage就是檔案系統對於系統資源的使用囉,輸出的欄位分成五個:
1. Timestamp
2. System call
3. 檔案路徑
4. 執行延續時間
5. 程序名稱
其中最有趣的是System call欄位。System call負責使用者程式跟作業系統之間的溝通。當使用者程式需要作業系統提供特定的服務時,就會發出System call,通常是以C或C++寫的程式,也有部分是以組合語言寫成。當Leopard剛灌好的時候,很多人都會感覺到怎麼才剛灌好而已,速度就有點慢?其實這時候Spotlight還在建立索引,執行fs_usage會看到很多System call。
一般人常常只看硬碟讀寫燈亮或不亮來知道系統忙不忙碌,但實際上在做什麼就不清楚了,透過fs_usage可以查看跟硬碟讀寫有關的System call,或是發生分頁錯誤(Page fault)的時候,是出現在記憶體的哪一個片段,格式如A=0xnnnnnnnn,0xnnnnnnnn就是產生Page fault的位址。看完fs_usage以後,可以按Ctrl + C停止,以便繼續輸入其它指令。
執行fs_usage後的結果
vm_stat指令
接著我們要查看Leopard的虛擬記憶體管理,輸入vm_stat(也可以改輸入 vm_stat 1,這樣就會讓每秒更新一次),會有以下幾個欄位被輸出:
1. Pages free
2. Pages active
3. Pages inactive
4. Pages wired down
5. Translation Faults
6. Pages copy-on-write
7. Pages zero filled
8. Pages Reactived
9. Pageins
10. Pageouts
除了統計Page被移進或移出的數目以外,有一個看起來怪怪的「copy-on-write」出現在第六欄。參考關鍵字Page fault的解釋,當錯誤發生,除了要從其他地方取得分頁資料,作業系統必須把資料放到該出現的地方,也就是說要找出當下要存取的分頁在硬碟的哪個地方,載入到記憶體,並且確定以上動作無誤。為了減少Page fault,Leopard使用Copy-on-write的技巧,這在Vista?Linux上也都有用到。Copy-on-write的精神是父程序和子程序會共用Page,這些Page會被標示為Copy-on-write,如果其中一個程序試著寫入分頁,那作業系統就會另外分配一個新的分頁給該程序,這樣一來,只有需要被寫入的分頁會另外分配,其他不需要改變的分頁共享就好了。
執行vm_stat可以得到Pages的詳細統計結果,如果在後面輸入參數,可以每隔幾秒鐘就更新一次,例如輸入「vm_stat 3」代表每三秒鐘更新一次。
監控CPU的工作分配
為什麼作業系統要允許程序去搶CPU資源並協調資源分配呢?因為多工的作業系統允許使用者同時執行很多程式,如果程式是按照先後順序來取得CPU使用權的話,後來執行的程式就得等先到的程式執行完,這並不合理。
所以多工的作業系統是允許程序被其他程序插斷的,翻成英文就是Preemption。但是如果有一個很惡霸的程式,一直插斷別的程序,強行占用CPU,而且它需要CPU的時間很長,在還沒做完他的工作以前就是不把CPU交出來,這樣其他程式會一直得不到CPU的控制權,就永遠無法執行了,所以作業系統要決定什麼時候允許插斷。Context Switch和Preemption有什麼差別?Preemption只是造成Context Switch的原因之一,發生Context Switch的原因有很多,例如等待I/O動作的時候,也可以觀察到Context Switch的數值比Preemption來得高。
比方把電腦看成是一家銀行,銀行櫃台小姐就是CPU,每個櫃台前面的顧客就是程序。由於銀行櫃台小姐的數目可能比櫃台數目少,為了達到最高辦事效率,避免有些櫃檯小姐很閒、有些很忙,還有縮短每個顧客的等待時間,銀行經理交代櫃台小姐務必得在各個櫃台間切換,這樣一來櫃台小姐就會評估哪個工作比較快完成就先做,降低排隊顧客的平均等待時間,而且櫃台小姐還要將手上的工作分割,有些工作可能做到一半,要等其他人接力完成才能繼續,這時候就可以先放下手邊的工作去服務別的顧客。但是暫停之前一定要很清楚手上的工作做到哪裡,這就是Context Switch的目的。當然這只是個譬喻,實際上銀行是根據抽號碼牌的方式來服務顧客的。
sc_usage Finder指令
接下來輸入「sc_usage Finder」,這樣就可以看到Finder發生了幾次Preemption、Context Switch、有幾個線程、產生幾次Page fault、幾次System call。可以做一個小實驗,全選某個資料夾下的所有檔案,然後按下「Command + O」,Finder就會呼叫各種副檔名的預設開啟程式,同時開啟這些檔案,是不是發現Preemption和Context Switch暴增阿?我們知道Leopard是多工的作業系統,但是一般情況下CPU只有一顆,一定要將控制權在各個不同的程序下切換,當切換CPU控制權的時候,一定要想辦法各種執行中的程序狀態記住,不然就做白工了,包括有:
1. 程序狀態
2. 程式計數器
3. CPU暫存器
4. CPU排程相關資訊
5. 記憶體管理資訊
6. 統計資訊
7. I/O狀態資訊
這些都會記在「Process Control Block」。這樣CPU切換回來的時候,才可以跟之前的工作進度銜接上,以便繼續執行。
結語
Mac Pilot:http://www.koingosw.com/products/macpilot.php
Leopard有分單機版跟伺服器版,兩者都常常會用到遠端遙控。網管人員得監控伺服器的系統資源,以免在服務的尖峰時刻讓使用者覺得系統速度太慢。而單機版則是將電腦放在公司或學校,等回家再利用遠端遙控控制,要知道,遠端遙控如果透過圖形化的介面來操作,效率是很低的,尤其是主控端,發出一個指令例如移動一下滑鼠,可能都會感受到嚴重的延遲,更不用說是執行更複雜的動作了。所以很多人會選擇用PuTTY以Telnet的方式登入,用終端機來控制Leopard。不管怎麼樣,玩Leopard不學點UNIX指令,可就不能稱為Power user了。
有了UNIX指令操作的基礎,相信讀者已經學會下什麼命令觀察,能詳細評估系統效能,以後有機會,我們會來介紹有哪些圖形化工具可以調校Leopard。而如果想進一步查詢各個指令的用法,可以安裝Mac Pilot,打開使用手冊查詢。
,b>關鍵字:分頁錯誤
想想看,作業系統是怎麼把程式從硬碟載入到記憶體?應該不可能是全部都載入吧,是不是程式容量超過記憶體大小就不能執行呢?很多大型的遊戲,主程式大小可能超過256MB,卻還是可以在256MB主記憶體的電腦上玩,實際上作業系統會把記憶體分割成小片段,稱為分頁(Page),選擇性地載入程式會用到的部分,這稱為?需求分頁(demand paging)?技術。當程序執行時,試圖去存取一個不在記憶體中的Page就會產生分頁錯誤(Page fault)。為什麼會有Page fault?因為記憶體有限,作業系統要去預測有什麼Page是將來用不到的,將它們從記憶體裡移除,以載入其他程序。但畢竟我們無法預測未來,只能用一些策略去猜,例如?最近最少使用的?(LRU,Least-recently-used)演算法,所以有可能猜錯,造成Page fault。
為什麼要關心Page fault呢?因為產生Page fault的代價很大,某個程序產生Page fault就會去搶其他程序的Page,有可能造成其他程序跟著出錯,如果作業系統沒有處理好,就會浪費很多時間處理,讓CPU的實際使用率下降。同時開啟多個應用程式很容易造成Page fault,因此系統會變得異常慢,稱為?Thrashing?,解決的辦法為關掉部分程序。