Show Table of Contents
4.3. 配置工具
記憶體使用量通常是透過設定一個或是一個以上的 kernel 參數來設定的。這些參數可以透過改變 /proc 檔案系統的內容暫時設定,或者它們可以透過 sysctl 工具永久設定。此工具是由「procps-ng」套件所提供。
舉例來說,要將 overcommit_memory 參數暫時設為 1,請執行以下指令:
# echo 1 > /proc/sys/vm/overcommit_memory
欲持續設定此數值,請執行以下指令:
# sysctl vm.overcommit_memory=1
暫時設定一個參數是很實用的,它可以確定此參數在您系統上的效果。之後當您確定此參數值有達到想要的效果時便可以持續設定此參數。
4.3.1. 設定巨大分頁
大分頁依賴連續的記憶體區域,所以在開機時(在記憶體被分割為片段之前)就定義巨大分頁是最佳方法。欲這麼做,請將以下參數加至 kernel 開機命令列:
- hugepages
- 它會定義在開機時設定於 kernel 中巨大分頁的數量。其預設值為 0。只有在系統內有足夠的連續實體空閒分頁時才有辦法配置(或是解除配置)巨大分頁。保留於此參數的分頁將不能被用作其它用途。您可以在開機後透過變更「
/proc/sys/vm/nr_hugepages」檔案的數值來調整此數值。在 NUMA 系統內,用此參數指派的巨大分頁在不同節點之間被平均分割。您可以在執行階段透過變更節點的「/sys/devices/system/node/node_id/hugepages/hugepages-1048576kB/nr_hugepages」檔案數值,將巨大分頁指派至特定節點。欲了解更多資訊,請閱讀與 kernel 相關的文件。這些文件在預設情況下被安裝於「/usr/share/doc/kernel-doc-kernel_version/Documentation/vm/hugetlbpage.txt」。 - hugepagesz
- 它在開機時定義設定在 kernel 上的持續巨大分頁的大小。有效值為 2 MB 或 1 GB,預設值為 2 MB。
- default_hugepagesz
- 它在開機時定義設定在 kernel 中持續巨大頁面的預設大小。有效值為 2 MB 或 1 GB,預設值為 2 MB。
您也可以使用以下參數來影響巨大分頁在執行階段的行為:
- /sys/devices/system/node/node_id/hugepages/hugepages-size/nr_hugepages
- 它定義被指定到特定 NUMA 節點上,有特定大小的巨大分頁的數量。Red Hat Enterprise Linux 7.1 有支援此功能。以下例子將二十個 2048 kB 巨大分頁新增至「
node2」。# numastat -cm | egrep 'Node|Huge' Node 0 Node 1 Node 2 Node 3 Total AnonHugePages 0 2 0 8 10 HugePages_Total 0 0 0 0 0 HugePages_Free 0 0 0 0 0 HugePages_Surp 0 0 0 0 0 # echo 20 > /sys/devices/system/node/node2/hugepages/hugepages-2048kB/nr_hugepages # numastat -cm | egrep 'Node|Huge' Node 0 Node 1 Node 2 Node 3 Total AnonHugePages 0 2 0 8 10 HugePages_Total 0 0 40 0 40 HugePages_Free 0 0 40 0 40 HugePages_Surp 0 0 0 0 0 - /proc/sys/vm/nr_overcommit_hugepages
- 它定義過度使用記憶體時,可以建立以及系統可以使用的其它大分頁的最大數目。如果將非零值寫進此檔案,這就表示系統在永續性大分頁耗盡時,能從 kernel 的標準分頁集區取得的大分頁數目。這些剩餘大分頁在未被使用的情況下,會處於空閒狀態而且會被傳回 kernel 的標準分頁集區。
4.3.2. 設定系統記憶體容量
本小節將討論可能對改善系統的記憶體使用率有幫助,並且與記憶體有關的 kernel 參數。這些參數可以透過改變「
/proc」檔案系統內的對應檔案而被暫時設定以做測試之用。一旦您確定產生最佳效能的數值,您可以使用「sysctl」指令來持續設定參數。
4.3.2.1. 虛擬記憶體參數
除非另外設定,否則本小節列出的參數的位置為「
/proc/sys/vm」。
- dirty_ratio
- 它是一個百分比值。當系統總記憶體的百分比值被修改,那麼系統會開始用「
pdflush」運算將修改後的數值寫進磁碟裡。其預設值為百分之 20。 - dirty_background_ratio
- 它是一個百分比值。當系統的總記憶體百分比值被修改,那麼系統會開始將修改後的數值寫進磁碟背景裡。其預設值為百分之 10。
- overcommit_memory
- 它定義大量的記憶體需求是否被接受或拒絕的條件。其預設值為「
0」。在預設情況下,kernel 透過評估可用的記憶體以及拒絕需要過大記憶體的要求,來執行啟發式記憶體過量使用。然而,因為記憶體是使用啟發式學習(不是使用精確演算法)被配置的,用此設定多載記憶體是行的通的。當此參數被設為「1」,那麼 kernel 會執行無記憶體過量使用的處理。這將增加記憶體多載的可能性,但是會改善記憶體高用量工作的效能。當此參數被設為「2」時,kernel 會拒絕與被指定在「overcommit_ratio」內相同或是大於可用的總切換空間以及實體 RAM 的百分比的記憶體要求。這會減少過量使用記憶體的風險,但是較適用於切換區域大於實體記憶體的系統。 - overcommit_ratio
- 它在「
overcommit_memory」被設為「2」 指定被考慮的實體 RAM 的百分比。其預設值為「50」。 - max_map_count
- 它定義程序可以使用的最大記憶體對應區域的數目。其預設值(「
65530」)適合大部分的情況。若您的應用程式需要對應比這個數目更多的檔案,請增加此預設值。 - min_free_kbytes
- 它指定最小的 KB 為多少來讓系統保持空閒。它被用來確定每一個低記憶體區域適合的數值,而每一個數值都會被指派一些與它的大小成比例的空閒頁面。
警告
極高的數值會損壞您的系統。將「min_free_kbytes」設在一個極低的數值可以防止您的系統回收記憶體。系統回收記憶體可能會造成系統當機以及 OOM-killing 的程序。但是若將「min_free_kbytes」設太高(例如將其設為系統總記憶體的 5–10%)將會導致系統立即進入記憶體不足的狀態,進而造成系統花太多時間來回收記憶體。 - oom_adj
- 在系統的記憶體用罄,以及「
panic_on_oom」參數被設為「0」的情況下,「oom_killer」函數會一直刪除程序直到系統復原。它將從有最高「oom_score」的程序開始刪除。「oom_adj」參數可以幫助確定程序的「oom_score」。此參數是依每一個程序的識別碼而設定的。若數值為「-17」則會為了那個程序停用「oom_killer」。其它有效的數值介於「-16」到「15」之間。注意
從調整過的程序繁衍而來的程序會繼承原來程序的「oom_score」。 - swappiness
- 它是一個從「
0」 到「100」的數值。它控制系統協助匿名記憶體或是分頁快取的程度。高數值可以改善檔案系統的效能,同時主動在 RAM 內切換較少被使用的程序。低數值可以避免將程序切換出記憶體,這通常會降低延遲,並且消耗 I/O 效能。其預設值為「60」。警告
設定「swappiness==0」將會讓系統不停的避免切換,這會增加系統在強式記憶體以及 I/O 壓力之下 OOM 的刪除現象。
4.3.2.2. 系統檔案參數
除非另外指派,否則本小節內列出的參數皆位於「
/proc/sys/fs」中。
- aio-max-nr
- 它定義全部使用中的非同步輸入 / 輸出內容可允許的事件數量。其預設值為「
65536」。修改此數值不會預先配置或者調整任何 kernel 資料結構的大小。 - file-max
- 它定義由 kernel 配置的檔案控點的最大數目。其預設值與 kernel 內的「
files_stat.max_files」數值相符。此數值被設為最大值,其源自於「NR_FILE」(在 Red Hat Enterprise Linux 內為 8192)或者源自於以下指令的結果:(mempages * (PAGE_SIZE / 1024)) / 10
提高此數值可以解決因為缺少可用的檔案控點而造成的錯誤。
4.3.2.3. kernel 參數
除非另外指派,否則本小節列出的參數皆位於「
/proc/sys/kernel」中。
- msgmax
- 它定義在訊息佇列內任何單一訊息可允許的位元組大小上限。此數值不能大於佇列(「
msgmnb」)的大小。其預設值為「65536」。 - msgmnb
- 它定義在單一訊息佇列內的位元組大小上限。其預設值為「
65536」。 - msgmni
- 它定義訊息佇列識別碼的數量上限(意思是佇列的數量上限)。在 64 位元架構的系統內,其預設值為「
1985」。 - shmall
- 它定義系統內的頁面可分享記憶體的數量上限。在 Red Hat Enterprise Linux 系統內,其預設值為「
1<<24」或是 33554432 頁。 - shmmax
- 它定義 kernel 允許的單一可分享的記憶體區段頁面的大小上限。在 Red Hat Enterprise Linux 系統內其預設值為「
1<<24」或是 33554432 位元組。 - shmmni
- 它定義系統內可分享記憶體區段的數量上限。在所有系統內其預設值皆為「
4096」。 - threads-max
- 它定義整個系統內 kernel 一次可允許的執行緒數量上限。其預設值與 kernel 參數「
max_threads」的數值是一樣的,或者也有可能是以下指令的結果:mempages / (8 * THREAD_SIZE / PAGE SIZE )
最小值為「20」。

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.