情况是这样的:
在我们的应用中,用了ejabberd作为聊天服务器,前端采用的是flex,通过socket连接上服务器。 数据和业务逻辑使用php来处理,当有
消息发给用户时,就把这条消息丢给MemcacheQ。 服务器上另有shell专门从mq中取出消息发给ejabberd,shell中发消息是用这
样的特殊帐号(system******@testdomain.com),前台flex收到system发来的私聊信息就认为系统消息。这是我们实现
系统消息的方式。
现在的情况是,一旦用户多了,公共频道有时会连接不上,而我们自己实现的系统消息会延迟很多,可能有30秒到1分多钟。查看日志发现,ejabberd
很早就收到了shell发来的消息,但是前端实际收到就是由延迟。
如果用户少,基本上不会出现上面的情况。
看了之前有人讨论的“erlang中的最大问题”,现在猜测是不是用于进程调度问题,导致私聊进程卡住的数据太多了?
环境与配置:
ejabberd-2.0.5 服务器8核 64位, 内存为12G
各位老大,走过路过不要错过,指点一下小弟吧。
Slogan | Kernel pid terminated (application_controller) ({application_start_failure,kernel,{shutdown,{kernel,start,[normal,[]]}}}) |
---|---|
Node name | 'nonode@nohost' |
Crashdump created on | Mon Sep 28 11:41:53 2009 |
System version | Erlang (BEAM) emulator version 5.6.5 [source] [64-bit] [smp:8] [async-threads:0] [hipe] [kernel-poll:false] |
Compiled | Sat Sep 26 05:36:03 2009 |
Memory allocated | 18023576 bytes |
Atoms | 4346 |
Processes | 4 |
ETS tables | 0 |
Funs | 234 |
Pid | Name/Spawned as | State | Reductions | Stack+heap | MsgQ Length |
---|---|---|---|---|---|
<0.0.0> | init | Running | 3503 | 4181 | 1 |
<0.2.0> | erl_prim_loader | Waiting | 25502 | 2584 | 0 |
<0.4.0> | error_logger | Waiting | 261 | 987 | 0 |
<0.12.0> | erlang:apply/2 | Waiting | 29 | 233 | 0 |
Current code: 1914197 bytes
Old code: 0 bytes
Module | Current size (bytes) | Old size (bytes) |
---|---|---|
otp_ring0 | 1240 | |
init | 68984 | |
prim_inet | 99624 | |
prim_file | 43297 | |
zlib | 13880 | |
prim_zip | 28616 | |
erl_prim_loader | 78048 | |
erlang | 26664 | |
error_handler | 5895 | |
heart | 13191 | |
error_logger | 12806 | |
gen_event | 48961 | |
gen | 13083 | |
proc_lib | 28640 | |
application_controller | 113112 | |
lists | 115437 | |
gen_server | 43418 | |
application | 5549 | |
sys | 23843 | |
application_master | 20492 | |
kernel | 15849 | |
supervisor | 55355 | |
dict | 33372 | |
rpc | 25429 | |
gb_trees | 16208 | |
global | 121977 | |
inet_db | 73369 | |
inet_config | 36013 | |
os | 12388 | |
inet_udp | 4826 | |
inet | 57750 | |
inet_parse | 45084 | |
erl_scan | 43896 | |
erl_parse | 226211 | |
inet_hosts | 7148 | |
erl_distribution | 4651 | |
net_kernel | 82749 | |
inet_tcp_dist | 22839 | |
erl_epmd | 28303 | |
auth | 23533 | |
filename | 32536 | |
file | 40230 | |
inet_tcp | 5474 | |
gen_tcp | 6625 | |
ets | 65155 | |
io_lib | 22447 |
This module supports clustering and load balancing. One module can be started per cluster node. Rooms are distributed at creation time on all available MUC module instances. The multi-user chat module is clustered but the rooms themselves are not clustered nor fault-tolerant: if the node managing a set of rooms goes down, the rooms disappear and they will be recreated on an available node on first connection attempt.
我没有太看明白,MUC到底是分布式的,还是不是?
The multi-user chat module is clustered but the rooms themselves are not clustered nor fault-tolerant
这句话怎么翻译。
还有一个问题是,每个房间的最大承载量是多少?我看到网上一些介绍,说是达到400+以上,就会在分发的时候有很大的延迟。就是以下的代码,他就是把每一条消息,通过foreach的方式分发到各个用户。
lists:foreach(
fun({_LJID, Info}) ->
ejabberd_router:route(
jlib:jid_replace_resource(
StateData#state.jid,
FromNick),
Info#user.jid,
Packet)
end,
?DICT:to_list(StateData#state.users)),