有32G内存的服务器却没有swap空间
最近新购置云服务器一枚,运行几个java软件的时候发生了非常诡异的错误,程序总是被无缘无故的kill掉,但是本身并没有消耗多少内存或者cpu,起初我不停地测试该程序,盯着top命令结果看了半小时发现了root命令启动了 kswapd0进程 才导致该java程序被终止,所以我就沿着这个思路去搜解决方案。
虽然路是错的,但是搜索学到了几个新的知识:
死磕内存篇 --- JAVA进程和linux内存间的大小关系
死磕内存篇2 --JAVA进程是怎么突然挂掉的
隐隐约约好像明白了问题所在,又不得其法,只好求助于云服务器的工程师。但是问题很难描述清楚,我又重新调试程序,终于拿到了log日志,如下:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000004bb800000, 3355443200, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 3355443200 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /home/tercent/hs_err_pid18247.log
所以要根据教程,在Ubuntu系统里面增加swap空间;https://help.ubuntu.com/community/SwapFaq
sudo dd if=/dev/zero of=/mnt/10GiB.swap bs=1024 count=10485760
sudo chmod 600 /mnt/10GiB.swap
sudo mkswap /mnt/10GiB.swap
sudo swapon /mnt/10GiB.swap
echo '/mnt/10GiB.swap swap swap defaults 0 0' | sudo tee -a /etc/fstab
但是我本身是非常奇怪的,为什么默认不给swap区域了呢?查了下说明书
Linux服务器默认不提供SWAP盘说明
也就是说其实swap空间是可以省略的,因为内存已经足够大了,但是我运行的软件比较老旧,它默认需要这些东西,所以就尴尬了。
那到底什么才是落后呢?是开发语言吗?是编程规则吗?还是内存呢?当时的程序员怎么会想到未来的内存如此便宜,连swap都可以省略了呢?
不管怎么样,自己的脑子不能落后!