近日Linux服务器上进行编译运行go run main.go
命令的时候,程序运行一段时间,会中止,报错signal: killed。网上搜索,发现可能是内存不够的问题。执行命令:dmesg | egrep -i -B100 'killed process'
发现报错信息:
[4863735.833953] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-0.slice/session-50.scope,task=main,pid=160906,uid=0
[4863735.833967] Out of memory: Killed process 160906 (main) total-vm:1978632kB, anon-rss:988108kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:2056kB oom_score_adj:0
可以确定问题是Out of memory
, Linux进程内存不足,进而决定杀掉main进程。total-vm就是进程使用的虚拟内存大小,其中部分内容映射到RAM本身,也就是主存,被分配和使用也就成了RSS;部分RSS在实际内存块里面分配,成了anon-rss,叫做匿名内存。 既然是内存不足,那我们只用在服务器上分配swap分区就可以解决此问题。
Linux系统在安装的时候是可以分配swap分区的,但是我们购买的VPS很多都是预先安装好的系统。所以还是需要我们在系统运行的环境下解决这个问题,那么如何在系统安装完成后进行swap分区呢?
创建要作为swap分区的文件:增加2GB大小的交换分区,则命令写法如下,其中的count等于想要的块的数量(bs*count=文件大小)。
dd if=/dev/zero of=/root/swapfile bs=1M count=2048
格式化为交换分区文件:
mkswap /root/swapfile #建立swap的文件系统
启用交换分区文件:
swapon /root/swapfile #启用swap文件
使系统开机时自启用,在文件/etc/fstab中添加一行:
/root/swapfile swap swap defaults 0 0