一次堆外内存溢出故障
今天早上刚泡好茶,还没喝,业务的电话就打过来了。说给大领导的一个上传文件的服务不好用了,领导震怒,责令我们立即修复。
不等我开始排查,直属领导的电话也响起来了。很快领导自觉的站到我的身后,成为正宗的程序员鼓励师。
我们的这个文件服务也是坑,用户调用的接口和我们隔了两层。用户首先调用A网关提供的服务,A网关再转到B网关。B网关之后才到我们rest服务。这个rest接口实际又调了dubbo服务。
话不多说,立马打开postman测试一下。
A网关,哎,好使啊。
客户那边说了,小文件好使,你传个1M的就不行了。
好吧,换个大文件
A网关:失败。
B网关:哎,好使。
好了,我的排查结束了,因为网关不是我负责的。但是作为一个有追求的程序员,怎么会不帮忙看一下网关的问题呢。
找到日志,

很明确的netty报错,OutOfDirectMemoryError
还是领导高明,立即要求重启。问题得到修复。
现在来看,这个A网关产品是有bug的。因为第一现场已经没了,下面的排查命令只能是练手了,打印的信息已经不是出故障时的状态。
看一下这个进程的jvm配置
1 | [root@APIGATEWAY01 bin]# ./jps -v |
限制了最大堆外内存60G。(不要震惊,我们这台服务器内存是256G的,牛逼plus)

32C,256G就问你们怕不怕。题外话,继续。
1 | # ps -p 123725 -o rss,vsz |
rss是进程使用的内存,2G
vxz是进程的虚拟内存大小,36G
MAT

没有一个明显有问题的。
NMT
要监控jvm的堆外内存,首先要打开直接内存追踪参数。
在启动参数上加上-XX:NativeMemoryTracking=detail,之后重启。
然后用
1 | jcmd pid VM.native_memory |