hello云胜

技术与生活

0%

一次堆外内存溢出故障

今天早上刚泡好茶,还没喝,业务的电话就打过来了。说给大领导的一个上传文件的服务不好用了,领导震怒,责令我们立即修复。

不等我开始排查,直属领导的电话也响起来了。很快领导自觉的站到我的身后,成为正宗的程序员鼓励师。

我们的这个文件服务也是坑,用户调用的接口和我们隔了两层。用户首先调用A网关提供的服务,A网关再转到B网关。B网关之后才到我们rest服务。这个rest接口实际又调了dubbo服务。

话不多说,立马打开postman测试一下。

A网关,哎,好使啊。

客户那边说了,小文件好使,你传个1M的就不行了。

好吧,换个大文件

A网关:失败。

B网关:哎,好使。

好了,我的排查结束了,因为网关不是我负责的。但是作为一个有追求的程序员,怎么会不帮忙看一下网关的问题呢。

找到日志,

image-20220111111625875

很明确的netty报错,OutOfDirectMemoryError

还是领导高明,立即要求重启。问题得到修复。

现在来看,这个A网关产品是有bug的。因为第一现场已经没了,下面的排查命令只能是练手了,打印的信息已经不是出故障时的状态。

看一下这个进程的jvm配置

1
2
[root@APIGATEWAY01 bin]# ./jps -v
123725 core-1.0.0.RELEASE.jar -Xms8192m -Xmx16384m -XX:MaxDirectMemorySize=61440m

限制了最大堆外内存60G。(不要震惊,我们这台服务器内存是256G的,牛逼plus)

image-20220111112002232

32C,256G就问你们怕不怕。题外话,继续。

1
2
3
# ps -p 123725 -o rss,vsz
RSS VSZ
2130228 36014336

rss是进程使用的内存,2G

vxz是进程的虚拟内存大小,36G

MAT

image-20220111143916572

没有一个明显有问题的。

NMT

要监控jvm的堆外内存,首先要打开直接内存追踪参数。

在启动参数上加上-XX:NativeMemoryTracking=detail,之后重启。

然后用

1
jcmd pid VM.native_memory