上周我们的在线服务程序忽然开始出现内存异常现象,程序的内存会在某个时刻起突然上涨,内存使用率一直涨到100%。我们做了几项针对性的排查:检查程序最近上线内容、使用问题机器的请求日志进行线下反演、登录异常机器查看gstack等,均未能找到问题原因。
周五晚上和周六早上问题开始变得很严重,有几十台机器频繁出现内存异常告警,虽然这些机器在内存使用率上涨到100%后,程序过段时间会自动重启,但还是很影响在线服务的稳定性。于是我们开始通过VPN登录公司内网,周末在家深入排查问题。
我们在机器监控平台查看有问题机器的内存变化曲线,发现正常情况下这台机器内存非常平稳,几乎是一条水平线,但是从某一时刻起内存开始突然上涨,并以稳定速率上涨,约一小时后内存达到100%,示意图如下:
我们的老大经验丰富,他注意到CPU和内存同时上涨,当即推测是程序的某个线程进入死循环,不停的分配内存导致。我们的机器CPU是16核,一个核被打满占比约为6%(1/16×100%),这与CPU曲线变化非常吻合。
接下来,我们找到一个内存使用率上涨到100%,还没有被自动重启的机器,远程登录到这台机器,通过执行"top -H -p 程序PID"命令查看具体是哪个线程占用cpu最高,找到其线程号。top默认是按各线程的CPU使用率排序,top内容示意图如下&#