Linux 系統中一些針對檔案系統的節能技巧

發表於2016-08-01

檔案系統是 Linux 系統的重要組成部分,檔案系統的配置和使用對整個系統的執行有著重要的影響。本文介紹了一些 Linux 系統上對檔案系統的配置技巧,達到節省能耗並目的,有的技巧還可以提高系統的效能。雖然檔案系統的節能成效比起 CPU 和顯示器的節能來顯得比較輕微,但是積少成多,綠色的地球將靠我們一點一滴來完成。

本文假設使用者的主要檔案系統駐留在硬碟之上。硬碟是系統 中相對於 CPU、記憶體等裝置來說活動時間比較少的部件。如果硬碟處於空閒狀態時,耗電量是很少的;而在啟動進行讀寫的時候,耗電量會大大增加。所以通過檔案系統節 能的核心思想就是,儘量減少磁碟 I/O,使硬碟更多的處於空閒狀態。

對 atime 的處理

根 據 POSIX 的規定,Linux 以及 Unix 等系統都要為系統中的所有檔案記錄檔案的最後訪問時間,叫做 atime。對於某些應用來說,atime 是很重要的資訊。比如一些郵件程式會通過郵件檔案的 atime 來判斷此郵件是否已讀;一些備份和清理程式會根據檔案在多長時間內沒有被訪問,來決定是否對檔案進行清理和歸檔。

但是對於大部分應用來 說,atime 資訊並不重要,而系統更新 atime 所帶來的開銷卻是巨大的。因為系統每訪問一次某個檔案,就要對這個檔案更新一個新的 atime 時間值。我這裡所說的訪問,並不是從使用者角度來看的開啟一個檔案,而是系統底層的每一次 open 和 read 等操作。設想一下,我們每對檔案進行一次讀操作,都要引起一個對磁碟的寫操作,即使我們要讀的內容已經存在於記憶體的 Page Cache 中,還是要對磁碟進行一個寫操作。這樣引起的開銷確實是巨大的,這些寫操作會使磁碟更多的處於忙碌狀態,這對系統效能(因為磁碟在完成一個寫操作的時候會 暫時阻止其他的寫操作)以及電量消耗都是不利的。

所以,如果使用者可以確定自己的應用不會使用到檔案的 atime 資訊,則可以禁止 atime 的更新。對於整個檔案系統,mount 命令的 noatime 選項可以使整個檔案系統下的檔案都不會進行 atime 的更新。可以使用如下命令:

也可以將 noatime 選項寫在 /etc/fstab 檔案裡。

如果不想對整個檔案系統禁止 atime 更新,而只是想針對某些檔案或目錄禁止,則可以通過 chattr 命令來完成,如下面的命令:

可以對某個目錄及其下面的所有檔案禁止 atime 更新。

除了 noatime,還有兩個和 atime 相關的檔案系統選項。一個是 nodiratime,此選項只針對目錄禁止進行 atime 更新(注意 noatime 對檔案和目錄都生效,是 nodiratime 的超集)。這樣就可以使 ls這樣的命令不會更新目錄的 atime 值。

對 於某些使用者某些應用,atime 資訊可能是必要的,比如本節一開始提到的郵件程式和備份工具。如果完全禁止 atime 更新會使這些程式無法正常工作。針對這種情況,Linux 在核心 2.6.20 中新增了一個新的 mount 選項 relatime(relative atime 的意思)。relatime 的意思是訪問檔案時,僅在 atime 早於檔案的更改時間時對 atime 進行更新。在核心 2.6.24 中,又對 relatime 進行了擴充套件,在訪問檔案時,當 atime 已經超過某個時間(例如一天)沒有更新,就對 atime 進行更新。這個擴充套件的意思就是調整 atime 的更新粒度。

目前 relatime 還沒有被廣泛的應用,因為許多 Linux 發行版的核心版本和 mount 命令還沒有支援這個選項。如果你的系統支援 relatime,可以使用如下命令啟用:

調節 Page Cache 和 VM 系統

調節 Page Cache

在 Linux 的核心中,對檔案的讀寫提供一個頁面緩衝的機制(Page Cache)。Page Cache 存在於記憶體中,當要讀取一個磁碟檔案的內容時,核心首先在 Page Cache 中進行查詢,如果要讀取的內容已經存在 Page Cache 中,則無需在對磁碟發起實際的讀操作。同樣在需要寫檔案時,寫操作也只是將內容存放於 Page Cache 中,而 Page Cache 中的更改內容由核心程式 pdflush 週期性的寫回磁碟。在預設情況下,pdflush 程式每 5 秒鐘醒來一次,進行資料寫回操作。這個寫回時間值定義在引數 /proc/sys/vm/dirty_writeback_centisecs中。如果在這 5 秒鐘之間,發生電源故障或者系統崩潰,可能會引起資料丟失。如果使用者的電源供應比較可靠,或者丟資料丟失的風險不是非常在意,可以適當的提高這個資料寫回時間。使用如下命令檢視系統當前的寫回時間值:

此時間值的單位為 1/100 秒。使用如下命令可以更改此值:

這樣,就可以使 pdflush 程式 20 秒才醒來一次,從而減少對磁碟的訪問頻率。

還有一個引數 /proc/sys/vm/dirty_expire_centisecs控制一個更改過的頁面經過多長時間後被認為是過期的、必須被寫回的頁面,其預設值是 3000(單位也是 1/100 秒)。使用者也可以適當的增加此值,使頁面更長時間的駐留在記憶體中。如下命令:

pdflush 程式處理的另一種情況是當可用記憶體量降低的時候,會將一些緩衝頁面寫回磁碟,釋放記憶體。這個行為是受 /proc/sys/vm/dirty_background_ratio引數控制的,此引數的預設值為 10,意思是當所有被更改頁面總大小佔工作記憶體超過 10% 時,pdflush 會開始寫回工作。使用者可以增加這個比例,以增加頁面駐留在記憶體的時間。此引數的更改方法同上面兩個引數。

Swap 分割槽或檔案

在 預設情況下,Linux 核心並不是只有在實體記憶體不夠用的時候才進行交換,而是為了保證儘量大的磁碟緩衝以及其他一些原因,會盡可能的將非活動的程式及記憶體頁面交換出記憶體,放在 磁碟上的交換分割槽中。這種預設行為使得在還有大量記憶體可用的情況下,就會發生交換操作,而釋放出的實體記憶體並沒有被利用起來,顯然這些交換操作是不必要 的。為了減少因交換引起的磁碟讀寫,在使用者記憶體足夠大的時候,可以考慮禁用 swap 分割槽。

使用“筆記本模式”(laptop mode)

在 2.6.6 以後,Linux 核心在 I/O 系統上支援一種“筆記本模式”。在“筆記本模式”下,核心更智慧的使用 I/O 系統,它會盡量使磁碟處於低能耗的狀態下。“筆記本模式”會將許多的 I/O 操作組織在一起,一次完成,而在每次的磁碟 I/O 之間是預設長達 10 分鐘的非活動期,這樣會大大減少磁碟啟動的次數。為了完成這麼長時間的非活動期,核心就要在一次活動期時完成儘可能多的 I/O 任務。在一次活動期間,要完成大量的預讀,然後將所有的緩衝同步。在非活動期間,寫操作會被阻擋在記憶體中(讀操作如果無法在 Cache 中滿足,則無法阻擋,因為使用者無法忍受這麼長時間的延遲)。“筆記本模式”會根據需要設定上節介紹的引數來達到適當的目的。

使用如下命令檢視“筆記本模式”是否啟用:

0 表示沒有啟用,可以使用如下命令啟用:

配置 syslog

Linux 使用 syslog 記錄核心和各種應用程式的日誌資訊。Linux 系統裡存在一個 Daemon 程式 syslogd 或 sysklogd 來完成 syslog 的功能。預設設定下,syslogd 在每次記錄一條日誌後,都會使用同步(sync)操作強制將頁面快取同步到磁碟上。這樣做是為了保證日誌資訊得到最大的保護,即使系統崩潰或電源故障,日 志資訊可以最大可能的被寫到了磁碟上。

但是在個人電腦等對日誌資訊要求不是如此嚴格的系統上,這些 sync 操作很耗費磁碟 I/O,同時耗費更多的電量。如果想禁止 syslog 的這種 sync 行為,需要修改 syslog 配置檔案 /etc/syslog.conf,在不想進行 sync 操作的專案前新增一個“-”(減號)。

如將下面這一行:

改為:

對於不是特別重要的日誌資訊,都可以採用以上方法禁止 sync 行為。

使用者也可以根據自己的需要,將 /etc/syslog.conf 裡不必要的日誌項去掉,甚至可以將 syslogd 停掉,以節省磁碟 I/O。

使用 tmpfs

tmpfs(temporary file system)是一種基於記憶體的檔案系統,類似於虛擬磁碟 ramdisk,但還是有很大不同。傳統的 ramdisk 是一個塊裝置,而 tmpfs 是一個檔案系統,並不是塊裝置,只是安裝它,就可以使用。tmpfs 一開始使用很小的空間,但隨著檔案的複製和建立,tmpfs 檔案系統會分配更多的記憶體,並按照需求動態地增加檔案系統的空間。而且,當 tmpfs 中的檔案被刪除時,tmpfs 檔案系統會動態地減小檔案系統並釋放記憶體資源。但是 tmpfs 中的內容會在檔案系統解除安裝後丟失。

使用者可以將 tmpfs 應用於 /tmp 目錄,這樣在系統執行時產生的臨時檔案,以及對這些臨時檔案的讀寫都只發生在記憶體裡,而不會引起任何的磁碟 I/O。

如要使用最大為 100M 的 tmpfs 在 /tmp 目錄上,可以將以下這行新增到 /etc/fstab 中:

相關文章