Erlang进程简单的主动负载管制实现
浏览:1824次 出处信息
我们知道Erlang的调度器是公平的,当进程的时间片用完了后,会强制切出,但是这个粒度是比较粗的。比如说进程进行了大量的Io操作,这个操作换成时间片是不准确的,会导致某些CPU计算密集型的比较吃亏,IO密集型的合算。
为了避免这个情况,IO密集型的经常可以互动要求短暂放弃执行,最简单的方法就是用消息等待机制。当进程在等消息的时候,就会被切出,我们就达到目的。
我们可以参考mnesia的实现:
%%mnesia_dumper.erl:L1181
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Load regulator
%%
%% This is a poor mans substitute for a fair scheduler algorithm
%% in the Erlang emulator. The mnesia_dumper process performs many
%% costly BIF invokations and must pay for this. But since the
%% Emulator does not handle this properly we must compensate for
%% this with some form of load regulation of ourselves in order to
%% not steal all computation power in the Erlang Emulator ans make
%% other processes starve. Hopefully this is a temporary solution.
start_regulator() ->
case mnesia_monitor:get_env(dump_log_load_regulation) of
false ->
nopid;
true ->
N = ?REGULATOR_NAME,
case mnesia_monitor:start_proc(N, ?MODULE, regulator_init, [self()]) of
{ok, Pid} ->
Pid;
{error, Reason} ->
fatal("Failed to start ~n: ~p~n", [N, Reason])
end
end.
regulator_init(Parent) ->
%% No need for trapping exits.
%% Using low priority causes the regulation
process_flag(priority, low),
register(?REGULATOR_NAME, self()),
proc_lib:init_ack(Parent, {ok, self()}),
regulator_loop().
regulator_loop() ->
receive
{regulate, From} ->
From ! {regulated, self()},
regulator_loop();
{stop, From} ->
From ! {stopped, self()},
exit(normal)
end.
regulate(nopid) ->
ok;
regulate(RegulatorPid) ->
RegulatorPid ! {regulate, self()},
receive
{regulated, RegulatorPid} -> ok
end.
祝玩得开心!
Post Footer automatically generated by wp-posturl plugin for wordpress.
Post Footer automatically generated by wp-posturl plugin for wordpress.
建议继续学习:
- whatsapp深度使用Erlang有感 (阅读:5429)
- Erlang match_spec引擎介绍和应用 (阅读:5315)
- php-erlang (阅读:5005)
- “好奇号”火星车和它搭载的软件(来自Erlang程序员的观点) (阅读:4088)
- gen_tcp调用进程收到{empty_out_q, Port}消息奇怪行为分析 (阅读:4027)
- hibernate使用注意事项 (阅读:3984)
- Erlang如何限制节点对集群的访问之net_kernel:allow (阅读:3701)
- Erlang linkin driver用port_control方式时的一些经验分享 (阅读:3663)
- erlang学习手记 (阅读:3362)
- ERLANG OTP源码分析 – gen_server (阅读:3352)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:Erlang Shell实用小技巧
后一篇:在Express和Socket.IO中使用session >>
文章信息
- 作者:Yu Feng 来源: Erlang非业余研究
- 标签: Erlang 负载管制
- 发布时间:2011-10-14 13:43:00
建议继续学习
近3天十大热文
-
[344] WordPress插件开发 -- 在插件使用 -
[152] 解决 nginx 反向代理网页首尾出现神秘字 -
[96] IOS安全–浅谈关于IOS加固的几种方法 -
[53] Hacker News 排名算法工作原理 -
[51] cookie窃取和session劫持 -
[48] 到底什么是MVC? -
[47] 整理了一份招PHP高级工程师的面试题 -
[47] Shell的那些事儿 -
[47] 程序员技术练级攻略 -
[46] 中间件和稳定性平台
