Ejabberd2 падает

Железо: Core2Duo 1.6 Ghz, 4096 Mb ОЗУ
OC: FreeBSD 7.2

Установлен: ejabberd 2.1.0

Сервер падает, и в логах пишет следующее:

=erl_crash_dump:0.1
Thu Oct  8 08:07:48 2009
Slogan: eheap_alloc: Cannot allocate 583848200 bytes of memory (of type "heap").
System version: Erlang R13B01 (erts-5.7.2) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:true]
Compiled: Thu Sep 17 06:10:19 2009
Atoms: 14205
=memory
total: 597515544
processes: 571179104
processes_used: 571034752
system: 26336440
atom: 636781
atom_used: 629172
binary: 896016
code: 6305676
ets: 7273468
=hash_table:atom_tab
size: 9643
used: 7414
objs: 14205
depth: 7
=index_table:atom_tab
size: 14336
limit: 1048576
entries: 14205

Как это лечится?

Re: Ejabberd2 падает

Надо в крэшдампе найти процесс, который выжрал память (как правило он один): отгрепай и отсортируй крэшдамп по 'Message queue length', скопируй данные от =proc: до =proc: и покажи здесь.

Вот

Вот:

=proc:<0.4.0>
State: Scheduled
Name: error_logger
Spawned as: proc_lib:init_p/5
Spawned by: <0.1.0>
Started: Tue Oct  6 22:39:26 2009
Message queue length: 1
Number of heap fragments: 0
Heap fragment data: 0
Link list: [#Port<0.3208>, <0.29.0>, <0.0.0>, {from,<0.42.0>,#Ref<0.0.0.45>}]
Reductions: 36787939
Stack+heap: 10946
OldHeap: 75025
Heap unused: 9717
OldHeap unused: 75025
Program counter: 0x291d2958 (gen_event:fetch_msg/5 + 44)
CP: 0x00000000 (invalid)
arity = 0

=proc:<0.1460.1>
State: Waiting
Spawned as: proc_lib:init_p/5
Spawned by: <0.254.0>
Started: Thu Oct  8 08:07:28 2009
Message queue length: 1
Number of heap fragments: 0
Heap fragment data: 0
Link list: [#Port<0.52149>, <0.254.0>, {to,<0.305.0>,#Ref<0.0.1.226944>}, {to,<0.1459.1>,#Ref<0.0.1.226884>}]
Reductions: 16822
Stack+heap: 6765
OldHeap: 6765
Heap unused: 4514
OldHeap unused: 6765
Program counter: 0x291c7e54 (gen:wait_resp_mon/3 + 32)
CP: 0x00000000 (invalid)
arity = 0

=proc:<0.305.0>
State: Garbing
Spawned as: proc_lib:init_p/5
Spawned by: <0.295.0>
Started: Tue Oct  6 22:39:29 2009
Message queue length: 2
Number of heap fragments: 0
Heap fragment data: 0
Link list: [<0.295.0>, {from,<0.1460.1>,#Ref<0.0.1.226944>}]
Reductions: 322091
Stack+heap: 121393
OldHeap: 10946
Heap unused: 48395
OldHeap unused: 10946
Program counter: 0x2b123d9c (mysql_conn:wait_fetch_result/2 + 28)
CP: 0x00000000 (invalid)

И из другого дампа:

=proc:<0.18371.1>
State: Waiting
Spawned as: proc_lib:init_p/5
Spawned by: <0.244.0>
Started: Sat Oct 10 10:03:47 2009
Message queue length: 1
Number of heap fragments: 0
Heap fragment data: 0
Link list: [#Port<0.67498>, <0.244.0>, {to,<0.292.0>,#Ref<0.0.2.86651>}, {to,<0.18370.1>,#Ref<0.0.2.86599>}]
Reductions: 16837
Stack+heap: 6765
OldHeap: 6765
Heap unused: 4514
OldHeap unused: 6765
Program counter: 0x291c7e54 (gen:wait_resp_mon/3 + 32)
CP: 0x00000000 (invalid)
arity = 0

=proc:<0.293.0>
State: Running
Spawned as: erlang:apply/2
Last scheduled in for: mysql_conn:get_with_length/1
Spawned by: <0.292.0>
Started: Thu Oct  8 14:40:30 2009
Message queue length: 6
Number of heap fragments: 0
Heap fragment data: 0
Link list: [<0.294.0>, {from,<0.292.0>,#Ref<0.0.0.8973>}]
Reductions: 967362
Stack+heap: 47828850
OldHeap: 145962050
Heap unused: 13719669
OldHeap unused: 145962050
Program counter: 0x2a6260fc (mysql_conn:get_with_length/1 + 4)
CP: 0x00000000 (invalid)

У остальных 'Message queue length: 0'

Re: Ejabberd2 падает

Что-то огромное у тебя из mysql тянется. Рекомендую прошерстить базу на предмет аномалий. Начни с offline messages.

База

REPAIR и OPTIMIZE делали.

База выглядит следующим образом:

Таблица              Записи Тип    Сравнение       Размер
last                 ~3,015 InnoDB utf8_general_ci 224.0 КБ -
privacy_default_list    ~36 InnoDB utf8_general_ci 16.0 КБ -
privacy_list           ~736 InnoDB utf8_general_ci 160.0 КБ -
privacy_list_data    ~4,428 InnoDB utf8_general_ci 320.0 КБ -
private_storage      ~1,972 InnoDB utf8_general_ci 1.7 МБ -
rostergroups        ~10,477 InnoDB utf8_general_ci 2.9 МБ -
rosterusers         ~61,257 InnoDB utf8_general_ci 17.8 МБ -
spool               ~46,077 InnoDB utf8_general_ci 184.2 МБ -
users                ~3,267 InnoDB utf8_general_ci 224.0 КБ -
vcard                ~1,771 InnoDB utf8_general_ci 9.5 МБ -
vcard_search         ~1,771 InnoDB utf8_general_ci 1.1 МБ

Где конкретно может быть проблема, и с чем она связана вообще?

Re: Ejabberd2 падает

Проблема связана с тем, что какой-то запрос выгребает из mysql слишком много данных, которые забиваются в память.
Попробуй посмотреть распределение оффлайновых мессаг по юзерам, что-то вроде:
$ mysql -p ejabberd -e 'select username from spool;' --skip-column-names --vertical | grep 'username: ' | sort | uniq -c

Сделал запрос, выдал список,

Сделал запрос, выдал список, из них выделяются ярко эти (у остальных 1-30):

5412 username: friogenn
15568 username: mileda
21480 username: sikandar

Думаете это из-за этого может быть?

Re: Ejabberd2 падает

Ну конечно, это ж ненормально - 21k и 15k оффлайновых мессаг. Другие бы таблицы тоже нелохо прошерстить по аналогии.

Re: Ejabberd2 падает

Кстати, а почему OS не даёт эрлангу выделить больше чем 1Gb памяти? У тебя там какие-то лимиты на vmrss стоят? Ведь памяти-то у тебя 4Gb. Или у тебя 32-битный процессор?

32 битный

32 битный, ну в частности bsd 32 битная стоит

Re: Ejabberd2 падает

Может имеет смысл поставить 64-битную? Иначе какой смысл держать 4Gb памяти ;)

Syndicate content