RPC client OOM - RPC client 内存泄露

2015-01-26  本文已影响464人  AGIHunt

原因简述

现象及分析过程

解决办法

QA

    Q: 日志里向rpc server请求的timeout数量每天约有4-5万,服务运行近4天,约为10-20w,但对应pendingCalls里的数量只有1.6w,二者的不一致性如何解释?
    A: pendingCalls中未remove的call仅为rpc server发现超时后未回复的请求, server在回写过程中才超时的call是会被remove掉的, 所以pendingCalls中的数量要小于总timeout的数量

    Q: 为何这个问题之前一直没有被发现?
    A: 原因大概有三个方面. 一是其他rpc server的timeout比例应该没有这么高, 因此pendingCalls里未被remove的对象不会太多; 二是我们的call对象较大(其中一个参数为500个url的数组), 参数占用空间较小的call对象造成的内存开销较小不易被发现; 三是我们的服务运行了一个多月后才内存耗尽的, 而之前上线较为频繁, 很少有运行这么长的时间

    Q: 测试过程中为什么也没发现这个问题?
    A: 我们曾模拟一些异常环境(如rpc server卡死不响应请求)做测试,但此bug复现的环境则需要rpc server所在的机器有较大负载(忙不过来而超时较多),但亦能有一定的工作能力(能接收请求)而不是直接卡死(无法接收请求),这样的环境不是很好模拟。我们之后会多考虑这样的风险

经验教训

上一篇 下一篇

猜你喜欢

热点阅读