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

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

最近游戏在腾讯平台上线,已经快破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下就是用到才分配内存,其他操作系统不熟悉。

 

目录
相关文章
|
16天前
|
存储 弹性计算 测试技术
阿里云服务器实例规格vCPU、内存、网络带宽、网络收发包PPS、连接数等性能指标详解
阿里云服务器ECS实例可以分为多种实例规格族。根据CPU、内存等配置,一种实例规格族又分为多种实例规格。而实例规格又包含vCPU、处理器、内存、vTPM、本地存储、网络带宽、网络收发包PPS、连接数、弹性网卡、云盘带宽、云盘IOPS等指标,本文为大家详细介绍实例规格的这些指标,以供大家了解和选择。
阿里云服务器实例规格vCPU、内存、网络带宽、网络收发包PPS、连接数等性能指标详解
|
7天前
|
分布式计算 大数据 数据挖掘
阿里云服务器计算型c8i、通用型g8i、内存型r8i实例测评与价格参考
阿里云服务器计算型c8i、通用型g8i、内存型r8i实例是阿里云的第八代云服务器实例规格,是除了计算型c7和c8y、通用型g7与g8y、内存型r7与r8y之外同样深受用户喜欢的云服务器实例规格。本文将详细介绍阿里云第八代云服务器中的计算型c8i、通用型g8i、以及内存型r8i实例,包括它们的技术特性、适用场景以及最新的活动价格信息。
阿里云服务器计算型c8i、通用型g8i、内存型r8i实例测评与价格参考
|
6天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
45 5
|
1月前
|
存储 缓存 安全
阿里云服务器经济型、通用算力型、计算型、通用型、内存型实例区别及选择参考
阿里云服务器的实例规格有经济型、通用型、计算型、内存型、通用算力型、大数据型、本地SSD型、高主频型、突发型、共享型等不同种类的实例规格,在阿里云的活动中,主要以经济型、通用算力型、计算型、通用型、内存型实例为主,相同配置的云服务器往往有多个不同的实例可选,而且价格差别也比较大,这会是因为不同实例规格的由于采用的处理器不同,底层架构也有所不同(例如X86 计算架构与Arm 计算架构),因此不同实例的云服务器其性能与适用场景是有所不同。本文为大家详细介绍阿里云的经济型、通用算力型、计算型、通用型和内存型实例的性能特点及适用场景,以供大家选择参考。
阿里云服务器经济型、通用算力型、计算型、通用型、内存型实例区别及选择参考
|
4天前
|
存储 弹性计算 网络协议
阿里云ECS内存型实例规格族特点、适用场景、指标数据参考
阿里云ECS提供了多样化的内存型实例规格族,专为需要高性能内存资源的应用场景设计。从最新的r8a系列到经过优化的re6p系列,旨在提供稳定、高效且安全的计算环境。这些实例不仅具备强大的计算性能与内存配比,还通过支持ESSD云盘和高效网络协议,显著提升了存储I/O能力和网络带宽,适用于大数据分析、高性能数据库、内存密集型应用等多种场景,为用户带来卓越的计算体验。本文将详细解析阿里云ECS中的多个内存型实例规格族,包括它们的核心特点、适用场景、实例规格及具体指标数据,为用户在云计算资源选型时提供参考。
|
2月前
|
缓存 Linux 调度
Linux服务器如何查看CPU占用率、内存占用、带宽占用
Linux服务器如何查看CPU占用率、内存占用、带宽占用
142 0
|
3月前
|
弹性计算 数据安全/隐私保护 虚拟化
云服务器 ECS产品使用问题之如何升级内存
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
|
2月前
|
弹性计算 固态存储 ice
阿里云服务器ECS内存型r8i、通用算力u1、r7、AMD内存r8a、高主频内存hfr8i价格和性能差异
2024年阿里云提供2核16G、4核32G及8核64G等多种服务器配置,用户可根据需求选择不同实例规格如内存型r8i、通用算力型u1等。以华北2(北京)为例,2核16G月费从286.2元起,4核32G从572.4元起,8核64G则从1144.8元起。公网带宽1Mbps预付费为23元/月,系统盘如ESSD PL1按量计费0.0021元/小时/GiB。具体价格与折扣请参考阿里云官网。
|
3月前
|
弹性计算 运维 云计算
云服务器 ECS产品使用问题之如何解决幻兽帕鲁服务器内存溢出
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
|
3月前
|
弹性计算 Linux 云计算
云服务器 ECS产品使用问题之如何扩容服务器(内存和带宽)
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
下一篇
无影云桌面