一次艰难的线上游戏服务器内存排查经历
💡
原文中文,约1900字,阅读约需5分钟。
📝
内容提要
经过排查,发现游戏服务器在不同云服务商上内存差异显著是由于透明大页设置不同。调整配置后,内存使用一致。
🎯
关键要点
-
游戏服务器程序使用Go编写,启动内存从350M降低到150M。
-
使用两个云服务商部署服务器,内存使用差异显著,一个为150M,另一个为240M。
-
使用pprof分析内存分配信息,发现两个进程的内存管理差异不大。
-
考虑到操作系统线程和goroutine的影响,内存碎片率不可能造成如此大的差异。
-
检查进程的/proc/pid/smaps,未发现数据表文件的映射。
-
使用getconf PAGESIZE确认两个系统的页大小均为4K。
-
通过pmap -x命令对比两个进程的内存信息,发现虚拟内存和实际内存使用存在差异。
-
运维同学怀疑是透明大页导致的内存差异,经过调整配置后,内存使用一致。
❓
延伸问答
游戏服务器内存差异的主要原因是什么?
主要原因是透明大页设置不同。
如何降低游戏服务器的启动内存?
通过优化程序,启动内存从350M降低到150M。
使用pprof分析内存有什么发现?
pprof分析显示两个进程的内存管理差异不大。
在排查内存问题时使用了哪些命令?
使用了getconf PAGESIZE和pmap -x命令。
透明大页对内存使用有什么影响?
开启透明大页的机器内存占用较高。
最终如何解决了内存使用不一致的问题?
通过调整配置,关闭透明大页后,内存使用一致。
➡️