为什么kubernetes要关闭swap呢?
一个是性能问题,开启swap会严重影响性能(包括内存和I/O);
另一个是管理问题,开启swap后通过cgroups设置的内存上限就会失效。
有的时候可用内存很多也会swap,这时候关闭是为了避免swap带来的性能问题。
# cat /proc/zoneinfo
# cat /proc/sys/vm/min_free_kbytes
# cat /proc/sys/vm/swappiness
hadoop集群服务器一般是建议关闭swap交换空间,这样可提高性能。在什么情况下开swap、什么情况下关swap?
为了性能关闭swap,这样就不会交换也不会慢了。内核里有个vm.xx的值可以调节swap和内存的比例,在使用内存90%时才交换到swap,可以设置这个来保持性能。在内存比较少的时候,还可以交换,就好了。
不仅 hadoop,包括 ES 在内绝大部分 Java 的应用都建议关 swap,这个和 JVM 的 gc 有关,它在 gc 的时候会遍历所有用到的堆的内存,如果这部分内存是被 swap 出去了,遍历的时候就会有磁盘IO。
关于设置 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内核是3.5及以后的,最好是设置swappiness=10,不要设置swappiness=0
swap应该是针对以前内存小的一种优化,不过现在内存没那么昂贵之后,所以就没那么大的必要开启了。
numa感觉是对系统资源做的隔离分区,不过目前虚拟化和docker这么流行,而且node与node之间访问更耗时,针对大程序不一定启到了优化作用,针对小程序,也没有太大必要。所以numa也没必要开启。
在工作中经常会遇到这种情况,系统中的剩余内存较小、缓存内存较大的,也就是整体可用内存较高的情况下,就开始使用swap了。
这是容易误解的地方,其实,即使把swappiness设置成0也不会禁止swap。想要禁止,就不要开启swap。
公司处理嵌入式系统都是关闭swap分区,一般是为了减少写的次数,延长Flash存储的寿命。
电脑的休眠是基于swap.如果系统没有分配swap分区,还会将内存数据写入磁盘吗?
除了分区之外,也可以用文件,Linux 本身支持两种类型的 Swap,即 Swap 分区和 Swap 文件。
参考
为什么系统的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