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」。