文件系統(tǒng)是 Linux 系統(tǒng)的重要組成部分,文件系統(tǒng)的配置和使用對整個系統(tǒng)的運(yùn)行有著重要的影響。本文介紹了一些 Linux 系統(tǒng)上對文件系統(tǒng)的配置技巧,達(dá)到節(jié)省能耗并目的,有的技巧還可以提高系統(tǒng)的性能。雖然文件系統(tǒng)的節(jié)能成效比起 CPU 和顯示器的節(jié)能來顯得比較輕微,但是積少成多,綠色的地球?qū)⒖课覀円稽c(diǎn)一滴來完成。
本文假設(shè)用戶的主要文件系統(tǒng)駐留在硬盤之上。硬盤是系統(tǒng) 中相對于 CPU、內(nèi)存等設(shè)備來說活動時間比較少的部件。如果硬盤處于空閑狀態(tài)時,耗電量是很少的;而在啟動進(jìn)行讀寫的時候,耗電量會大大增加。所以通過文件系統(tǒng)節(jié) 能的核心思想就是,盡量減少磁盤 I/O,使硬盤更多的處于空閑狀態(tài)。
對 atime 的處理
根 據(jù) POSIX 的規(guī)定,Linux 以及 Unix 等系統(tǒng)都要為系統(tǒng)中的所有文件記錄文件的最后訪問時間,叫做 atime。對于某些應(yīng)用來說,atime 是很重要的信息。比如一些郵件程序會通過郵件文件的 atime 來判斷此郵件是否已讀;一些備份和清理程序會根據(jù)文件在多長時間內(nèi)沒有被訪問,來決定是否對文件進(jìn)行清理和歸檔。
但是對于大部分應(yīng)用來 說,atime 信息并不重要,而系統(tǒng)更新 atime 所帶來的開銷卻是巨大的。因?yàn)橄到y(tǒng)每訪問一次某個文件,就要對這個文件更新一個新的 atime 時間值。我這里所說的訪問,并不是從用戶角度來看的打開一個文件,而是系統(tǒng)底層的每一次 open 和 read 等操作。設(shè)想一下,我們每對文件進(jìn)行一次讀操作,都要引起一個對磁盤的寫操作,即使我們要讀的內(nèi)容已經(jīng)存在于內(nèi)存的 Page Cache 中,還是要對磁盤進(jìn)行一個寫操作。這樣引起的開銷確實(shí)是巨大的,這些寫操作會使磁盤更多的處于忙碌狀態(tài),這對系統(tǒng)性能(因?yàn)榇疟P在完成一個寫操作的時候會 暫時阻止其他的寫操作)以及電量消耗都是不利的。
所以,如果用戶可以確定自己的應(yīng)用不會使用到文件的 atime 信息,則可以禁止 atime 的更新。對于整個文件系統(tǒng),mount 命令的 noatime 選項(xiàng)可以使整個文件系統(tǒng)下的文件都不會進(jìn)行 atime 的更新??梢允褂萌缦旅睿?/p>
1
mount -o remount,noatime??/
也可以將 noatime 選項(xiàng)寫在 /etc/fstab 文件里。
如果不想對整個文件系統(tǒng)禁止 atime 更新,而只是想針對某些文件或目錄禁止,則可以通過 chattr 命令來完成,如下面的命令:
1
chattr -R +A /some/dir
可以對某個目錄及其下面的所有文件禁止 atime 更新。
除了 noatime,還有兩個和 atime 相關(guān)的文件系統(tǒng)選項(xiàng)。一個是 nodiratime,此選項(xiàng)只針對目錄禁止進(jìn)行 atime 更新(注意 noatime 對文件和目錄都生效,是 nodiratime 的超集)。這樣就可以使 ls這樣的命令不會更新目錄的 atime 值。
對 于某些用戶某些應(yīng)用,atime 信息可能是必要的,比如本節(jié)一開始提到的郵件程序和備份工具。如果完全禁止 atime 更新會使這些程序無法正常工作。針對這種情況,Linux 在內(nèi)核 2.6.20 中添加了一個新的 mount 選項(xiàng) relatime(relative atime 的意思)。relatime 的意思是訪問文件時,僅在 atime 早于文件的更改時間時對 atime 進(jìn)行更新。在內(nèi)核 2.6.24 中,又對 relatime 進(jìn)行了擴(kuò)展,在訪問文件時,當(dāng) atime 已經(jīng)超過某個時間(例如一天)沒有更新,就對 atime 進(jìn)行更新。這個擴(kuò)展的意思就是調(diào)整 atime 的更新粒度。
目前 relatime 還沒有被廣泛的應(yīng)用,因?yàn)樵S多 Linux 發(fā)行版的內(nèi)核版本和 mount 命令還沒有支持這個選項(xiàng)。如果你的系統(tǒng)支持 relatime,可以使用如下命令啟用:
1
mount -o remount,relatime??/
調(diào)節(jié) Page Cache 和 VM 系統(tǒng)
調(diào)節(jié) Page Cache
在 Linux 的內(nèi)核中,對文件的讀寫提供一個頁面緩沖的機(jī)制(Page Cache)。Page Cache 存在于內(nèi)存中,當(dāng)要讀取一個磁盤文件的內(nèi)容時,內(nèi)核首先在 Page Cache 中進(jìn)行查找,如果要讀取的內(nèi)容已經(jīng)存在 Page Cache 中,則無需在對磁盤發(fā)起實(shí)際的讀操作。同樣在需要寫文件時,寫操作也只是將內(nèi)容存放于 Page Cache 中,而 Page Cache 中的更改內(nèi)容由內(nèi)核進(jìn)程 pdflush 周期性的寫回磁盤。在默認(rèn)情況下,pdflush 進(jìn)程每 5 秒鐘醒來一次,進(jìn)行數(shù)據(jù)寫回操作。這個寫回時間值定義在參數(shù)/proc/sys/vm/dirty_writeback_centisecs中。如果在這 5 秒鐘之間,發(fā)生電源故障或者系統(tǒng)崩潰,可能會引起數(shù)據(jù)丟失。如果用戶的電源供應(yīng)比較可靠,或者丟數(shù)據(jù)丟失的風(fēng)險不是非常在意,可以適當(dāng)?shù)奶岣哌@個數(shù)據(jù)寫回時間。使用如下命令查看系統(tǒng)當(dāng)前的寫回時間值:
1
2
cat /proc/sys/vm/dirty_writeback_centisecs
500
此時間值的單位為 1/100 秒。使用如下命令可以更改此值:
1
echo 2000 > /proc/sys/vm/dirty_writeback_centisecs
這樣,就可以使 pdflush 進(jìn)程 20 秒才醒來一次,從而減少對磁盤的訪問頻率。
還有一個參數(shù)/proc/sys/vm/dirty_expire_centisecs控制一個更改過的頁面經(jīng)過多長時間后被認(rèn)為是過期的、必須被寫回的頁面,其默認(rèn)值是 3000(單位也是 1/100 秒)。用戶也可以適當(dāng)?shù)脑黾哟酥担鬼撁娓L時間的駐留在內(nèi)存中。如下命令:
1
echo 4000 > /proc/sys/vm/dirty_expire_centisecs
pdflush 進(jìn)程處理的另一種情況是當(dāng)可用內(nèi)存量降低的時候,會將一些緩沖頁面寫回磁盤,釋放內(nèi)存。這個行為是受/proc/sys/vm/dirty_background_ratio參數(shù)控制的,此參數(shù)的默認(rèn)值為 10,意思是當(dāng)所有被更改頁面總大小占工作內(nèi)存超過 10% 時,pdflush 會開始寫回工作。用戶可以增加這個比例,以增加頁面駐留在內(nèi)存的時間。此參數(shù)的更改方法同上面兩個參數(shù)。
Swap 分區(qū)或文件
在 默認(rèn)情況下,Linux 內(nèi)核并不是只有在物理內(nèi)存不夠用的時候才進(jìn)行交換,而是為了保證盡量大的磁盤緩沖以及其他一些原因,會盡可能的將非活動的進(jìn)程及內(nèi)存頁面交換出內(nèi)存,放在 磁盤上的交換分區(qū)中。這種默認(rèn)行為使得在還有大量內(nèi)存可用的情況下,就會發(fā)生交換操作,而釋放出的物理內(nèi)存并沒有被利用起來,顯然這些交換操作是不必要 的。為了減少因交換引起的磁盤讀寫,在用戶內(nèi)存足夠大的時候,可以考慮禁用 swap 分區(qū)。
使用“筆記本模式”(laptop mode)
在 2.6.6 以后,Linux 內(nèi)核在 I/O 系統(tǒng)上支持一種“筆記本模式”。在“筆記本模式”下,內(nèi)核更智能的使用 I/O 系統(tǒng),它會盡量使磁盤處于低能耗的狀態(tài)下。“筆記本模式”會將許多的 I/O 操作組織在一起,一次完成,而在每次的磁盤 I/O 之間是默認(rèn)長達(dá) 10 分鐘的非活動期,這樣會大大減少磁盤啟動的次數(shù)。為了完成這么長時間的非活動期,內(nèi)核就要在一次活動期時完成盡可能多的 I/O 任務(wù)。在一次活動期間,要完成大量的預(yù)讀,然后將所有的緩沖同步。在非活動期間,寫操作會被阻擋在內(nèi)存中(讀操作如果無法在 Cache 中滿足,則無法阻擋,因?yàn)橛脩魺o法忍受這么長時間的延遲)。“筆記本模式”會根據(jù)需要設(shè)置上節(jié)介紹的參數(shù)來達(dá)到適當(dāng)?shù)哪康摹?/p>
使用如下命令查看“筆記本模式”是否啟用:
1
2
cat /proc/sys/vm/laptop_mode
0
0 表示沒有啟用,可以使用如下命令啟用:
1
echo 5 > /proc/sys/vm/laptop_mode
配置 syslog
Linux 使用 syslog 記錄內(nèi)核和各種應(yīng)用程序的日志信息。Linux 系統(tǒng)里存在一個 Daemon 進(jìn)程 syslogd 或 sysklogd 來完成 syslog 的功能。默認(rèn)設(shè)置下,syslogd 在每次記錄一條日志后,都會使用同步(sync)操作強(qiáng)制將頁面緩存同步到磁盤上。這樣做是為了保證日志信息得到最大的保護(hù),即使系統(tǒng)崩潰或電源故障,日 志信息可以最大可能的被寫到了磁盤上。
但是在個人電腦等對日志信息要求不是如此嚴(yán)格的系統(tǒng)上,這些 sync 操作很耗費(fèi)磁盤 I/O,同時耗費(fèi)更多的電量。如果想禁止 syslog 的這種 sync 行為,需要修改 syslog 配置文件 /etc/syslog.conf,在不想進(jìn)行 sync 操作的項(xiàng)目前添加一個“-”(減號)。
如將下面這一行:
1
*.info;mail.none;authpriv.none;cron.none??????/var/log/messages
改為:
1
*.info;mail.none;authpriv.none;cron.none??????-/var/log/messages
對于不是特別重要的日志信息,都可以采用以上方法禁止 sync 行為。
用戶也可以根據(jù)自己的需要,將 /etc/syslog.conf 里不必要的日志項(xiàng)去掉,甚至可以將 syslogd 停掉,以節(jié)省磁盤 I/O。
使用 tmpfs
tmpfs(temporary file system)是一種基于內(nèi)存的文件系統(tǒng),類似于虛擬磁盤 ramdisk,但還是有很大不同。傳統(tǒng)的 ramdisk 是一個塊設(shè)備,而 tmpfs 是一個文件系統(tǒng),并不是塊設(shè)備,只是安裝它,就可以使用。tmpfs 一開始使用很小的空間,但隨著文件的復(fù)制和創(chuàng)建,tmpfs 文件系統(tǒng)會分配更多的內(nèi)存,并按照需求動態(tài)地增加文件系統(tǒng)的空間。而且,當(dāng) tmpfs 中的文件被刪除時,tmpfs 文件系統(tǒng)會動態(tài)地減小文件系統(tǒng)并釋放內(nèi)存資源。但是 tmpfs 中的內(nèi)容會在文件系統(tǒng)卸載后丟失。
用戶可以將 tmpfs 應(yīng)用于 /tmp 目錄,這樣在系統(tǒng)運(yùn)行時產(chǎn)生的臨時文件,以及對這些臨時文件的讀寫都只發(fā)生在內(nèi)存里,而不會引起任何的磁盤 I/O。
如要使用最大為 100M 的 tmpfs 在 /tmp 目錄上,可以將以下這行添加到 /etc/fstab 中:
?
電子發(fā)燒友App







































評論