论坛首页 综合技术论坛

Erlang的虚拟机emulator死掉

浏览 6174 次
精华帖 (3) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-17  
Erlang会启动一个heart进程来监控自己,下面是heart监控到erlang虚拟机死掉后的输出:

heart_beat_kill_pid = 17133
heart_beat_timeout = 11
heart: Fri Jul 17 14:37:31 2009: Erlang has closed.

其他的什么信息都没有,大家有了解的吗
   发表时间:2009-07-17  
如果你的emulator非常繁忙 以至于好几秒无法回复heart信息的话  就可能发生 打开详细的日志呀
0 请登录后投票
   发表时间:2009-07-17  
我的服务端CPU占用有40%,在线用户5000左右,服务端是非常繁忙的,我怎么能够知道它来不来得及回复heart的监控请求呢?
0 请登录后投票
   发表时间:2009-07-17  
我的heart_beat_timeout = 11 s,11s内erlang还不能够给heart回复,感觉很玄啊,时间是不是太长了,当然默认的设置是60s,这个你有什么了解吗?多谢楼上
0 请登录后投票
   发表时间:2009-07-18  
因为你的heart是用port的方式实现的, 你发出的消息要通过pipe来写到heart.c去的 如果你的IO很多的话,那就需要排队等候,这个时间可能很长。所以唯一的方法就是减少IO读写的次数。
0 请登录后投票
   发表时间:2009-08-03  
我仔细想了想:
1. 5K用户的IO 即使在极端情况下都发生IO读写, 那么vm在极端情况下会挂起进程调动,专门处理IO,那么这个等待时间是 5K  * 50us(平均) =250ms, 显然不够11S

2. 你的进程执行了昂贵的运算, 进程的context_reds是2000,  也是说在2 × context_reds个函数调用你花费了超过11S时间, 换句话说你的erlang的函数每次调用超过3ms, 除非你是调用非常昂贵的os调用, 比如说spawn_port之类的,否则不大可能出现这种情况。

可否详细告知你的调用情况。。。 

0 请登录后投票
   发表时间:2009-08-04  

root@nd-desktop:~/otp_src_R13B01/erts/preloaded/src# strace -T -p 5323
Process 5323 attached - interrupt to quit
select(1, [0], NULL, NULL, {1, 456907}) = 0 (Timeout) <1.458535>
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = 1778521887 <0.000011>
select(1, [0], NULL, NULL, {5, 0}) = 1 (in [0], left {4, 999996}) <0.000014>
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = 1778521887 <0.000010>
read(0, "\0\1"..., 2) = 2 <0.000013>
read(0, "\2"..., 1) = 1 <0.000012>
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = 1778521887 <0.000010>
select(1, [0], NULL, NULL, {5, 0}) = 0 (Timeout) <5.004694>
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = 1778522387 <0.000011>
select(1, [0], NULL, NULL, {5, 0}) = 1 (in [0], left {4, 999996}) <0.000014>
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = 1778522387 <0.000011>
read(0, "\0\1"..., 2) = 2 <0.000012>
read(0, "\2"..., 1) = 1 <0.000012>
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = 1778522387 <0.000010>
select(1, [0], NULL, NULL, {5, 0}) = 0 (Timeout) <5.004749>
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = 1778522888 <0.000011>
select(1, [0], NULL, NULL, {5, 0}) = 1 (in [0], left {4, 999996}) <0.000021>
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = 1778522888 <0.000009>
read(0, "\0\1"..., 2) = 2 <0.000012>
read(0, "\2"..., 1) = 1 <0.000012>
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = 1778522888 <0.000032>
select(1, [0], NULL, NULL, {5, 0}) = 0 (Timeout) <5.004734>
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = 1778523389 <0.000011>
select(1, [0], NULL, NULL, {5, 0}) = 1 (in [0], left {4, 999996}) <0.000014>
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = 1778523389 <0.000010>
read(0, "\0\1"..., 2) = 2 <0.000011>
read(0, "\2"..., 1) = 1 <0.000011>
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = 1778523389 <0.000010>
select(1, [0], NULL, NULL, {5, 0}) = 0 (Timeout) <5.004749>
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = 1778523889 <0.000010>
select(1, [0], NULL, NULL, {5, 0}) = 1 (in [0], left {4, 999996}) <0.000014>
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = 1778523889 <0.000010>
read(0, "\0\1"..., 2) = 2 <0.000011>
read(0, "\2"..., 1) = 1 <0.000011>

erl 5秒给heart发心跳包

-define(TIMEOUT, 5000).
-define(CYCLE_TIMEOUT, 10000).
这是heart.erl的定义
0 请登录后投票
   发表时间:2009-08-04  
这个问题已经解决,原因却是另外的问题导致了Erlang虚拟机死掉,而启动的脚本里是这样写的:
HEART_COMMAND="$BASE_ROOT/sns-comet -k"
HEART_BEAT_TIMEOUT=11
原来用的-k参数表示heart发现erlang虚拟机没有响应后执行该命令,k就是kill,所以提示“Erlang has closed”信息。只需要改成下面:
HEART_COMMAND="$BASE_ROOT/sns-comet -b"
-b就是启动为后台进程。

但是同时又遇到另一个不可解的问题,就是Erlang虚拟机死掉,没有任何错误。现在因为加了“-b”参数,所以一死掉就能够保证重启。但是死掉还是说明有问题的。
我这边的情况是:大约有5000个用户来访问当前的Erlang HTTP服务,定时的刷新自己的信息给服务端,然后我将信息记录到Memcache中。现在是每刷新一次就会读写一次Memcache,以前只有在用户最后一次刷新时才会读写Memcache。以前Erlang很稳定,自从加了频繁读写Memcache就经常无端的死掉。mryufeng有什么建议吗?
0 请登录后投票
   发表时间:2009-08-04  
你发给我crashdump已经当时的情景我才能分析哦
0 请登录后投票
   发表时间:2009-08-17  
应该是和 Memcache 通信造成的,你可以自己写一个 Memcache
不知道你是怎么调用 Memcache 的,
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics