3.7. memory

memory(記​​​憶​​​體​​​)子​​​系​​​統​​​會​​​根​​​據​​​使​​​用​​​於​​​控​​​制​​​群​​​組​​​中​​​的​​​工​​​作​​​的​​​記​​​憶​​​體​​​資​​​源​​​,自​​​動​​​產​​​生​​​記​​​憶​​​體​​​報​​​告​​​,然​​​後​​​設​​​定​​​這​​​些​​​工​​​作​​​所​​​能​​​使​​​用​​​的​​​記​​​憶​​​體​​​限​​​制​​​:
memory.stat
回​​​報​​​廣​​​泛​​​的​​​記​​​憶​​​體​​​數​​​據​​​,如​​​以​​​下​​​表​​​格​​​所​​​述​​​:

表格 3.1. memory.stat 所​​​回​​​報​​​的​​​值​​​

數​​​據​​​ 描​​​述​​​
cache 分​​​頁​​​快​​​取​​​,包​​​括​​​ tmpfsshmem),單​​​位​​​為​​​位​​​元​​​組​​​
rss 匿​​​名​​​與​​​ swap 快​​​取​​​,不​​​包​​​含​​​ tmpfsshmem),單​​​位​​​為​​​位​​​元​​​組​​​
mapped_file 記​​​憶​​​體​​​映​​​射​​​的​​​已​​​映​​​射​​​檔​​​案​​​之​​​大​​​小​​​,包​​​括​​​ tmpfsshmem)單​​​位​​​為​​​位​​​元​​​組​​​
pgpgin 分​​​至​​​記​​​憶​​​體​​​中​​​的​​​分​​​頁​​​數​​​量​​​
pgpgout 由​​​記​​​憶​​​體​​​中​​​分​​​出​​​的​​​分​​​頁​​​數​​​量​​​
swap swap 使​​​用​​​量​​​,單​​​位​​​為​​​位​​​元​​​組​​​
active_anon 啟​​​用​​​中​​​、​​​最​​​近​​​最​​​少​​​使​​​用​​​的​​​(LRU)清​​​單​​​上​​​的​​​匿​​​名​​​,以​​​及​​​ swap 快​​​取​​​記​​​憶​​​體​​​,包​​​括​​​ tmpfsshmem),單​​​位​​​為​​​位​​​元​​​組​​​
inactive_anon 未​​​啟​​​用​​​的​​​ LRU 清​​​單​​​上​​​的​​​匿​​​名​​​與​​​ swap 快​​​取​​​,包​​​括​​​ tmpfsshmem),單​​​位​​​為​​​位​​​元​​​組​​​
active_file 啟​​​用​​​中​​​的​​​ LRU 清​​​單​​​上​​​的​​​檔​​​案​​​支​​​援​​​記​​​憶​​​體​​​,單​​​位​​​為​​​位​​​元​​​組​​​
inactive_file 非​​​啟​​​用​​​中​​​ LRU 清​​​單​​​上​​​的​​​檔​​​案​​​支​​​援​​​記​​​憶​​​體​​​,單​​​位​​​為​​​位​​​元​​​組​​​
unevictable 無​​​法​​​重​​​新​​​收​​​回​​​的​​​記​​​憶​​​體​​​,單​​​位​​​為​​​位​​​元​​​組​​​
hierarchical_memory_limit 包​​​含​​​了​​​ memory cgroup 的​​​階​​​層​​​記​​​憶​​​體​​​限​​​制​​​,單​​​位​​​為​​​位​​​元​​​組​​​
hierarchical_memsw_limit 記​​​憶​​​體​​​加​​​上​​​包​​​含​​​了​​​ memory cgroup 的​​​階​​​層​​​的​​​ swap 限​​​制​​​,單​​​位​​​為​​​位​​​元​​​組​​​
此​​​外​​​,除​​​了​​​ hierarchical_memory_limit 和​​​ hierarchical_memsw_limit 之​​​外​​​,這​​​些​​​檔​​​案​​​皆​​​有​​​對​​​應​​​的​​​前​​​綴​​​ total_,它​​​不​​​僅​​​會​​​回​​​報​​​控​​​制​​​群​​​組​​​,還​​​會​​​回​​​報​​​它​​​的​​​所​​​有​​​子​​​群​​​組​​​。​​​比​​​方​​​說​​​,swap 會​​​回​​​報​​​控​​​制​​​群​​​組​​​的​​​ swap 使​​​用​​​量​​​,而​​​ total_swap 則​​​會​​​回​​​報​​​控​​​制​​​群​​​組​​​和​​​其​​​所​​​有​​​子​​​群​​​組​​​的​​​ swap 使​​​用​​​量​​​。​​​
當​​​您​​​詮​​​釋​​​ memory.stat 所​​​回​​​報​​​的​​​值​​​時​​​,請​​​注​​​意​​​各​​​數​​​據​​​如​​​何​​​相​​​互​​​關​​​聯​​​;
  • active_anon + inactive_anon = anonymous memory + tmpfs 的​​​檔​​​案​​​快​​​取​​​ + swap 快​​​取​​​
    因​​​此​​​,active_anon + inactive_anon ≠​​​ rss,因​​​為​​​ rss 不​​​包​​​含​​​ tmpfs。​​​
  • active_file + inactive_file = cache - tmpfs 的​​​大​​​小​​​
memory.usage_in_bytes
回​​​報​​​控​​​制​​​群​​​組​​​中​​​,程​​​序​​​目​​​前​​​所​​​使​​​用​​​的​​​記​​​憶​​​體​​​使​​​用​​​量​​​總​​​數​​​(位​​​元​​​組​​​)。​​​
memory.memsw.usage_in_bytes
回​​​報​​​控​​​制​​​群​​​組​​​中​​​,程​​​序​​​目​​​前​​​所​​​使​​​用​​​的​​​記​​​憶​​​體​​​數​​​量​​​與​​​ swap 空​​​間​​​的​​​總​​​和​​​(單​​​位​​​為​​​位​​​元​​​組​​​)。​​​
memory.max_usage_in_bytes
回​​​報​​​控​​​制​​​群​​​組​​​中​​​,程​​​序​​​所​​​使​​​用​​​的​​​最​​​大​​​記​​​憶​​​體​​​數​​​量​​​(單​​​位​​​為​​​位​​​元​​​組​​​)。​​​
memory.memsw.max_usage_in_bytes
回​​​報​​​控​​​制​​​群​​​組​​​中​​​,程​​​序​​​所​​​使​​​用​​​的​​​最​​​大​​​記​​​憶​​​體​​​數​​​量​​​與​​​ swap 空​​​間​​​(單​​​位​​​為​​​位​​​元​​​組​​​)。​​​
memory.limit_in_bytes
設​​​置​​​最​​​大​​​的​​​使​​​用​​​者​​​記​​​憶​​​體​​​數​​​量​​​(包​​​括​​​檔​​​案​​​快​​​取​​​)。​​​若​​​沒​​​有​​​指​​​定​​​單​​​位​​​的​​​話​​​,數​​​值​​​將​​​會​​​被​​​解​​​譯​​​為​​​位​​​元​​​組​​​。​​​然​​​而​​​,您​​​可​​​透​​​過​​​使​​​用​​​字​​​尾​​​來​​​指​​​定​​​較​​​大​​​的​​​單​​​位​​​ —​​​ k 或​​​ K 代​​​表​​​ KB,m 或​​​ M 代​​​表​​​ MB,以​​​及​​​ g 或​​​ G 則​​​代​​​表​​​ GB。​​​
您​​​無​​​法​​​使​​​用​​​ memory.limit_in_bytes 來​​​限​​​制​​​ root 控​​​制​​​群​​​組​​​;您​​​只​​​可​​​將​​​值​​​套​​​用​​​至​​​階​​​層​​​中​​​,處​​​於​​​較​​​低​​​階​​​層​​​的​​​群​​​組​​​中​​​。​​​
將​​​ -1 寫​​​入​​​ memory.limit_in_bytes,以​​​移​​​除​​​任​​​何​​​既​​​有​​​的​​​限​​​制​​​。​​​
memory.memsw.limit_in_bytes
設​​​置​​​最​​​大​​​的​​​記​​​憶​​​體​​​總​​​和​​​與​​​ swap 使​​​用​​​量​​​。​​​若​​​沒​​​有​​​指​​​定​​​單​​​位​​​的​​​話​​​,數​​​值​​​將​​​會​​​被​​​解​​​譯​​​為​​​位​​​元​​​組​​​。​​​然​​​而​​​,您​​​可​​​透​​​過​​​使​​​用​​​字​​​尾​​​來​​​指​​​定​​​較​​​大​​​的​​​單​​​位​​​ —​​​ k 或​​​ K 代​​​表​​​ KB,m 或​​​ M 代​​​表​​​ MB,以​​​及​​​ g 或​​​ G 則​​​代​​​表​​​ GB。​​​
您​​​無​​​法​​​使​​​用​​​ memory.memsw.limit_in_bytes 來​​​限​​​制​​​ root 控​​​制​​​群​​​組​​​;您​​​只​​​可​​​將​​​值​​​套​​​用​​​至​​​階​​​層​​​中​​​,處​​​於​​​較​​​低​​​階​​​層​​​的​​​群​​​組​​​中​​​。​​​
將​​​ -1 寫​​​入​​​ memory.memsw.limit_in_bytes,以​​​移​​​除​​​任​​​何​​​既​​​有​​​的​​​限​​​制​​​。​​​
memory.failcnt
回​​​報​​​記​​​憶​​​體​​​限​​​制​​​超​​​過​​​ memory.limit_in_bytes 中​​​所​​​設​​​置​​​的​​​值​​​的​​​次​​​數​​​。​​​
memory.memsw.failcnt
回​​​報​​​記​​​憶​​​體​​​加​​​上​​​ swap 空​​​間​​​限​​​制​​​超​​​過​​​ memory.memsw.limit_in_bytes 中​​​所​​​設​​​置​​​的​​​值​​​的​​​次​​​數​​​。​​​
memory.force_empty
當​​​設​​​為​​​ 0 時​​​,會​​​將​​​此​​​控​​​制​​​群​​​組​​​中​​​的​​​工​​​作​​​所​​​使​​​用​​​的​​​所​​​有​​​分​​​頁​​​記​​​憶​​​體​​​清​​​空​​​。​​​此​​​介​​​面​​​只​​​能​​​在​​​控​​​制​​​群​​​組​​​沒​​​有​​​工​​​作​​​時​​​才​​​可​​​使​​​用​​​。​​​若​​​記​​​憶​​​體​​​無​​​法​​​釋​​​放​​​的​​​話​​​,它​​​便​​​會​​​視​​​情​​​況​​​被​​​移​​​至​​​父​​​控​​​制​​​群​​​組​​​中​​​。​​​請​​​在​​​移​​​除​​​控​​​制​​​群​​​組​​​之​​​前​​​,使​​​用​​​ memory.force_empty 來​​​避​​​免​​​將​​​未​​​使​​​用​​​的​​​分​​​頁​​​快​​​取​​​移​​​至​​​其​​​父​​​控​​​制​​​群​​​組​​​中​​​。​​​
memory.swappiness
設​​​置​​​ kernel 的​​​傾​​​向​​​特​​​性​​​,以​​​將​​​使​​​用​​​於​​​此​​​控​​​制​​​群​​​組​​​中​​​的​​​程​​​序​​​的​​​記​​​憶​​​體​​​換​​​出​​​,而​​​不​​​是​​​由​​​分​​​頁​​​快​​​取​​​收​​​回​​​分​​​頁​​​。​​​這​​​和​​​為​​​系​​​統​​​設​​​置​​​於​​​ /proc/sys/vm/swappiness 中​​​的​​​特​​​性​​​相​​​同​​​,計​​​算​​​方​​​式​​​也​​​相​​​同​​​。​​​預​​​設​​​值​​​為​​​ 60。​​​若​​​使​​​用​​​的​​​值​​​比​​​ 60 還​​​要​​​低​​​的​​​話​​​,將​​​會​​​降​​​低​​​ kernel 換​​​出​​​程​​​序​​​記​​​憶​​​體​​​的​​​傾​​​向​​​,大​​​於​​​ 60 的​​​值​​​會​​​提​​​高​​​ kernel 換​​​出​​​程​​​序​​​記​​​憶​​​體​​​的​​​傾​​​向​​​,並​​​且​​​當​​​值​​​大​​​於​​​ 100 時​​​,kernel 將​​​會​​​開​​​始​​​換​​​出​​​此​​​控​​​制​​​群​​​組​​​中​​​,屬​​​於​​​程​​​序​​​的​​​位​​​址​​​空​​​間​​​一​​​部​​​分​​​的​​​分​​​頁​​​。​​​
請​​​注​​​意​​​,0 這​​​個​​​值​​​無​​​法​​​避​​​免​​​程​​​序​​​記​​​憶​​​體​​​被​​​切​​​換​​​出​​​;當​​​系​​​統​​​記​​​憶​​​體​​​不​​​足​​​時​​​,換​​​出​​​這​​​個​​​動​​​作​​​還​​​是​​​有​​​可​​​能​​​會​​​發​​​生​​​,因​​​為​​​全​​​域​​​虛​​​擬​​​記​​​憶​​​體​​​管​​​理​​​邏​​​輯​​​不​​​會​​​讀​​​取​​​ cgroup 的​​​值​​​。​​​若​​​要​​​完​​​全​​​地​​​封​​​鎖​​​分​​​頁​​​,請​​​使​​​用​​​ mlock() 來​​​代​​​替​​​ cgroup。​​​
您​​​不​​​可​​​更​​​改​​​下​​​列​​​群​​​組​​​的​​​ swappiness:
  • root 控​​​制​​​群​​​組​​​,使​​​用​​​了​​​設​​​置​​​於​​​ /proc/sys/vm/swappiness 中​​​的​​​ swappiness。​​​
  • 一​​​個​​​底​​​下​​​含​​​有​​​子​​​群​​​組​​​的​​​控​​​制​​​群​​​組​​​。​​​
memory.use_hierarchy
包​​​含​​​一​​​個​​​指​​​定​​​記​​​憶​​​體​​​使​​​用​​​量​​​是​​​否​​​應​​​被​​​記​​​入​​​控​​​制​​​群​​​組​​​階​​​層​​​中​​​的​​​旗​​​標​​​(0 或​​​ 1)。​​​若​​​啟​​​用​​​的​​​話​​​(1),記​​​憶​​​體​​​控​​​制​​​器​​​將​​​會​​​由​​​超​​​過​​​了​​​它​​​記​​​憶​​​體​​​限​​​制​​​的​​​程​​​序​​​和​​​子​​​程​​​序​​​收​​​回​​​記​​​憶​​​體​​​。​​​就​​​預​​​設​​​值​​​(0)來​​​說​​​,控​​​制​​​器​​​不​​​會​​​由​​​一​​​項​​​工​​​作​​​的​​​子​​​程​​​序​​​收​​​回​​​記​​​憶​​​體​​​。​​​