Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
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
」。