使用Erlang搭建游戏服务器时,运维往往会吐槽cpu占用过高、带宽太大或者内存消耗太快,本文总结一下排查内存占用过高的主要思路和流程。
1. 检查进程数
erlang:system_info(process_count).
看是否有大量的异常进程在耗内存,之前写过一篇博文(点我查看文章)记录过一个类似的问题:项目因为错误使用了三方数据库连接池,连接进程异常重启,产生了大量的数据库连接耗尽mysql连接池。
进程数量过大的话,就要找出没有被链接或者被监控的“孤儿进程”:
[P || P<-processes(),
[{_,Ls},{_,Ms}] <- [process_info(P,[links,monitors])],
[]==Ls,[]==Ms].
或通过
supervisor:count_children/1
查看sup下进程数量和状态。
2.查看节点内存分配情况
erlang:memory().
输出(单位是byte):
[{
total,361896384},
{
processes,135616968},