UAT环境的一次cpu占用过高

UAT环境的一次cpu占用过高

前言:
1
常言道 知己知彼,方能百战百胜,寻找系统中占用高的地方,也是一门必修课

知识列表:

  1. Erlang调度原理(reduction)
  2. Erlang vm
  3. Erlang排查工具

    概念的补充:

什么是调度(一篇好文章)
1
2
3
4
5
调度是将任务分发给工作者(一般是cpu)的一个策略,调度分为两种
抢占式:抢占式调度器在所有运行任务中切换上下文,并且有权利抢占(中断)任务执行并稍后恢复执行而不需要被强占的任务配合。
它基于优先级,时间切片,reduction技术。
协作式:协作式调度器在进行上下文切换时需要任务的配合。在这种调度模式下调度器让运行的任务周期性主动释放控制权或者在idle状态时主动释放,然后开始执行新任务,等待新任务自发返回控制权。
Erlang调度是抢占式,调度器去选择一个进程去执行他的代码,会采用多个轮询的方式,抢占一个process时,会根据reductions来判断,reducetions用一次则减1,到0后又会分配给下一个cpu分配新的reductions
erlang smp(关于smp的使用)
1
2
3
什么是smp? 看图搞掂
图一:单个scheduler, 对应一个run队列,无需加锁
图二:多个scheduler, 对应多个run队列,无需加锁

image
image

网上看到了一篇关于游戏设计的文章

1
2
进程发消息会扣除reduction,而且这个reduction扣除大小还受到接收者进程影响。假如直接在地图进程做消息广播,就会导致地图进程受到的调度极度减少,影响战斗计算。
`

所以在相关进程内,可以spwan多几个进程去做事,不要在主进程里面发消息,会减少reduction

一、排查uat奔溃的问题

排查问题的步骤:

  1. 写一个gen_server模块出来定时etop,检查哪个进程占用率最高
  2. 比较队列里占用最高的进程是否有出现N次
  3. 有则用fprof去检测他,并生成该文件的报告(在线可以用eprof)

** webtool已经弃用了

*看到有使用Recon

一.1、关于recon的使用


recon github地址

recon doc github地址

1
2
3
4
5
6
7
介绍几个函数  
1.堆栈、内存使用情况最高的Num个
-spec proc_count(memory | message_queue_len | heap_size | total_heap_size | garbage_collection, Num(多少个))
recon:proc_count()

2.进程信息
recon:info()

二、关于erlang now的使用

1
简单来说,erlang now获取时间时会有erts_timeofday_mtx锁,因为他需要矫正一个唯一时间,在大量并发的时候,性能瓶颈就上来了

UAT环境的一次内存泄漏

一篇很有趣的文章
如何搞垮你的erlang

1
2
3
4
1. 耗尽atom 
2。进程的耗尽
3。洪泛消息到一个进程的mailbox
4。在一个单独的进程中创建了太多的binary数据