/proc/sys/vm 使用

這些參數主要是用來調整virtual memory子系統的行爲以及數據的寫出(從RAM到ROM)。
這些節點(參數)的默認值和初始化的過程大部分都可以在mm/swap.c中找到。
目前,/proc/sys/vm目錄下有下面這些節點:

  • admin_reserve_kbytes
  • block_dump
  • compact_memory
  • compact_unevictable_allowed
  • dirty_background_bytes
  • dirty_background_ratio
  • dirty_bytes
  • dirty_expire_centisecs
  • dirty_ratio
  • dirty_writeback_centisecs
  • drop_caches
  • extfrag_threshold
  • extra_free_kbytes
  • hugepages_treat_as_movable
  • hugetlb_shm_group
  • laptop_mode
  • legacy_va_layout
  • lowmem_reserve_ratio
  • max_map_count
  • memory_failure_early_kill
  • memory_failure_recovery
  • min_free_kbytes
  • min_slab_ratio
  • min_unmapped_ratio
  • mmap_min_addr
  • mmap_rnd_bits
  • mmap_rnd_compat_bits
  • nr_hugepages
  • nr_overcommit_hugepages
  • nr_trim_pages (only if CONFIG_MMU=n)
  • numa_zonelist_order
  • oom_dump_tasks
  • oom_kill_allocating_task
  • overcommit_kbytes
  • overcommit_memory
  • overcommit_ratio
  • page-cluster
  • panic_on_oom
  • percpu_pagelist_fraction
  • stat_interval
  • stat_refresh
  • swappiness
  • user_reserve_kbytes
  • vfs_cache_pressure
  • watermark_scale_factor
  • zone_reclaim_mode
  • unprivileged_userfaultfd

==============================================================
admin_reserve_kbytes

系統中爲擁有cap_sys_admin的權限(可以大致理解到root權限)的user預留的free memory數量
admin_reserve_kbytes 默認爲min(3% of free pages, 8MB)(也就是3%的free pages與8MB中較小的值)
在必要的情況下,在默認的大量使用的'guess' 模式下,能有足夠多的memory給管理員登錄和殺死進程。
運行在大量使用‘never’下的系統應該增加這個值到用於恢復的程序的完整虛擬內存大小。否則,root無法登錄來恢復系統。

如何計算一個可用的預留最小值呢?

sshd or login + bash (or some other shell) + top (or ps, kill, etc.) (需要考慮到這幾個程序需要的虛擬內存)
對於大量使用'guess'模式,我們可以算RSS。在x86_64,這個值是8MB。

對於大量使用'never'模式,我們可以採用他們的虛擬大小的最大值再加上他們的RSS。(VSZ+RSS)。在x86_64 這個值是128MB.

改變這個值,每當程序需要內存時都會收到影響。

==============================================================
block_dump

把block_dump設置爲一個非零值,可以打開block I/O調試。在Documentation/laptops/laptop-mode.txt可以查看更多關於block I/O調試的內容。

==============================================================

compact_memory
在CONFIG_COMPACTION設置了的時候這個參數才能訪問。這個參數被寫1的時候,所有的zone會被壓縮,因此所有可用的memory都是連續的塊。對於需要大量內存的情況,這很重要,儘管進程可以根據需要直接壓縮內存。

==============================================================

compact_unevictable_allowed
在CONFIG_COMPACTION設置了的時候這個參數才能訪問。這個參數被寫1的之後,壓縮是可以檢查不能被寫出的、lru(最近最少使用)的頁面以便進行壓縮的。這個應該使用在爲了大的連續內存而可以接受小的頁面錯誤的系統中。這個參數被設置爲0來阻止不能被寫出的頁面的移動。默認值是1。

==============================================================

dirty_background_bytes
這個值包含後臺內核刷新進程即將開始回寫到的內存的大小。
Contains the amount of dirty memory at which the background kernel flusher threads will start writeback.
Note:dirty_background_bytes 和dirty_background_ratio互斥使用。一次只能指定他們中的一個。當其中一個sysctl 被寫入,那會立馬在dirty memory的範圍的計算過程中起作用,並且另外一個的值讀出來是0。

如果內核線程的髒頁面大於這個值,就開始回寫到磁盤裏面

==============================================================
dirty_background_ratio
後臺內核刷新線程即將寫出的髒數據所佔的頁面,佔包括free頁面和可回收頁面的在內的總可用頁面數的百分比。這裏說的總可用內存不等於系統的總內存。

==============================================================
dirty_bytes
一個生成磁盤的進程寫入的"memory dirty"的大小,並且這個"memory dirty"會自動回寫。
注:dirty_bytes 和dirty_ratio的使用相關。一次只能指定他們中的一個。當一個sysctl被調用,那它會立馬被用來評估“dirty memory”的極限並且其他的sysctl讀出來的結果是0。
注:dirty_bytes 被允許的最小值是兩頁(字節數);任何比這個小的值的設定都會被忽略,並且保持原來的值。

==============================================================
dirty_expire_centisecs
這個可調的值是用來定義髒數據因爲足夠老而被內核清理線程(kernel flusher threads)寫出的時間。

它的單位是百分之一秒。在“dirty in-memory”中存在時間超過這個值的數據會在下一次清理進程醒過來的時候寫出。

==============================================================

dirty_ratio
這個參數, 是指free pages和reclaimable pages佔總內存的一個百分比,當達到這個百分比的時候,生成磁盤寫操作的進程將會自動開始把髒數據寫出。
總可用memory和總系統內存不相等

dirty_background_ratio 和 dirty_ratio的 區別 兩個參數用於控制內核將多少內存頁標記爲髒頁(已被修改但尚未寫入磁盤)的閾值。
dirty_background_ratio 參數表示當系統中髒頁佔總內存的百分比超過該閾值時,內核會開始異步地將髒頁寫入磁盤,以避免髒頁過多堆積而導致系統響應變慢。默認值爲10。
dirty_ratio 參數表示當系統中髒頁佔總內存的百分比超過該閾值時,內核會強制將髒頁同步地寫入磁盤,以確保數據的持久化。默認值爲20。
總結而言,dirty_background_ratio 控制異步寫入磁盤的閾值,而 dirty_ratio 控制同步寫入磁盤的閾值。這兩個參數結合起來可以平衡系統性能和數據持久化之間的關係。

==============================================================
dirty_writeback_centisecs
內核清理線程將定期地醒過來,並且講髒數據寫出到磁盤。這個參數就是指這個時間間隔,單位是百分之一秒。
把這個值設置爲0就完全地disable了定期回寫的做法。

==============================================================
drop_caches

對這個參數寫入,會導致內核清掃caches以及像inodes之類的可回收的slab對象。一旦清理了,他們的內存就變成可用的了。

清理cache:

echo 1 > /proc/sys/vm/drop_caches

清理可回收的slab對象(包括目錄和inodes):

 echo 2 > /proc/sys/vm/drop_caches

清理cache和可回收的slab對象:

 echo 3 > /proc/sys/vm/drop_caches

這個操作非破壞性的,不會清理髒對象。要增加這個操作可清理的對象的數量,可以運行“sync”後再往proc/sys/vm/drop_caches節點寫值。這樣會使得系統的髒對象變得最少,並且增加可以被清理的對象。

這個文件不是一種用來控制各種內核cache(inodes,目錄,cache等)增長的手段。這些對象會在系統別的地方需要內存時被內核主動回收。

使用這個文件會造成一些性能問題。因爲這個操作捨棄了緩存的一些對象,而可能需要大量的I/O和CPU來重新創建這些被捨棄的對象,特別是當他們被大量使用的時候。因此,在測試和debug之外的環境中,是不建議使用的。

當這個文件被使用的時候,你可能可以看到kernel log中有這樣的信息:

 cat (1234): drop_caches: 3

==============================================================
vfs_cache_pressure

該文件表示內核回收用於directory和inode cache內存的傾向;缺省值100表示內核將根據pagecache和swapcache,把directory和inode cache保持在一個合理的百分比;降低該值低於100,將導致內核傾向於保留directory和inode cache;增加該值超過100,將導致內核傾向於回收directory和inode cache。

==============================================================
min_free_kbytes

該文件表示強制Linux VM最低保留多少空閒內存(Kbytes)。

缺省設置:724(512M物理內存)

當可用內存低於這個值時,系統會嘗試通過回收緩存頁面來增加可用內存,以避免內存壓力過大而導致系統性能下降。增加min_free_kbytes的值可以增加系統的可用內存,但同時可能會減少文件系統緩存的大小,影響文件系統的性能。

==============================================================

swapiness

該文件表示系統進行交換行爲的程度,數值(0-100)越高,越可能發生磁盤交換。

==============================================================

lowmem_reserve_ratio
/proc/sys/vm中的lowmem_reserve_ratio是一個內核參數,用於控制Linux內核中低內存區域的內存保留比例。低內存區域是指物理內存地址最低的那部分內存。通過調整lowmem_reserve_ratio的值,可以控制內核爲低內存區域保留的內存比例。
保留低內存區域的目的是爲了在系統出現內存壓力時,預留一定量的內存用於處理關鍵任務和系統運行所需的基本內存操作。這個保留的比例可以保證系統在內存不足時能夠繼續正常運行而不會導致系統崩潰或性能下降。
需要注意的是,如果低內存區域的保留比例過高,可能會導致其他應用程序的內存需求無法得到滿足,從而影響系統的整體性能。因此,在調整lowmem_reserve_ratio的值時,要考慮系統的實際內存使用情況和需求。

==============================================================

user_reserve_kbytes
user_reserve_kbytes 是一個 /proc/sys/vm 下的虛擬文件,在 Linux 上用於控制用戶空間可用的內存保留量。當用戶空間程序消耗內存時,內核會按照一定的算法計算用戶空間程序當前的內存需求,並保留一定量的內存作爲緩衝區,以確保用戶空間程序稍後再次申請內存時能夠快速獲得。這個保留的內存量就由 user_reserve_kbytes 參數控制。
user_reserve_kbytes 參數的默認值是 131072(即128MB),它可以通過修改 /etc/sysctl.conf 文件或使用 sysctl 命令動態調整。將該值設爲較高的數值可以增加用戶空間程序可以使用的內存量,從而提高性能,但會減少內核用於緩衝區的內存量。設爲較低的值則會確保內核可以更多地保留內存作爲緩衝區,提高內核的 I/O 性能。但是過度減小該值可能會導致用戶空間程序頻繁申請內存導致性能下降。
總之,user_reserve_kbytes 參數可以通過調整來平衡用戶空間程序和內核之間的內存使用,以便在性能和內存利用率之間取得最佳平衡。

==============================================================

panic_on_oom

panic_on_oom 是一個 /proc/sys/vm 下的虛擬文件,在 Linux 上用於控制發生 Out of Memory(OOM)時的系統行爲。當系統內存不足時,內核需要進行選擇,決定如何處理這種情況。panic_on_oom 參數用於確定當發生 OOM 時是否觸發系統的 panic(崩潰)。
默認情況下,panic_on_oom 的值爲 0,表示不觸發系統 panic。如果將其值設爲 1,則表示系統在發生 OOM 時會觸發 panic,導致系統崩潰。這通常用於需要系統管理員手動干預的情況,以便提供更多的信息和處理機會。
觸發 panic 後,內核會生成一個崩潰轉儲(kernel panic dump),其中包含了系統內存狀態信息,這對於問題跟蹤和調試非常有用。然而,觸發 panic 會導致系統停止運行,因此需要謹慎使用。
總之,panic_on_oom 參數用於控制系統在發生 OOM 時的行爲,決定是否觸發系統崩潰(panic),以便進行問題跟蹤和調試。

==============================================================

oom_dump_tasks

oom_dump_tasks 是一個 /proc/sys/vm 下的虛擬文件,在 Linux 上用於控制 Out of Memory(OOM)發生時是否將當前運行的任務信息轉儲到系統日誌中。
默認情況下,oom_dump_tasks 的值爲 0,表示不進行任務信息轉儲。將其值設爲 1,則表示在發生 OOM 時將當前運行的任務信息轉儲到系統日誌中。
當系統內存不足時,內核會嘗試通過釋放一些內存來滿足新請求。如果內核無法進行有效的內存釋放,那麼會選擇終止一些任務以騰出內存空間。這個選擇通常由 OOM killer 進行,它會嘗試找出對系統整體性能影響較小的任務來終止。
開啓 oom_dump_tasks 參數後,在發生 OOM 時,內核會將相關的任務信息轉儲到系統日誌中,以便進行問題分析和故障排查。這些信息包括任務號(PID)、任務名稱、內存使用情況等。
總之,oom_dump_tasks 參數用於控制系統在發生 OOM 時是否將當前運行的任務信息轉儲到系統日誌中,以便進行問題分析和故障排查。

==============================================================

oom_kill_allocating_task

(1)誰觸發了OOM就幹掉誰

(2)誰最“壞”就幹掉誰

oom_kill_allocating_task這個參數就是控制這個選擇路徑的,當該參數等於0的時候選擇(2),否則選擇(1)。

==============================================================

overcommit_memory

/proc/sys/vm 中的 overcommit_memory 參數用於控制系統對內存的分配策略。正常情況下,當程序申請內存時,系統會根據當前可用的內存大小進行分配。
overcommit_memory 參數有以下幾種設置選項:

0:表示使用默認的內存分配方式,即根據系統當前可用內存的大小來決定是否分配內存。
1:表示始終允許分配所有申請的內存。即使系統當前可用內存不足,也會分配內存。這可能導致後續的 out-of-memory 錯誤。
2:表示檢查系統當前可用內存的大小和進程申請的內存大小,如果當前可用內存大小加上申請的內存大小超過了系統的限制,那麼拒絕內存申請。這種模式可以防止過度使用內存並避免 out-of-memory 錯誤。

因此,overcommit_memory 參數用於調整系統對於內存分配的策略,不同的設置選項可以影響系統對於內存的分配行爲。

==============================================================

overcommit_kbytes

當 overcommit_memory 設置爲 2 時,已提交的地址空間不允許超過交換空間加上這個物理 RAM 量。見下文。

注意:overcommit_kbytes 是 overcommit_ratio 的對應物。一次只能指定其中一個。設置一個會禁用另一個(讀取時顯示爲 0)。

==============================================================
overcommit_ratio

當 overcommit_memory 設置爲 2 時,已提交的地址空間不允許超過交換空間加上這個物理 RAM 的百分比。往上看。

==============================================================

block_dump

在 /proc/sys/vm 中,block_dump 參數用於啓用或禁用塊設備操作的跟蹤日誌記錄。當此參數設置爲1時,Linux內核將記錄塊設備操作的詳細信息,包括讀取和寫入操作。這些日誌信息將記錄在內核的日誌緩衝區中。
啓用 block_dump 可以幫助診斷和調試系統中的塊設備問題。通過分析跟蹤記錄,可以確定塊設備的訪問模式、頻率和性能瓶頸。這對於性能優化和故障排除可能非常有用。
要啓用 block_dump,將 /proc/sys/vm/block_dump 文件的值設置爲1。要禁用該功能,將其設置爲0。注意,啓用 block_dump 會產生大量的日誌信息,可能會對系統性能產生負面影響。因此,建議僅在需要跟蹤塊設備操作時啓用它。

==============================================================
compact_memory

在 /proc/sys/vm 中,compact_memory 參數用於啓用或禁用內存緊縮(memory compaction)功能。內存緊縮是一種操作系統的內存管理技術,用於優化內存的利用率和性能。
當 compact_memory 參數被設置爲1時,內核會在系統空閒或低負載時嘗試進行內存緊縮操作。內存緊縮是通過將頁面重新組織和重新分配來合併內存碎片,從而在物理內存上創造更大的連續空閒空間。這有助於減少內存碎片化,併爲大型連續內存請求提供更好的響應性能。緊縮內存可以提高程序的整體性能,特別是在使用大量內存的情況下。
要啓用內存緊縮,將 /proc/sys/vm/compact_memory 文件的值設置爲1。要禁用該功能,將其設置爲0。
請注意,內存緊縮操作可能會消耗一定的系統資源和時間,並且可能會對系統的響應性能產生一定的影響,特別是在大內存系統中。因此,在啓用內存緊縮之前,建議評估系統的特定需求和性能影響。

==============================================================

laptop_mode

此參數只會影響直接內存回收,只有兩個值:

  • 0:允許直接內存回收對匿名頁lru鏈表中的頁進行回寫操作,並且允許直接內存回收喚醒flush內核線程
  • 非0:直接內存回收不會對匿名頁lru鏈表中的頁進行回寫操作

==============================================================

legacy_va_layout

在 /proc/sys/vm 中,legacy_va_layout 參數用於控制 Linux 內核的虛擬地址空間佈局。虛擬地址空間是指進程在內存中使用的地址範圍。
當 legacy_va_layout 參數被設置爲1時,Linux 內核使用傳統的虛擬地址佈局方式。在這種佈局方式下,內核將虛擬地址空間的前3GB保留給用戶空間(用戶進程可使用),將最後1GB保留給核心空間。
當 legacy_va_layout 參數被設置爲0時,Linux 內核使用新的虛擬地址佈局方式。在這種佈局方式下,內核將虛擬地址空間的前1TB保留給用戶空間,將接下來的128TB保留給核心空間。這種佈局方式可以提供更大的用戶空間地址範圍,適用於需要大量內存的應用程序。
虛擬地址空間佈局對於系統的性能和可用內存空間有一定的影響。選擇合適的佈局方式取決於系統的需求和應用程序的特性。
要更改 legacy_va_layout 參數的值,可以通過修改 /proc/sys/vm/legacy_va_layout 文件的內容來實現。

==============================================================

max_map_count

此文件包含進程可能擁有的最大內存映射區域數。內存映射區域用作調用 malloc 的副作用,直接由 mmap、mprotect 和 madvise 以及在加載共享庫時使用。

雖然大多數應用程序需要不到一千個映射,但某些程序,尤其是 malloc 調試器,可能會消耗很多映射,例如,每個分配最多一到兩個映射。

默認值爲 65530。

==============================================================

mmap_min_addr

此文件指示用戶進程將被限制映射的地址空間量。由於內核空引用錯誤可能會根據內存前幾頁中的信息意外操作,因此不應允許用戶空間進程寫入它們。默認情況下,此值設置爲 0,安全模塊不會強制執行任何保護。將此值設置爲 64k 之類的值將允許絕大多數應用程序正常工作,並針對未來潛在的內核錯誤提供深度防禦。

==============================================================

page-cluster
/proc/sys/vm 是 Linux 內核模塊的一個接口,用於控制和調整虛擬內存子系統的參數。
page-cluster 代表頁面簇(cluster)的大小,它是指在從磁盤加載頁面到內存時,內核一次要從磁盤讀取的頁面數量。頁面簇的默認大小是 3 個頁面。
較大的頁面簇大小可提高磁盤I/O效率,因爲操作系統可以一次預取並加載更多的頁面到內存中。然而,較大的頁面簇大小也可能導致頁面的浪費,因爲如果只使用頁面簇中的一部分頁面,其他頁面就會被浪費掉。
調整 page-cluster 的值可能需要根據系統的特定需求進行實驗和調整,以找到適合系統性能的最佳設置。

==============================================================
percpu_pagelist_high_fraction
這是每個區域中可以存儲到 per-cpu 頁面列表的頁面比例。它是根據在線 CPU 數量劃分的上限。最小值爲 8,這意味着我們不允許每個區域中超過 1/8 的頁面存儲在每個 CPU 的頁面列表中。此條目僅更改熱 per-cpu 頁面列表的值。用戶可以指定一個像 100 這樣的數字來在每個 CPU 列表之間分配每個區域的 1/100。

無論高分數的值如何,每個每 cpu 頁面列表的批處理值都保持不變,因此分配延遲不受影響。

初始值爲零。內核使用該值根據區域的低水位線和本地在線 CPU 的數量來設置高 pcp->high 標記。如果用戶向這個 sysctl 寫入“0”,它將恢復到這個默認行爲。

==============================================================

stat_interval
更新 vm 統計信息的時間間隔。默認值爲 1 秒。

==============================================================
memory_failure_recovery

啓用內存故障恢復(當平臺支持時)

1:嘗試恢復。

0:內存故障時painic。

==============================================================

mmap_rnd_compat_bits

此值可用於選擇位數,以確定 vma 區域基址的隨機偏移量,這些偏移量是由在支持調整地址空間隨機化的架構上以兼容模式運行的應用程序的 mmap 分配產生的。該值將受架構支持的最小和最大值的限制。

該值可以在啓動後使用 /proc/sys/vm/mmap_rnd_compat_bits 可調參數進行更改

==============================================================
memory_failure_early_kill

控制當內核無法處理的硬件在後臺檢測到未糾正的內存錯誤(通常是內存模塊中的 2 位錯誤)時如何終止進程。在某些情況下(例如在磁盤上仍有有效副本的頁面),內核將透明地處理故障而不影響任何應用程序。但是,如果沒有其他最新的數據副本,它將終止以防止任何數據損壞傳播。

1:一旦檢測到損壞,立即終止所有映射損壞且不可重新加載的頁面的進程。請注意,少數類型的頁面不支持此功能,例如內核內部分配的數據或交換緩存,但適用於大多數用戶頁面。

0:只從所有進程中取消映射損壞的頁面,並且只殺死一個試圖訪問它的進程。

殺死是使用帶有 BUS_MCEERR_AO 的可捕獲 SIGBUS 完成的,因此進程可以根據需要處理此問題。

這僅在具有高級機器檢查處理的架構/平臺上有效,並且取決於硬件功能。

應用程序可以使用 PR_MCE_KILL prctl 單獨覆蓋此設置

==============================================================

stat_refresh

任何讀取或寫入(僅限 root)都會將所有 per-cpu vm 統計信息刷新到它們的全局總數中,以便在測試時獲得更準確的報告,例如貓 /proc/sys/vm/stat_refresh /proc/meminfo

作爲副作用,它還會檢查負總數(在其他地方報告爲 0),如果找到任何 EINVAL 則“失敗”,並在 dmesg 中顯示警告。 (在撰寫本文時,已知一些統計數據有時會被發現是負面的,但沒有不良影響:這些統計數據的錯誤和警告會被抑制。)

在Linux操作系統中,/proc/sys/vm目錄包含了與虛擬內存管理相關的參數和統計信息。其中,stat_refresh是一個控制內核是否更新/proc/stat文件中系統統計信息的參數。
/proc/stat文件包含了系統中各種進程和資源的統計信息,包括CPU使用情況、上下文切換次數、中斷次數等。這些統計信息對於系統性能分析和監控非常有用。
stat_refresh參數決定了內核更新/proc/stat文件中統計信息的頻率。當stat_refresh被設置爲非零值時,內核會以固定的時間間隔更新/proc/stat文件,將最新的統計信息寫入其中。這樣,用戶程序可以通過讀取/proc/stat文件獲取最新的系統統計信息。
默認情況下,stat_refresh被設置爲0,表示禁用內核自動更新/proc/stat文件。用戶程序可以通過將stat_refresh設置爲非零值,啓用自動更新功能。
總而言之,stat_refresh參數用於控制內核是否自動更新/proc/stat文件中的系統統計信息。啓用該功能可以讓用戶程序獲取實時的系統性能統計信息,用於系統監控和性能優化等目的。

==============================================================
numa_stat
此接口允許運行時配置 numa 統計信息。

當頁面分配性能成爲瓶頸並且您可以容忍一些可能的工具損壞和降低的 numa 計數器精度時,您可以執行以下操作:

echo 0 > /proc/sys/vm/numa_stat

當頁面分配性能不是瓶頸並且您希望所有工具都能正常工作時,您可以執行以下操作:

echo 1 > /proc/sys/vm/numa_stat

==============================================================

unprivileged_userfaultfd

unprivileged_userfaultfd 是一個位於 /proc/sys/vm 文件中的內核參數,它用於控制是否允許非特權用戶創建和使用 userfaultfd 文件描述符。
userfaultfd 是一種用於處理用戶空間中的頁面錯誤的機制。它允許用戶空間程序註冊一個文件描述符,以接收有關指定內存區域的頁面錯誤通知。當發生頁面錯誤時,內核將發送通知給用戶空間,用戶空間程序可以根據這些通知來處理錯誤,例如重新映射頁面或從其他位置讀取缺失的數據。
unprivileged_userfaultfd 參數允許非特權用戶創建和使用 userfaultfd 文件描述符。在以前的內核版本中,只有特權用戶(例如管理員)才能創建和使用 userfaultfd 文件描述符。但是,通過設置 unprivileged_userfaultfd 參數爲1,非特權用戶也可以創建和使用 userfaultfd 文件描述符。
啓用 unprivileged_userfaultfd 參數有助於擴展 userfaultfd 的使用範圍,使更多的應用程序能夠受益於這個機制。例如,它可以用於內核虛擬機監視器(KVM)等虛擬化軟件中,以提高內存管理的效率和性能。
需要注意的是,啓用 unprivileged_userfaultfd 參數可能會增加系統的風險,因爲用戶空間程序有可能濫用 userfaultfd 機制來執行惡意操作。因此,在啓用該參數之前,需要評估系統的安全需求,並確保用戶空間程序的可信度。

==============================================================
mmap_rnd_compat_bits
在 /proc/sys/vm 目錄下,mmap_rnd_compat_bits 的作用是爲 Linux 內核中的 mmap() 系統調用提供一個額外的安全層級。它用於隨機化進程的虛擬地址空間佈局,使攻擊者難以預測內存佈局並利用緩衝區溢出等漏洞。
該特性通過在 mmap() 系統調用期間隨機化內存映射的基地址來工作。在支持該特性的系統上,默認情況下,mmap_rnd_compat_bits 設置爲8,這意味着映射的基地址將在256個頁面(每個頁面大小爲4KB)的範圍內隨機化。可以通過內核中的配置選項來調整此範圍。
隨機化虛擬地址空間佈局使攻擊者更難成功發起攻擊,因爲他們需要猜測正確的內存地址進行攻擊。它還有助於防止常見的利用技術,如返回導向編程(ROP),通過使攻擊者更難在內存中找到所需的工具。
總而言之,mmap_rnd_compat_bits 是一個安全特性,通過隨機化進程的內存映射佈局來增強程序的保護。建議啓用此特性以提高系統的安全性。

==============================================================

watermark_boost_factor

在 /proc/sys/vm 目錄下,watermark_boost_factor 是一個與內存分配和回收相關的參數。它代表了一個提升因子,用於調整內核在當系統內存緊張時觸發內存回收的水位線。
水位線是內核用於判斷是否需要觸發內存回收的閾值。當空閒內存低於水位線時,內核會啓動內存回收機制以釋放內存並避免系統內存耗盡。水位線通常分爲三個等級:min、low 和 high。
watermark_boost_factor 是一個浮點數,其默認值爲1.0。它決定了在內存緊張時,內核將水位線向下調整的程度。較大的值將降低水位線,使內核更頻繁地觸發內存回收,從而提高內存的利用率和系統的響應性能。較小的值將增加水位線,使內核更少地觸發內存回收,從而減少系統的開銷。
調整 watermark_boost_factor 的值可以根據系統的需求來平衡內存利用率和響應性能。一般情況下,較大的值適用於高負載系統,而較小的值適用於資源充足的系統。

==============================================================

watermark_scale_factor

在 /proc/sys/vm 目錄下,watermark_scale_factor 是一個與內存管理相關的參數。它用於調整內核在計算內存水位線時考慮的“內存壓力”因素的比例。
內存水位線是內核用於判斷是否需要觸發內存回收的閾值。當系統內存緊張時,內核將調整水位線,並啓動內存回收機制以釋放內存並避免系統內存資源耗盡。內核根據多個因素來計算水位線,其中之一就是“內存壓力”。
watermark_scale_factor 是一個浮點數,默認值爲1.0。它決定了內核在計算水位線時將“內存壓力”因素乘以多少。較大的值將增加內存壓力對水位線的影響,使內核更敏感地觸發內存回收。較小的值則減少內存壓力對水位線的影響,使內核更少地觸發內存回收。
調整 watermark_scale_factor 的值可以根據系統的需求來平衡內存利用率和系統的響應性能。較大的值適用於對內存利用率敏感的系統,例如服務器;而較小的值適用於對系統響應性能敏感的系統,例如桌面計算機或移動設備。
值得注意的是,調整 watermark_scale_factor 需要慎重,因爲過高或過低的值可能導致系統的性能問題或內存資源管理不足。建議在根據實際情況進行調整之前,先進行充分的測試和評估。

==============================================================

zone_reclaim_mode

在 /proc/sys/vm 目錄中,zone_reclaim_mode 是一個控制內核分頁器回收內存區域的參數。它用於確定是否應該嘗試回收 NUMA 架構中分區的內存。
NUMA (Non-Uniform Memory Access) 架構是一種非一致性內存訪問架構,其中系統中的不同內存區域(也稱爲節點)可能與處理器有不同的訪問延遲和帶寬。內核會嘗試在本地節點上分配內存以提高性能,但當本地節點內存不足時,它可能還會嘗試從其他節點上的內存分配。
zone_reclaim_mode 參數控制了內核在分配內存時是否嘗試回收其他節點上的內存來滿足請求。該參數的值可以是以下幾種模式之一:

0:表示不啓用區域回收模式。內核將僅在本地節點上嘗試分配內存,而不會回收其他節點上的內存。這可能導致節點上的內存不均衡分佈。

1:表示啓用區域回收模式。內核將在本地節點內存不足時嘗試回收其他節點上的內存。這可以幫助提高內存的分佈均衡性,但可能會引入額外的開銷。

2:表示啓用區域回收模式,並使用不可靠的回收功能。內核將在本地節點內存不足時嘗試回收其他節點上的內存,並使用一種不可靠的算法來決定回收的內存是否符合條件。這可以進一步提高內存的分佈均衡性,但可能導致一些性能問題。

通過設置 zone_reclaim_mode 參數,可以根據系統需求平衡內存分配的性能和分佈均衡性。對於 NUMA 架構的系統,啓用合適的區域回收模式可以幫助優化內存管理和性能。

==============================================================

mmap_rnd_bits

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章