游戏服务器内存占用动态调整

简介: 游戏服务器内存占用动态调整

最近游戏在腾讯平台上线,已经快破200组,以前是一台机器可能就放一两组游戏区内存绰绰有余,只要没发生内存泄漏,也就没去关心。

但现在为了节约成本,我们会尽量一台虚拟机上放尽量多的游戏区。所以我们默认放了4个区(每个区占用6G,共24G),还有放了logger 服,gate,flash,redis等应用,

发现只要服务器维护后快一星期左右,内存占用从原先的10几个G一路高歌猛进,直到占满内存 95%+,经常性收到监控邮件,内存又不足了,甚至引发OOM killer。

为什么人数这么少了,内存占用还是会达到6G+,垃圾回收怎么没任何作用?

原因是因为即使JVM 从系统中申请来内存后,就不会再归还给系统,向系统交还内存和申请内存都是比较耗时的,或者说,JVM和操作系统之间的通信是比较昂贵的,从另外一个角度来看, 如果JVM一有空闲内存就交给操作系统的话,那必然会存在内存紧张,需要频繁的向操作系统申请内存,现有的做法都是向操作系统申请一大块内存,自己管理,从而避免了频繁的操作系统调用,并且能使用适合自身应用场景,特殊的内存管理方式来提高性能。

所以被JVM GC掉和内存返回给操作系统是两码事,被GC掉只是不占用java heap的空间,JVM会保留该空间给后续对象分配,不会返回给系统,即使是C语言也是这样,malloc分配空间后直接free,空间也不会返回,因为应用有很大的可能继续要求分配空间,绝大部分的实现会保留free 后的内存空间。

如果真想回收给系统也是做到的,JVM有个参数决定空闲堆内存大于一定百分比时才会把内存交还给操作系统,慎用!

想想原因也很简单,如1台24G内存的CVM,每个区我们一开始会分配6G的JVM堆栈空间(xmn,xmx=6g), 懂的人知道,这个JVM一直跑着,会消耗掉6G+的内存占用。但游戏到了第二天后其实也就单区200~300左右在线,完全没必要分配这么多的内存,3G已然足够,但我们又不可能去停机维护修改堆内存占用。所以我们可以在每次维护的时候调整内存占用,于是我给出了个3/8公式,聪明的运维同学帮忙做了脚本实现:

当然了,我们还可以对平均在线,最高在线分配不同的权重去获取应该分配的内存,

这样,内存占用高的问题就基本解决了,资源成本省下了许多。

2015/12/11 楼上做的和说的有两点不同意。第一,根据观察下来,如果xms=6G xmx=6G,实际上JVM并不是一开始就把6G申请进内存,也是渐渐的申请进来,直到6G(所以一般都建议-Xms,-Xmx值一样大,一种说法是为了避免要用到时才临时从系统中申请内存,另一种说法是 避免在每次GC 后调整堆的大小(这个还存在疑问,感觉总堆内存只会增大不会变小),这个说法本来就是不对的,不知道有多少人被欺骗了),

第二点,每次维护的时候做内存配置调整时间上太不灵活,其实1天后就可以做调整,但又要保证JVM不重启,所以我们最好把释放内存放在JVM运行态,Ali JVM就做到了这一点,在FULLGC 的时候做内存释放。

坤谷给我的回复如下:

jvm最初只是和linux要连续6g地址空间,发生写入,产生缺页中断,linux才真的分物理内存。阿里jvm不用的页,jvm是通过madvice告诉Linux,这些页可以考虑回收。linux在自己方便的时候回收。linux下就是用到才分配内存,其他操作系统不熟悉。

 

目录
相关文章
|
10天前
|
存储 缓存 安全
阿里云服务器内存型r7、r8a、r8y、r8i实例区别及选择参考
随着阿里云2024年金秋云创季的开始,目前在阿里云的活动中,属于内存型实例规格的云服务器有内存型r7、内存型r8a、内存型r8y和内存型r8i这几个实例规格,相比于活动内的经济型e和通用算力型u1等实例规格来说,这些实例规格等性能更强,虽然这几个实例规格的云服务器通常处理器与内存的配比为都是1:8,但是他们在处理器、存储、网络、安全等方面等性能并不是一样的,所以他们的适用场景也有着不同。本文为大家介绍内存型r7、r8a、r8y、r8i实例的性能、适用场景的区别以及选择参考。
|
17天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
191 2
|
3天前
|
存储 缓存 内存技术
为什么服务器内存硬件上的黑色颗粒这么多?
为什么服务器内存硬件上的黑色颗粒这么多?
|
30天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
10天前
|
弹性计算
阿里云2核16G云服务器多少钱?亲测ECS内存型r8i租赁价格
阿里云2核16G云服务器,内存型r8i实例1年6折优惠后价格为1901元,月付334.19元,按小时计费0.696221元。更多配置及优惠详情,请访问阿里云ECS页面。
|
2月前
|
分布式计算 大数据 数据挖掘
阿里云服务器计算型c8i、通用型g8i、内存型r8i实例测评与价格参考
阿里云服务器计算型c8i、通用型g8i、内存型r8i实例是阿里云的第八代云服务器实例规格,是除了计算型c7和c8y、通用型g7与g8y、内存型r7与r8y之外同样深受用户喜欢的云服务器实例规格。本文将详细介绍阿里云第八代云服务器中的计算型c8i、通用型g8i、以及内存型r8i实例,包括它们的技术特性、适用场景以及最新的活动价格信息。
阿里云服务器计算型c8i、通用型g8i、内存型r8i实例测评与价格参考
|
1月前
|
存储 机器学习/深度学习 应用服务中间件
阿里云倚天云服务器实例:计算型c8y、通用型g8y、内存型r8y实例介绍
阿里云倚天云服务器是基于阿里云自研的倚天710 ARM架构CPU打造的高性能计算产品系列,它依托先进的第四代神龙架构,旨在为用户提供稳定可预期的超高效能体验。倚天云服务器在存储、网络性能及计算稳定性方面实现了显著提升,主要得益于其芯片级的快速路径加速技术。本文将深度解析阿里云倚天云服务器的计算型c8y、通用型g8y、内存型r8y实例,探讨其优势及适用场景,以供选择参考。
|
21天前
|
存储 分布式计算 安全
阿里云服务器内存型r7、内存型r8y、内存型r8i实例规格性能对比与选择参考
在选择阿里云服务器实例规格时,针对内存密集型应用和数据库应用,内存型r7、内存型r8y和内存型r8i实例是这部分应用场景选择最多的热门实例规格。为了帮助大家更好地了解这三款实例的区别,并为选择提供参考,本文将详细对比它们的实例规格、CPU、内存、计算、存储、网络等方面的性能,并附上活动价格对比。让大家了解一下他们之间的不同,以供参考选择。
|
2月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
128 5
|
1月前
|
弹性计算 关系型数据库 数据安全/隐私保护
阿里云国际版如何配置Windows服务器的虚拟内存
阿里云国际版如何配置Windows服务器的虚拟内存