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])(针对分布式进程间消息)