锁定老帖子 主题:Erlang的虚拟机emulator死掉
精华帖 (3) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-07-17
heart_beat_kill_pid = 17133 heart_beat_timeout = 11 heart: Fri Jul 17 14:37:31 2009: Erlang has closed. 其他的什么信息都没有,大家有了解的吗 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-07-17
如果你的emulator非常繁忙 以至于好几秒无法回复heart信息的话 就可能发生 打开详细的日志呀
|
|
返回顶楼 | |
发表时间:2009-07-17
我的服务端CPU占用有40%,在线用户5000左右,服务端是非常繁忙的,我怎么能够知道它来不来得及回复heart的监控请求呢?
|
|
返回顶楼 | |
发表时间:2009-07-17
我的heart_beat_timeout = 11 s,11s内erlang还不能够给heart回复,感觉很玄啊,时间是不是太长了,当然默认的设置是60s,这个你有什么了解吗?多谢楼上
|
|
返回顶楼 | |
发表时间:2009-07-18
因为你的heart是用port的方式实现的, 你发出的消息要通过pipe来写到heart.c去的 如果你的IO很多的话,那就需要排队等候,这个时间可能很长。所以唯一的方法就是减少IO读写的次数。
|
|
返回顶楼 | |
发表时间: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之类的,否则不大可能出现这种情况。 可否详细告知你的调用情况。。。 |
|
返回顶楼 | |
发表时间: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的定义 |
|
返回顶楼 | |
发表时间: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有什么建议吗? |
|
返回顶楼 | |
发表时间:2009-08-04
你发给我crashdump已经当时的情景我才能分析哦
|
|
返回顶楼 | |
发表时间:2009-08-17
应该是和 Memcache 通信造成的,你可以自己写一个 Memcache
不知道你是怎么调用 Memcache 的, |
|
返回顶楼 | |