zoukankan      html  css  js  c++  java
  • 记一次内存持续增长问题排查

    记一次内存持续增长问题排查

    作者:张鑫

    发生背景:

    测试同学运行AElf单节点过程中,发现节点突然不再出块,经查看日志发现 Worker(交易执行进程) 全部掉线,无法继续执行交易,从而导致节点挂掉。

     

    初步定位问题:

    出现这个问题很奇怪,因为节点和所有 Worker 在同一台服务器上,网络通信应该不会有问题,再者发现,主节点、所有 Woker Lighthouse 几乎在同一时间全部掉线。然后继续排查,通过 zabbix监控找到了问题,服务器在一个时间点内存几乎被耗尽,通过观察时间,发现与节点出现异常时间吻合。

    复现问题:

    我们重点对内存使用进行测试。测试发现,随着节点长时间运行,进程占用服务器内存在不断增加,尤其在持续发了大量交易后,内存使用增长明显,并且停止发交易后,内存也并不会下降。

    下面是具体的复现步骤:

    首先介绍服务环境,我们使用Ubuntu 16.04.5 LTSdotnet core 版本为2.1.402

    节点刚开始运行的情况:内存使用大约为90M

    然后对节点持续发大量交易,我们可以通过监控看到节点交易池堆积大量交易并不断在执行

     

     

     

    持续一段时间后,内存占用已经达到1G

     

     

    此时停止发交易,等待交易执行,我们通过监控看到交易池中的交易已都被执行。

     

     

    等待一段时间后,此时我们继续观察内存占用,发现内存使用还是不会减少,一直保持1G 的水平

     

    分析问题:

    接下来我们使用lldb分析我们的节点。

    首先在服务器上安装 lldb

    sudo apt-get install lldb

    找到本机ibsosplugin.so位置

    find /usr -name libsosplugin.so

    启动 lldb并附加到进程

    sudo lldb –p 13067

    加载libsosplugin.so

    plugin load /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.4/libsosplugin.so

    setclrpath /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.4/   

    首先分析下对象

    dumpheap -stat

     

    我们可以看到有大量的以下对象

    AElf.Kernel.TransactionHolder

    System.String

    AElf.Common.Address

    System.Collections.Concurrent.ConcurrentDictionary`2+Node[[AElf.Common.Hash,AElf.Common],[AElf.Kernel.TransactionHolder,AElf.Kernel.TxHub]]

    AElf.Kernel.Transaction

    AElf.Common.Hash

    Google.Protobuf.ByteString

    System.Byte[]

    我们再看下大于1024字节对象

     

     

    可以看有4个对象同类型的对象比较大

    System.Collections.Concurrent.ConcurrentDictionary`2+Node[[AElf.Common.Hash, AElf.Common],[AElf.Kernel.TransactionHolder, AElf.Kernel.TxHub]][]

    再进一步查看MethodTable对应的对象

     

     

    可以看到有8个对象,其中4个较大,挑选其中一个查看对象信息,发现里面存储了573437个值。

     

     

    基于以上分析结果,排查对应源代码,定位到类:AElf.Kernel.TxHub。该类主要作用是存储交易池交易数据。该类包含8ConcurrentDictionary<Hash, TransactionHolder>用于存储交易数据,而TransactionHolder类中有存储了HashTransaction 等类型,与上面内存分析的结果吻合。再继续看内部逻辑,发现所有交易进入交易池后一直存储在TxHub中,不再进行释放。到此为止基本上定位问题所在。

    待问题修复后重复上面步骤进行验证,效果比较明显,待交易池交易执行完毕后,内存占用有明显下降,最终内存占用如下

     

    继续看下内存中对象的情况,可以看到对象总数也有了明显的下降。

    但是仍存在内存少量增长的现象,并且有大对象驻留内存的情况,此问题会进一步跟进分析。

  • 相关阅读:
    BZOJ 3205 [Apio2013]机器人 ——斯坦纳树
    BZOJ 3782 上学路线 ——动态规划 Lucas定理 中国剩余定理
    HDU 1423 Greatest Common Increasing Subsequence ——动态规划
    BZOJ 3309 DZY Loves Math ——莫比乌斯反演
    POJ 1038 Bugs Integrated, Inc. ——状压DP
    POJ 3693 Maximum repetition substring ——后缀数组
    POJ 2699 The Maximum Number of Strong Kings ——网络流
    POJ 2396 Budget ——有上下界的网络流
    BZOJ 4650 [Noi2016]优秀的拆分 ——后缀数组
    源码安装python
  • 原文地址:https://www.cnblogs.com/aelf/p/9806300.html
Copyright © 2011-2022 走看看