阿里云ECS服务器磁盘读写限额引起系统卡死的一次解决之路,深刻体会了golang和rust两个语言的性能机制差距

发布时间:2024-12-02

       一天晚上,登录公司一套交易系统,登录后点击内容页面后系统突然卡死,SSH无法连接服务器,之前也小概率的碰到这个问题,一般重启一下操作系统,把应用程序都启动一下就可以了,但此次出现了非同寻常的问题:只要启动业务系统打开首页都会直接把服务器磁盘读写限额打满,然后就是死机。

    难点分析:

       1.这套系统之前一直运行稳定,但此次突然就没法启动,一启动进首页就卡死。第一考虑是不是程序被黑客黑了,但本地执行正常,将重新编译后的程序上传后却依然无效,排除被黑的可能性。

       2.将系统数据库连接更改为其他系统的连接后,系统正常运行。莫非是数据库出问题了?但数据库出问题为何挂载别的系统数据库正常,于是开始排查是否是数据库中的数据有问题,重建一个数据库,一个表一个表的进行追加一个一个的分析数据,没找到问题,只要全部标都导完就开始磁盘读写打满。

       就这么一点一点的试,一遍一遍的强制重启系统,从晚上9点排查到凌晨1点多都没找到问题所在,几近崩溃。

       无奈,只能退回来重新在业务系统里重新打日记进行逐段分析,将所有日记配置都打开,日记标记都打好后,继续开始部署测试,这一侧发现了问题所在。

    找到问题:

       原来是写的一个树形递归算法引起,程序跑到构建树状结构数据时就开始将磁盘读写额度打满卡死,算法是避免对数据库的多次读取,一次性将树形父子结构数据都读取到内存,然后在内存中构建树状结构。在树状结构数据不多的时候问题没有显现,前几天正是由于新增了几个分类,导致构建树状数据时,CPU和内存都飙升,内存打满后会向硬盘来借虚拟内存,直接导致硬盘读写额度一下打满卡死,基本锁定问题的出处。

    解决问题:

       由于这套业务系统是用golang写的,已经稳定运行了两年,对golang一直感觉良好,但此次问题的出现是golang的内存回收机制引起,除了算法消耗内存问题,核心问题就在内存回收不及时,把所有涉及到递归的算法都进行了注销,树状业务逻辑更改为懒加载,再进行部署后,系统已经正常运行好几天,没再出现磁盘卡死问题。

    Golang与Rust性能机制:

       之所以提rust语言,是因为另一套业务系统是用rust语言开发的,其中同样用到了一样的树状结构算法,然而,同样的数据,却没有出现这种磁盘卡死的问题,观察内存使用量也没有出现打满的情况,一个保持平稳状态,这得益于Rsut强大的内存管理能力,Golang的内存垃圾回收不是实时的,但Rust不需要垃圾回收器,不使用的变量会在代码块不再引用的地方直接释放内存。

       再碰到阿里云ECS服务器磁盘读写飚慢卡死的时候,不妨先排查一下内容是否打满引起的。此次事故排查到凌晨2点多才得到了解决,真没想到是内容占满引起的磁盘读写卡死,第一次碰到这种情况。

高品质生活资讯平台

『LifeAdd生活方式』是一家引领高端品质生活的互联网平台,聚焦前沿时尚风潮,为高品质人群推送生活资讯和商业信息,链接高端商业与高端人群生态圈。

业务范围

经营规则

联系我们
北京市丰台丽泽金融商务区平安幸福中心A座7层
82918700@qq.com
微信号:82918700

2013-2024 LifeAdd生活方式 www.lifeadd.cn 版权所有 | 御融(北京)科技有限公司 All Rights Reserved
增值电信业务经营许可证:京B2-20200664 | 京ICP备14004911号-7