Press "Enter" to skip to content

解决swapper: page allocation failure. order:4, mode:0x20

一般在小内存的机器上会遇到这样的问题,这里附上解决办法

先看一下系统设置

$ cat /proc/sys/vm/zone_reclaim_mode
0

$ cat /proc/sys/vm/min_free_kbytes
1433

解决办法:

$ sysctl -w vm.zone_reclaim_mode=1
#当区域内存不足时允许使用内存回收,此项默认被禁用,因为对服务器来说,Cache非常重要

$ sysctl -w vm.min_free_kbytes=2048
#告诉内核随时保持2M的内存空闲
#当可用内存低于这个参数时, 系统开始回收Cache内存, 以释放内存, 直到可用内存大于这个值
#值越高, 内核越早开始回收内存, 空闲内存越高
#设定这个参数时请小心, 因为该值过低和过高都有问题
#太低可防止系统重新利用内存, 这可导致系统挂起并让 OOM 杀死多个进程
#将这个参数值设定太高(占系统总内存的 5-10%)会让您的系统很快会内存不足
#Linux 的设计是使用所有可用 RAM 缓存文件系统Cache. 该值设定太高的结果是在该系统中花费太多时间重新利用内存
#默认值:
 * 16MB:    512k 
 * 32MB:    724k 
 * 64MB:    1024k 
 * 128MB:   1448k 
 * 256MB:   2048k 
 * 512MB:   2896k 
 * 1024MB:  4096k 
 * 2048MB:  5792k 
 * 4096MB:  8192k 
 * 8192MB:  11584k 
 * 16384MB: 16384k 

$ echo 'vm.zone_reclaim_mode = 1' >> /etc/sysctl.conf
$ echo 'vm.min_free_kbytes = 2048' >> /etc/sysctl.conf

然后可以确认一下

cat /proc/sys/vm/zone_reclaim_mode
1
cat /proc/sys/vm/min_free_kbytes
2048

参考文档
内核参数Zone_reclaim_mode介绍
内存域水印值:min_free_kbytes

Leave a Reply

Your email address will not be published. Required fields are marked *