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







































評(píng)論