先來貼則小心得--How to minimize the FreeBSD disk activities

42 views
Skip to first unread message

kuli

unread,
Mar 1, 2007, 8:56:46 AM3/1/07
to jengyic's 個人群組
政儀的群組開張,真是可喜可賀!就以年假期間收集的一些小心得和大家分享,來搶個頭香吧,呵呵。

How to minimize the FreeBSD disk activities

動機及背景介紹

無意間發現我的 IBM X31 在同樣全然 idle 下,跑 Windows XP Home 比 FreeBSD 省電 (電池可以撐更久),但
是明明 XP 在 idle 時的 CPU load 較高。仔細觀察才發現,差別在於 XP 在時間到時會把內建的 ATA 硬碟停下來省電,而
FreeBSD 直到現在的 6.2,其 ACPI 的省電功能仍不包含硬碟這一項 (後來在某份 FreeBSD 文件裏得到證實)。要是
FreeBSD 也能在 idle 時把硬碟停下來豈不甚好?

首先我們當然要先問一個問題,那麼辛苦想辦法把硬碟停下來究竟效益有多少?藉由觀察 X31 在 XP 下的 Battery
Information 在各種情況下所顯示的電流值,我的觀察及推測如下:
(1) LCD、硬碟都在運作,電腦大致在 idle 狀況下: 0.8 A
(2) 把 LCD 關掉: 0.55 A
(3) 連硬碟也停下來: 0.45 A
(4) Suspend to RAM: 0.08 A

(1) - (2): LCD 耗電 0.25 A
(2) - (3): 硬碟耗電 0.1 A
(3)- (4): CPU 及主機板零件 0.37 A,RAM 0.08 A

以上觀察當然算不上精確,但若以此為基礎,要是能把硬碟停下來,預計省下電力為 0.1 A / 0.8 A = 12.5%,以 X31 配全新電池
來算的話,續航力相差超過半小時,確實值得投資。

稍一 google,發現要在 FreeBSD 把 ATA 硬碟停下來有簡單的軟體可以做到: /usr/ports/sysutils/
ataidle ,不過問題是手動一把硬碟停下來,大約 15-30 秒硬碟就又會因為存取的動作而「醒」來,反而害硬碟轉轉停停。所以想讓 ATA
硬碟乖乖睡著,減少 FreeBSD 對磁碟的存取頻度勢不可免。


方法

Google 來的資料整理後,能讓 FreeBSD 少動硬碟的四項基本方針如下:
1. sysctl vm.defer_swapspace_pageouts=1
這個 sysctl 變數 default 為 0,意思是一有 pageout 就 swap 到硬碟上。這個值設為 1 後,理論上除非
memory pages 快要用光,不得不把少用的 page swap 進硬碟來騰出空間,不然就盡量撐著不去 swap。
2. 盡量把所有磁碟都 mount -o noatime
加上 noatime 參數,檔案系統就不會在讀取檔案後試圖更新該檔的 access time。atime 的更新向來是磁碟效率的殺手,所
以 FreeBSD 才會導入 SOFTUPDATE,讓 atime 的更新累積一段時間才寫一次。問題是「一段時間後寫一次」就會把睡得正香的硬碟
吵醒,而檔案的讀取勢不可免,一個檔案就算有被 cache 住,讀取時沒有動到真正的硬碟,也還是會引發後續的 atime 更新。所以加上
noatime 可以有效減少這種沒事來兩下的硬碟動作。
3. 把 /tmp 和 /var 弄成 ram disk
/tmp 和 /var 是 system daemon 常要寫入的區域,要是能放在 ram disk (md) 裏,當然能有效減少磁碟動
作。可以自己手動用 mdmfs -S -M -s <size> md <mount point> 掛個 md 上去,或是乾脆在 /etc/
rc.conf 裏加上 tmpmfs 及 varmfs 參數讓系統在開機時自動做 (請 man rc.conf,然後找到 tmpmfs 及
varmfs 的部份)。/tmp 本來就可以從零開始,掛個 md 上去就行了,不過 /var 因為裏頭有既有的資料,是不是可以直接拿個空的
md 掛上去,就要看情況而定了。容後文再討論。
4. 把 syslogd 和 cron 約束一下
syslogd 要是一有風吹草動就要記錄東西,硬碟自然不得安寧。把 /var 放在 md 是個辦法,不然就要調整 /etc/
syslog.conf 讓它安靜一點。要是不在乎毫無 log,可以直接 killall syslogd。cron 每分鐘會執行一次,要是 /
etc/crontab、crontab -e、at queue 裏有定時會啟動的東西,就要考慮是把東西拿掉、或是確保定時啟動的程式只讀不寫
(久了就 cache 住了)、或是只寫入 md。


結果與討論

Short Answer: 管用。只要把 1、2、4 三項做到,硬碟在系統 idle 時就差不多不會再被打擾。本來想認真的分析這四個方法獨立使
用的效果,不過因為觀察硬碟有沒有一段時間後醒來相當費時,而且環境稍微吵雜就可能沒有留意到硬碟起飛的加速聲,所以沒有認真測試。不過感覺起
來,1、2、4 三項對磁碟動作減量的貢獻大致差不多。

跳過 3 沒有提,是因為要把 /var 搬上 md 比較花腦筋,我沒有真正嘗試。替代辦法是我直接手動 killall syslogd ,效果也
很好。/var 裏除了放 log 外,容量佔最多的其實是 packages 的安裝資料。如果把整個 X Window 環境建立到順手,安裝的
packages 資訊很容易多到佔用超過 1G 的 /var 空間,要搬上 md 有困難。有想過而沒有真正試過的方法包括:
(1) 寫個 script,把 /var umount、然後 mount 到別處,把 md mount 上 /var,然後把
packages 以外的東西 cp 過來
(2) 直接使用 FreeBSD 終於管用的 unionfs。如上述把 /var 改 mount 到別處,準備好一個 md 的空間,然後用
unionfs 把這兩者 merge 到 /var。理論上什麼都不用 cp,用到的檔案自己會去讀原本的 /var,寫入都發生在 md 這頭。就
看關機前要不要另外想辦法把 md 裏的更動寫回原本的 /var 去。

使用這幾招後,確實能有效讓 FreeBSD 大幅減少系統本身的磁碟動作,配上 ataidle 後很簡單就可以讓硬碟不動時停下來,達成省電的目
的。我個人一直認為就一台負載很輕的網路 server 而言,特別是家用的環境中,拿像 X31 這樣的筆記型電腦來架站非常理想。原因很簡單:
(1) 非常省電,用了上述的方法後,idle 時的耗電量可以降到 0.45A 以下,乘上額定電壓 10.8V,耗電量 <= 5W。現代的桌上型
電腦開來當 Server,耗電量之大可以想像 (2) 安靜無聲。X31 就算硬碟在轉,也要耳朵貼著機器本體才聽得到運轉聲,等硬碟停下來後,由
於 CPU 風扇在 idle 時不會啟動,整台電腦毫無運動機件,全然無聲。桌上型 Server 就不用說了。

註:可惜這個方法對 SCSI 硬碟無效

Reply all
Reply to author
Forward
0 new messages