排查Net croe 语言内存积压问题

现象

生产环境下,dotnet程序突然无法正常写入redis里面。通过top发现内存不断增加爆满了 没有新的内存分发导致写入线程无法正常使用。

排查思路

通过top查看到对应的进程ID 因为.net有提供快照功能.

image-20210414151718477

可以看出预分配57.4G,实际占用9.4G。并且IO线程也无比多。虽然没到达阈值 但也可以看出内存的回收率较低。

官方文档

可以看出官方提供linux版本的命令。

dotnet-dump以及dotnet-counters.

dotnet-dump —主要作用为把dotnet进程转换为文件可以理解为把当前程序弄一个快照。

dotnet-counters — 主要确实以及排查确实是否内存泄漏。也可以用于确认cpu使用率高的情况

一般是使用dotnet-counters确认是否内存泄漏,在使用dotnet-dump来把核心转储用于分析。

安装排查工具

dotnet-dump

dotnet tool install --global dotnet-dump

dotnet-counters

dotnet tool install --global dotnet-counters

需要注意 以上需要dotnet-sdk版本到达5.0以上才能使用,如果不到一面提供对应操作系统下载文件。

dotnet-counters下载

dotnet-dump下载

分析过程:

确认是否泄漏

dotnet-counters  monitor --refresh-interval 1 -p 24241

1 --- 代表结果刷新

-p --- 代表进程号

image-20210414153328369
红色箭头的数值在不断增加的话就代表内存再不断涨,就存在挤压的问题。

我们需要把当前进程转储用于分析

dotnet-dump collect -p 24241

这个把当前进程转储成文件,相当于前面所说的快照,会在本地生成一个

image-20210414153846204

core_日期_数字这种格式的文件。之后就可以用于分析了。

Last modification:April 14th, 2021 at 03:39 pm
如果觉得我的文章对你有用,请随意赞赏