当前位置: 首页 > backend >正文

Erlang 利用 recon 排查热点进程

原因

erlang 进程在windows系统下持续占用 20% - 25%,怀疑 CPU 异常空转,于是进行排查。排查较快,但过程比较经典,特此记录学习。

工具

recon, recon_trace

过程

1、找出最繁忙的进程

执行指令 recon:proc_count(reductions, 10).,找出最繁忙的 10 条进程

recon:proc_count(memory, 10). 可以检查内存
user_default 可以定义 tred(10).tmem(10).来缩短指令

也可以使用 etop:start().etop:stop().指令进行调试,后者的优点是自动进行了 reduction的间隔delta跟踪,相较于recon输出的是累计 reduction会更加符合直觉。
很快可以抓到高频消耗reduction的进程,进入下一步。

2、找出进程当前的堆栈,确定卡点

执行指令process_info(<0.471.0>, current_stacktrace).,输出

{current_stacktrace,[{gen_server,loop,7,[{file,"gen_server.erl"},{line,1001}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,241}]}]}

多试几次,堆栈都是如此。这说明当前进程并无特别卡点,而是正常在 gen_server 这级接收信息、执行逻辑。大概锁定问题在于信息处理过于频繁,但是也没有造成可观测的消息堆积,进入下一步。

3、确定进程后查看当前热点函数

使用 recon_trace模块,执行recon_trace:calls({'_', '_', '_'}, 20, [{pid, <0.471.0>}]). 指令,本意抓取20次调用函数,并且查看调用时间,发现 recon 拒绝了,因为 {M, F, A} 不可同时为'_'通配,因为recon认为不安全,会导致卡滞。
结合上一步的特点(处理消息频繁),所以把Mod设置在 gen_server 这一层。在我的代码中 ,这一层是 ms_tbllog_gs。指令修改为recon_trace:calls({ms_tbllog_gs, '_', '_'}, 20, [{pid, <0.471.0>}]).。很快抓取结果如下:

11:11:35.568000 <0.471.0> ms_tbllog_gs:handle_info(sync, #{table=>tbllog_level_up, handler=>tbllog_level_up,batch_len=>2097152})
%% 重复18次...
11:11:35.594000 <0.471.0> ms_tbllog_gs:handle_info(sync, #{table=>tbllog_level_up, handler=>tbllog_level_up,batch_len=>2097152})

结果很清晰,此 gs 在 26ms 的时间里处理了 20 次这个消息,消息风暴了。

4、后续确认

顺着这个线索排查真实原因就比较简单了,发送 sync 消息的地方是定时器过来的,最后的原因确定是 sys.config配置的同步时间为 0,导致了消息风暴。

http://www.xdnf.cn/news/19619.html

相关文章:

  • 人工智能之数学基础:分布函数对随机变量的概率分布情况进行刻画
  • 微信小程序 navigateTo 栈超过多层后会失效
  • 在 Delphi 5 中获取 Word 文档页数的方法
  • 小程序蓝牙低功耗(BLE)外围设备开发指南
  • 365 天技术创作手记:从一行代码到四万同行者的相遇
  • C++多线程编程:std::thread, std::async, std::future
  • Jenkins Pipeline 语法
  • 第 12 篇:网格边界安全 - Egress Gateway 与最佳实践
  • python中的zip() 函数介绍及使用说明
  • 基于Spark的新冠肺炎疫情实时监控系统_django+spider
  • HTML第三课:特殊元素
  • 跨境电商账号风控核心:IP纯净度与浏览器指纹的防护策略
  • 跳出“中央集权”的泥潭:以Data Mesh重构AI时代的活性数据治理
  • MySQL8.0 新特性随笔
  • css中 ,有哪些⽅式可以隐藏页⾯元素? 区别?
  • 详细介绍RIGHT JOIN及其用法
  • Vue2 入门(一)介绍及Demo项目创建
  • 【51单片机6位数码管显示矩阵键值至右向左自左向右】2022-11-29
  • Linux驱动开发学习笔记
  • web自动化测试(selenium)
  • [架构之美]pdf压缩实战笔记(十五)
  • FlutterUnit 3.3.0 | 全组件、全属性、鸿蒙支持来袭
  • 高德开放平台智能眼镜解决方案,Rokid Glasses AR导航实测
  • Proxy 我踩过的那些坑
  • apache-jmeter-5.1.1安装部署与使用教程(小白一看就会)​
  • 【游戏开发】街景风格化运用到游戏中,一般有哪些风格可供选择?
  • 【实测】安装最新Unity6的常规操作
  • intellij idea2021.3.3版本如何获取永久权限
  • 第二章:技术基石:写出“活”的代码(1)
  • 基础算法之二分算法 --- 1