主页

索引

模块索引

搜索页面

CPU和调度器占用

Profiling和Reduction计数:
eprof:http://www.erlang.org/doc/man/eprof.html
fprof:http://www.erlang.org/doc/man/fprof.html
eflame:https://github.com/proger/eflame
recon:proc_window/3

系统监控器:

erlang:system_monitor/2 去监控long_gc和long_schedule
前者会报告出工作量过大的垃圾回收(是要花时间的!)
后者则会捕捉到由于使用了NIF或者其他使得进程难以释放调度器的做法,从而导致进程忙碌的问题

实例:

F = fun(F) ->
  receive
    {monitor, Pid, long_schedule, Info} ->
      io:format("monitor: long_schedule, Pid:~p, Info:~p~n", [Pid, Info]);
    {monitor, Pid, long_gc, Info} ->
      io:format("monitor: long_gc, Pid:~p, Info:~p~n", [Pid, Info])
  end,
  F(F)
end.
SetUp = fun(Delay) ->
  fun() ->
    register(temp_sys_monitor, self()),
    erlang:system_monitor(self(), [{long_schedule, Delay}, {long_gc, Delay}]),
    F(F)
  end
end.
spawn_link(SetUp(1000)).

说明:

挂起的端口:
系统监控器中使用 busy_port,busy_dist_port 参数
如果发现存在此类问题:
把关键路径上的发送函数替换为使用
  erlang:port_command(Port, Data, [nosuspend]) (     )
  
  erlang:send(Pid, Msg, [nosuspend])(针对分布式进程间消息)

主页

索引

模块索引

搜索页面