2014年4月25日 星期五

Mac OS X 之 SSD 保養 - 適用 Macbook Air, Macbook Pro 等

SSD 擁有相當優異的高效能讀寫效率,但大家都知道 SSD 以 2012 年以前的技術來說,若經常使用,壽命通常大約落在 1-2 年,不如機械式硬碟長。筆者一顆去年買的 Kingston 128GB,差不多 1 年又兩個月就突然宣告掛點,也因此,了解如何保養您的 SSD 是非常重要的一件事情。


Mac OS X 在背後偷偷幫你做的事情:


1. Spotlight 索引


就是你右上角點放大鏡時,會出現的東西,我相信有很多人幾乎都不用這個功能 (我認識的人不是沒在用就是不知道有這個功能),但這個功能預設是開啟的。



雖然你沒用到,但這程式有時候會不停的在背景大量讀取檔案,有時需要電腦做一些較重的工作時,整個系統會變得很吃力。

如果在終端機內輸入 fs_usage ,你會發現有時硬碟大量的讀寫都是來自 mdworker,而這個 mdworker 就是 Spotlight 索引的背景程式。 他會怎麼跑? 你有多少檔案,他就跑多少檔案,不管那些檔案你到底有沒有用到,他都會收納起來放在這個搜尋索引內。

有幾種調校方式:


* 關掉 Spotlight: 如果你完全不使用 Spotlight,則可以考慮把 Spotlight 完全關閉,而 Spotlight 基本上是沒辦法從圖形介面去關閉的,所以你必須先打開你的"終端機",輸入一些指令:

$ sudo mdutil -i off /

這樣可以關閉掉整個本機磁碟的索引。要關掉所有磁碟的索引?

$ sudo mdutil -i off -a


* 關掉平常不搜尋的檔案類型: 點開放大鏡,最下方有一個 Spotlight 設定,點開之後,把不必要的類型都關掉:




* 忽略有零碎小檔的目錄:

2. 關閉 Time Machine 的本機備份模式


Time Machine 的備份方式是這樣的,首先他每個小時會產生一個備份點 (Checkpoint),每 24 個小時,留下一個備份點,過一個月,就留下當月每天的備份點,每個月都留下每週的備份點。當硬碟空間不夠的時候,Time Machine 就會開始問你要不要清除一些太舊的備份點,來獲取更多空間。

而從 Mac OS Lion 版本之後,Mac OS 的 Time Machine 會在你沒有外接硬碟時,在本機建立一整套備份。 (如果你有開 Time Machine 的話)

平常我們都是將資料備份到外接硬碟,外出時也不會帶整個外接硬碟出門,沒接上外接硬碟,Time Machine 就會開始讀取你整顆硬碟的內容,全部備份到 /Volumn/MobileBackups 這個路徑底下。

平常 SSD 空間就很不夠用了,這時候居然還來 Local Backup 全部複製一份寫進 SSD?

剛剛有講到 mdutil 是 Spotlight,要處理 Time Machine 相關設定,把本機備份關掉,可以透過 tmutil:

$ sudo tmutil disablelocal

這樣就可以把本機備份關掉了。

其他 tmutil 相關使用說明,可以用下列指令查詢:

$ man tmutil


另外,如果你在系統偏好設定中變更了 Time Machine 的備份硬碟,或是關閉又打開 了 Time Machine,Time Machine 的本機備份模式就會自動開啟,你必須再執行一次上面的指令才能再次關閉本機備份。



3. 設定 noatime 掛載


首先要先講 noatime,什麼是 noatime?atime 就是指所謂檔案存取時間 (File Access Time),你平日在開啟檔案時,就會更新這個 access time,每更新一次 access time,硬碟就必須讀寫,減少硬碟的壽命。

新版的 Mountain Lion 會在 All Files 分頁或是 Spotlight 內列出所有最近使用的檔案,並且利用這個 access time 做排序。

如果你不需要這個功能,可使用下列步驟來停止使用 Access Time:

$ sudo -i
$ cat > /Library/LaunchDaemons/com.disk.noatime.plist

接著貼上:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>com.disk.noatime</string>
        <key>ProgramArguments</key>
        <array>
                <string>mount</string>
                <string>-vuwo</string>
                <string>noatime</string>
                <string>/</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
</dict>
</plist>



4. 變更睡眠時資料存放的位置



當你闔上螢幕時,Mac OS X 會進入到睡眠模式,此時會將目前在執行中的資料都暫時存放在記憶體中,若快沒電時,則將所有在記憶體內的資料寫入到硬碟,防止資料流失。

若你有 4GB 的記憶體,一次睡眠,有可能會把 4GB 全數寫入硬碟,開機時再全部讀回。

如果你不在乎執行中資料流失的話,可把設定改成睡眠時 "只存放在記憶體中"

可透過下列指令設定:

$ sudo pmset -a hibernatemode 0

其中 "-a" 代表不論是電池模式 (-b)、電源模式 (-c)、UPS 模式 (-u),皆使用此設定。

查看目前模式可輸入:

$ sudo pmset -g


5. 關閉不必要的 Chrome 分頁

你若打開 iotop 查看 I/O 的讀寫狀況,你會發現 Google Chrome 在背景也做了不少 I/O:

2014 Apr 25 11:16:49,  load: 2.21,  disk_r:    720 KB,  disk_w:   1356 KB

  UID    PID   PPID CMD              DEVICE  MAJ MIN D            BYTES
    0     24      1 cfprefsd         ??        1   2 W             4096
  501   8797    383 Google Chrome H  ??        1   2 W             4096
  501   8798    383 Google Chrome H  ??        1   2 W             4096
  501   8799    383 Google Chrome H  ??        1   2 W             4096
  501   4948    209 iTerm            ??        1   2 W            20480
    0    157      1 mds_stores       ??        1   2 R            57344
  501   8797    383 Google Chrome H  ??        1   2 R           126976
  501    221    209 SystemUIServer   ??        1   2 W           200704
  501    383    209 Google Chrome    ??        1   2 R           557056
  501    381    209 iPhoto           ??        1   2 W           585728
  501    383    209 Google Chrome    ??        1   2 W           585728

為什麼呢? 因為 Google Chrome 為了高效的執行效率,所有運算的結果都會儲存成快取資料,執行時因此消耗大量記憶體,當分頁越來越多,Google Chrome 就會開始把沒有調閱的分頁暫時儲存到硬碟裡,等到切換過去時,再將結果全部讀出來。

當然,這只是其中一項原因,以下是幾個 Chrome 相關的 Bug Report 可參考看看:

Heavy I/O generated by chrome during inactivity - what happen/some craches? 

frequent small disk I/O



5. 盡量不要讓記憶體呈現滿載的狀況

現代的操作系統大多會在記憶體不夠使用的時候,將記憶體內未使用到的內容搬動到磁碟裡,等到要使用時,再把另外一份空間寫入 Disk 挪空間出來放要使用的程式。

6. 操作大檔或備份請愛用外接硬碟

覺得一般外接硬碟太慢嗎?用 Time Capsule 備份又不給力一兩年就壞掉嗎?狂推 "WD My Book Thunderbolt Duo 6TB(3TBx2) 3.5吋雙硬碟儲存系統"


透過 Thunderbolt 讓你效能不輸 SSD 又能有極高的穩定性

目前來講,WD, Hitachi 是可靠度最高的兩個硬碟廠牌,backblaze 發佈了一篇文章講述過去 backblaze 使用了兩萬七千顆硬碟壽命之統計記錄:



可參考: http://blog.backblaze.com/2014/01/21/what-hard-drive-should-i-buy/

這邊說明一下為什麼寧可用 WD Thunderbolt Duo 也不要用 AirPort Time Capsule,雖然 Time Capsule 可以用 Wifi 進行 Time Machine 備份,但你若自己去 Google 一下 "AirPort Time Capsule" "無法使用" 或 "壞掉" 你會發現大部分的消費者用了一兩年 Time Capsule 就壞掉了,因為 Time Capsule 為了外型漂亮,散熱做得並不好,一旦長時間複製檔案,很容易就造成過熱的狀況。

而且,看上方硬碟 Failure Rate 你覺得還有什麼牌子能贏過 HITACHI 或 WD 的穩定度嗎?XD

相同的價錢,明明就可以買到更高傳輸效能的 Thunderbolt 儲存設備,且既然都要備份了,備份講究的就是穩定度,還是選個比較靠譜的 WD 比較好。



7. 透過 iotop 觀測

每個人使用電腦的習慣都不同,開發的環境也都不同,最後一道防線就是多利用 fs_usage 與 iotop 等工具來觀察作業系統背景在跑些什麼程式執行了大量了 I/O ,如果你發現了某程式進行大量 I/O 你又很少用的話,就盡可能少開。

一般來說, fs_usage 倒出來的內容太多,很難從幾百幾千行的內容得到一些結論,可利用 iotop 來取得一些 sample 資料:

$ iotop -C 5 12

上面的指令每五秒印出結果,每個循環取得 12 個樣本資料,可印出如下:


Tracing... Please wait.
2014 Apr 25 19:35:38,  load: 2.06,  disk_r:    184 KB,  disk_w:    260 KB

  UID    PID   PPID CMD              DEVICE  MAJ MIN D            BYTES
    0     24      1 cfprefsd         ??        1   2 W             4096
  501    216    209 cfprefsd         ??        1   2 W             4096
    0     20      1 syslogd          ??        1   2 R             8192
  501    241    209 CalendarAgent    ??        1   2 W             8192
  501  12535    209 Mail             ??        1   2 R            20480
  501    241    209 CalendarAgent    ??        1   2 R            49152
  501  16062      1 com.apple.inter  ??        1   2 W            61440
  501  16062      1 com.apple.inter  ??        1   2 R           110592
  501    221    209 SystemUIServer   ??        1   2 W           188416


上面的結果來看,第一行 "disk_r" 是總讀取量, "disk_w" 則是總寫入量

第二行 "PID" 是指該程序的 Process ID,"D" 欄位中 "W" 是寫入, "R" 是 讀取,"BYTES" 欄位則顯示讀出或寫入的位元組數量

以此類推,你可以很容易的找出消耗你 SSD 壽命的罪魁禍首。


8. 透過 Activity Monitor 觀測

Mac OS 內建的 Activity Monitor 其實是一個非常好用的工具,除了拿來看 Disk IO 的狀況,還可以觀測那個 App 消耗最多計算能源 (Computation Power):

點擊 Bytes Written 就可以依照順序排出 I/O 操作最多的應用程式。


以上圖我的狀況來說,因為開機後進行了一些大量檔案複製操作,因此可以忽略 Finder, kernel_task 等的統計數據。 mds_stores 則表示我的 Spotlight 在更新搜尋索引的時候所寫入的容量,再來就是 Google Chrome 的寫入狀況,目前使用狀況大致在 10-12 個分頁左右。

當然每個人操作狀況不同,結果也會不同,就看大家怎麼去優化系統了。