记AELF区块链网络的一次内存持续增长问题排查

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

aelf的GitHub链接:https://github.com/AElfProject/AElf

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

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

下面是具体的复现步骤:
首先介绍服务环境,我们使用Ubuntu 16.04.5 LTS,dotnet 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。该类主要作用是存储交易池交易数据。该类包含8个ConcurrentDictionary<Hash, TransactionHolder>用于存储交易数据,而TransactionHolder类中有存储了Hash、Transaction 等类型,与上面内存分析的结果吻合。再继续看内部逻辑,发现所有交易进入交易池后一直存储在TxHub中,不再进行释放。到此为止基本上定位问题所在。

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

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


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

转载于:https://blog.51cto.com/14239384/2366025

记AELF区块链网络的一次内存持续增长问题排查相关推荐

  1. 叶胜超区块链:Aelf(ELF)---去中心化的云计算区块链网络!

    01 项目简介 Aelf代币简称为ELF,中文被戏称为:阿姨父或者姨父,和它对应的一个币被称为"阿姨",也就是AE, ælf是一个去中心化的云计算区块链网络,具有高性能,资源隔离和 ...

  2. 区块链基础知识系列 第一课 区块链网络简介

    区块链是一种分布式分类帐技术 (DLT),通过建立新一代事务性应用程序的新信任度.可计帐性和透明度,来简化业务流程.区块链网络首次引入到了比特币兑换市场,但其实际使用范围远远超出了加密数字货币事务处理 ...

  3. sdk版本过低怎么办_区块链中的“块”是什么?区块链网络拥堵怎么办?-Gemini双子新约...

    区块链中的"块"是什么? 比特币是基于区块链的,这一点大家都知道.但是这个区块链是什么呢?更准确地说,区块链的各个组成部分是什么呢? 区块链是一个数据块.每个块可以看作是分类帐中的 ...

  4. 腾讯公开“区块链网络的信息处理方法”相关专利

    企查查App显示,1月8日,腾讯科技(深圳)有限公司公开专利"区块链网络的信息处理方法.装置及节点设备",申请日为2020年12月,公开号为CN112202933A.该专利摘要显示 ...

  5. 容器中运行Fabric区块链网络

    2019独角兽企业重金招聘Python工程师标准>>> 容器中运行Fabric区块链网络 Fabric是区块链项目Hyperleger的主要工程,可以在容器中运行,快速建立实验区块链 ...

  6. IBM推出跨境支付区块链网络,企业级区块链技术进一步升级

    周一,IBM公布了一个应用于跨境支付的区块链网络,这也是首个同类型的国际支付网络. "这标志着企业区块链应用实践进化到了一个新的阶段."IBM全球区块链市场开发副总裁Jesse L ...

  7. 微软发布面向企业区块链网络的Coco Framework

    在最近的一篇博客文章中,微软发布了一个面向企业财团(Consortium)网络的全新开放式框架:Coco.该框架基于现有区块链平台,如Ethereum,主要是为了改进网络吞吐率,提供全新机密模型,网络 ...

  8. 区块链网络性能的关键衡量指标

    衡量区块链性能的关键指标包括:1) 区块链节点指标(生产的区块数,已处理的交易数,处理时间,完成时间等) 2) P2P 子系统指标(命中 / 未命中请求的数量,活跃用户的数量,P2P 流量的数量和结构 ...

  9. 三井住友加入R3 Marco Polo区块链网络

    点击上方"蓝色字"可关注我们! 暴走时评:日本第三大银行三井住友(SMBC)将利用R3的马可波罗区块链网络进行贸易融资.三井住友是日本资产规模第三的银行,计划在2019年下半年推出 ...

最新文章

  1. 哪些编程语言需要修复?
  2. IBM推出127量子比特处理器,超越谷歌和中科大
  3. what is the thinking routine of the open source?
  4. MOSS Content Types 概述
  5. html动画曲线快速结束,css3动画如何在动作结束时保持该状态不变
  6. [html] input上传图片怎样触发默认拍照功能?
  7. 【线性代数本质】4:矩阵乘法本质
  8. Java —— eclipse.zip
  9. 如何创建隐藏用户帐号
  10. 字号计算,字体大小随窗口高度变化
  11. 阿里云云计算 42 CDN中的常用名词
  12. VM虚拟机下安装vulkan的踩坑
  13. 主数据同步与分发实现
  14. winHex数据恢复(第一篇)
  15. mysql锁机制——乐观锁、悲观锁;共享锁、排他锁、行表锁、间隔后码锁、MVCC 与 thinkphp的lock解析
  16. 2020双非通信跨考江南大学软件工程专硕
  17. 浅谈云上攻防——云服务器攻防矩阵
  18. 如何在centos中完全彻底卸载mysql
  19. linux脚本helloword,shell之helloword
  20. 基于支持向量机的机械零件剩余寿命区间估计

热门文章

  1. python抽荣耀水晶_深度分析抽取荣耀水晶的窍门,不良抽法很好用,平均100RMB一颗...
  2. 快速排序伪代码_归并排序之入门到quot;放弃quot;
  3. html5响应式网站建设网络类织梦模板
  4. 与gps优缺点_浅谈用于洒水车上的液位传感器和GPS模块
  5. 调用restful接口_SSM实现RESTFul风格的CURD操作
  6. discuz集思街淘宝客模板
  7. 苹果cms v8模板 红色动漫影视模板
  8. Node.js 工具模块
  9. magento SEO
  10. php 获取当月的阴历值,PHP计算节日、节气、农阳历互换的代码