背景:测试同学运行AElf单节点过程中,发现节点突然不再出块,经查看日志发现 Worker(交易执行进程) 全部掉线,无法继续执行交易,从而导致节点挂掉。
创新互联公司主营周宁网站建设的网络公司,主营网站建设方案,成都App定制开发,周宁h5微信小程序搭建,周宁网站营销推广欢迎周宁等地区企业咨询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
待问题修复后重复上面步骤进行验证,效果比较明显,待交易池交易执行完毕后,内存占用有明显下降,最终内存占用如下
继续看下内存中对象的情况,可以看到对象总数也有了明显的下降。
但是仍存在内存少量增长的现象,并且有大对象驻留内存的情况,此问题会进一步跟进分析。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。