Ruby 2.7.6遗留系统内存泄漏排查求助及内存异常疑问
我维护着一个基于Ruby 2.7.6的遗留系统,存在内存泄漏问题。之前的开发者用puma_worker_killer工具,每30分钟重启进程来缓解内存问题。但随着流量增长,我们不得不增加实例数量,还把重启间隔缩短到了20分钟。
我们想找到内存泄漏的根源,之前的开发者说泄漏似乎来自某个Gem依赖。系统部署在AWS Elastic Beanstalk,也支持Docker运行。求推荐合适的工具和排查方法?
更新:
我用mini-profiler工具,针对约100次请求采集了服务器[请求前、请求中、请求后]的内存快照。从结果看,Ruby层面好像不存在内存泄漏,但内存占用确实上升后没回落,而且占用的内存也不是业务代码在用...
请求前:
KiB Mem : 2007248 total, 628156 free, 766956 used, 612136 buff/cache
KiB Swap: 2097148 total, 2049276 free, 47872 used. 1064852 avail MemTotal allocated: 115227 bytes (1433 objects) Total retained: 21036 bytes (147 objects)
allocated memory by gem
33121 activesupport-6.0.4.7 21687 actionpack-6.0.4.7 14484 activerecord-6.0.4.7 12582 var/app 9904 ipaddr 6957 rack-2.2.4 3512 actionview-6.0.4.7 2680 mysql2-0.5.3 1813 rack-mini-profiler-3.0.0 1696 audited-5.0.2 1552 concurrent-ruby-1.1.10
请求中:
KiB Mem : 2007248 total, 65068 free, 1800424 used, 141756 buff/cache
KiB Swap: 2097148 total, 2047228 free, 49920 used. 58376 avail MemTotal allocated: 225272583 bytes (942506 objects) Total retained: 1732241 bytes (12035 objects)
allocated memory by gem
106497060 maxmind-db-1.0.0 58308032 psych 38857594 user_agent_parser-2.7.0 4949108 activesupport-6.0.4.7 3967930 other 3229962 activerecord-6.0.4.7 2154670 rack-2.2.4 1467383 actionpack-6.0.4.7 1336204 activemodel-6.0.4.7
请求后:
KiB Mem : 2007248 total, 73760 free, 1817688 used, 115800 buff/cache
KiB Swap: 2097148 total, 2032636 free, 64512 used. 54448 avail MemTotal allocated: 109563 bytes (1398 objects) Total retained: 14988 bytes (110 objects)
allocated memory by gem
29745 activesupport-6.0.4.7 21495 actionpack-6.0.4.7 13452 activerecord-6.0.4.7 12502 var/app 9904 ipaddr 7237 rack-2.2.4 3128 actionview-6.0.4.7 2488 mysql2-0.5.3 1813 rack-mini-profiler-3.0.0 1360 audited-5.0.2 1360 concurrent-ruby-1.1.10
那泄漏可能出在哪?是Puma的问题吗?
内容的提问来源于stack exchange,提问作者RanH

