最近为了速度把游戏的所有变量和数据都保存在静态属性里面
跑了一段时间后运营却时常反馈给我游戏挂了,用报警脚本检测,基本每天都会服务停止,查看进程log 发现最后执行倒计时的时候只有一句:killed
最早排查以为是磁盘或者内存不足(毕竟可能因为变量太大,导致内存溢出等问题)
检查后发现内存是足够的,磁盘也是足够的
通过swap分区来解决
swap分区:Swap分区在系统的物理内存不够用的时候,把硬盘内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。
在阿里云的swap分区默认是0
创建方式:
1.进入root权限(如果本身是Root账户可以跳过这步)
sudo -i
- 创建swap 分区
dd if=/dev/zero of=/swap_file bs=1M count=8192
注意:此文件的大小是count的大小乘以bs大小,上面命令的大小是8GB,这个过程可能需要等一会儿。
3 通过mkswap命令将上面新建出的文件做成swap分区
mkswap /swap_file
4 启用交换分区
swapon /swap_file
5 设置开机自动挂载
vim /etc/fstab
在文本中加入以下内容并保存。
/swap_file swap swap defaults 0 0
6 查看内核参数vm.swappiness中的数值是否为0,如果为0则根据实际需要调整成30或者60
cat /proc/sys/vm/swappiness
我的是0,我改成了60,通过执行
sysctl -w vm.swappiness=60
这里需要简单说明下,在Linux系统中,可以通过查看/proc/sys/vm/swappiness内容的值来确定系统对SWAP分区的使用原则。当swappiness内容的值为0时,表示最大限度地使用物理内存,物理内存使用完毕后,才会使用SWAP分区。当swappiness内容的值为100时,表示积极地使用SWAP分区,并且把内存中的数据及时地置换到SWAP分区。注:若想永久修改,则编辑/etc/sysctl.conf文件
我们这里设置的50,就表示当物理内存少于50%时便使用交换分区。
7.关闭swap分区
swapoff /swap_file
- 关于多个交换分区在使用上的优先级
如果你有多于一个交换文件或交换分区,你可以给它们各自分配一个优先级值(0 到 32767)。系统会在使用较低优先级的交换区域前优先使用较高优先级的交换区域。例如,如果你有一个较快的磁盘 (/dev/sda) 和一个较慢的磁盘 (/dev/sdb),给较快的设备分配一个更高的优先级。优先级可以在 fstab 中通过 pri 参数指定:
/dev/sda1 none swap defaults,pri=100 0 0
/dev/sdb2 none swap defaults,pri=10 0 0
如果两个或更多的区域有同样的优先级,并且它们都是可用的最高优先级,页面会按照循环的方式在它们之间分配。
最终解决方案:
首先移除所有保存在变量的值,因为这种处理方法是基于原有的较少用户下的解决方案。
排查完整的堆栈信息,看看哪里的变量过大导致内存溢出,将该变量移除,引入redis等外部机制,将这个变量的数值保存到redis中,从根本上解决。
参考:springboot应用无故停止运行killed解决方法 - 沐风T - 博客园
说明:内容部分转载,如有侵权请联系删除
版权归原作者 杨章隐 所有, 如有侵权,请联系我们删除。