為什么kubernetes要關(guān)閉swap呢?
一個(gè)是性能問(wèn)題,開(kāi)啟swap會(huì)嚴(yán)重影響性能(包括內(nèi)存和I/O);
另一個(gè)是管理問(wèn)題,開(kāi)啟swap后通過(guò)cgroups設(shè)置的內(nèi)存上限就會(huì)失效。
有的時(shí)候可用內(nèi)存很多也會(huì)swap,這時(shí)候關(guān)閉是為了避免swap帶來(lái)的性能問(wèn)題。
# cat /proc/zoneinfo
# cat /proc/sys/vm/min_free_kbytes
# cat /proc/sys/vm/swappiness



hadoop集群服務(wù)器一般是建議關(guān)閉swap交換空間,這樣可提高性能。在什么情況下開(kāi)swap、什么情況下關(guān)swap?
為了性能關(guān)閉swap,這樣就不會(huì)交換也不會(huì)慢了。內(nèi)核里有個(gè)vm.xx的值可以調(diào)節(jié)swap和內(nèi)存的比例,在使用內(nèi)存90%時(shí)才交換到swap,可以設(shè)置這個(gè)來(lái)保持性能。在內(nèi)存比較少的時(shí)候,還可以交換,就好了。
不僅 hadoop,包括 ES 在內(nèi)絕大部分 Java 的應(yīng)用都建議關(guān) swap,這個(gè)和 JVM 的 gc 有關(guān),它在 gc 的時(shí)候會(huì)遍歷所有用到的堆的內(nèi)存,如果這部分內(nèi)存是被 swap 出去了,遍歷的時(shí)候就會(huì)有磁盤(pán)IO。
關(guān)于設(shè)置 wappiness=0
Kernel version 3.5 and newer: disables swapiness.
Kernel version older than 3.5: avoids swapping processes out of physical memory for as long as possible.
如果Linux內(nèi)核是3.5及以后的,最好是設(shè)置swappiness=10,不要設(shè)置swappiness=0
swap應(yīng)該是針對(duì)以前內(nèi)存小的一種優(yōu)化,不過(guò)現(xiàn)在內(nèi)存沒(méi)那么昂貴之后,所以就沒(méi)那么大的必要開(kāi)啟了。
numa感覺(jué)是對(duì)系統(tǒng)資源做的隔離分區(qū),不過(guò)目前虛擬化和docker這么流行,而且node與node之間訪問(wèn)更耗時(shí),針對(duì)大程序不一定啟到了優(yōu)化作用,針對(duì)小程序,也沒(méi)有太大必要。所以numa也沒(méi)必要開(kāi)啟。
在工作中經(jīng)常會(huì)遇到這種情況,系統(tǒng)中的剩余內(nèi)存較小、緩存內(nèi)存較大的,也就是整體可用內(nèi)存較高的情況下,就開(kāi)始使用swap了。
這是容易誤解的地方,其實(shí),即使把swappiness設(shè)置成0也不會(huì)禁止swap。想要禁止,就不要開(kāi)啟swap。


公司處理嵌入式系統(tǒng)都是關(guān)閉swap分區(qū),一般是為了減少寫(xiě)的次數(shù),延長(zhǎng)Flash存儲(chǔ)的壽命。
電腦的休眠是基于swap.如果系統(tǒng)沒(méi)有分配swap分區(qū),還會(huì)將內(nèi)存數(shù)據(jù)寫(xiě)入磁盤(pán)嗎?
除了分區(qū)之外,也可以用文件,Linux 本身支持兩種類型的 Swap,即 Swap 分區(qū)和 Swap 文件。


參考
為什么系統(tǒng)的Swap變高了?
https://time.geekbang.org/column/article/75797
Just say no to swapping
https://dzone.com/articles/just-say-no-swapping
Disable swapping
https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration-memory.html
Why not set swappiness to zero?
https://community.cloudera.com/t5/Support-Questions/Why-not-set-swappiness-to-zero/m-p/149228
Configuring system settings for memory
https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.html#systemd