麒麟KylinV10+arm架构(可能麒麟+x86也存在),服务器内存使用率到85%左右 ,如果没有设置swap,有进程可能被系统随机kill或者新服务启动失败,显示无法分配内存。
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory failed error='Cannot allocate memory'
我们的服务器没有启用swap交换空间, 解决办法是给服务器设置一个SWAP分区, 就是说牺牲一部分磁盘存储来保证部分程序正常运行所需要的运行内存。
以64G内存的服务器,加8G的swap分区为例:
要生成一个 8G 的 swapfile 文件,可以使用以下命令:
dd if=/dev/zero of=swapfile bs=1024 count=8388608
这里的计算方式是,1GB 等于 1024MB,1MB 等于 1024KB,1KB 等于 1024 字节,所以 8GB = 8×1024×1024×1024 字节。
dd 命令中的 bs(block size)为 1024 字节,count 则是块的数量。
8×1024×1024×1024÷1024 = 8388608,所以 count 设置为 8388608 即可生成一个 8G 的 swapfile 文件。
# mkdir /data/swap/
# cd /data/swap/
# dd if=/dev/zero of=swapfile bs=1024 count=8388608
# chmod 0600 swapfile
# mkswap swapfile
# echo "/data/swap/swapfile none swap sw 0 0" >> /etc/fstab
# free -h
total used free shared buff/cache available
Mem: 63Gi 45Gi 4.4Gi 1.8Gi 13Gi 7.0Gi
Swap: 8.0Gi 20Mi 8.0Gi
在什么时候swap交换内存会被使用呢?
我们看个 内核空间交换分区利用参数:
# cat /proc/sys/vm/swappiness
30
swappiness=0 的时候表示最大限度使用物理内存,然后才是swap空间;
swappiness=100 的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面,那么我们的是30,也就是说当内存使用到30%的时候(其实是个倾向度的意思),swap开始被启用。
参考
给Linux分配多少Swap空间才够呢?
https://www.jianshu.com/p/12e25ea172de
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory failed error='Cannot allocate memory'
https://www.jianshu.com/p/ce3c6546a9c2