Mnesia memory

113 views
Skip to first unread message

Ostrov

unread,
Feb 7, 2011, 7:16:28 AM2/7/11
to Erlang в России
Всем доброго времени суток.

Недавно изучаю ерланг, и потому есть куча траблов.

Столкнулся с такой проблемой роста памяти в Mnesia. Любое исполнение
транзакции приводит к увеличении отъедаемой памяти.

Есть подозрение, что пишется какой-то журнал транзакций. Никто не
сталкивался с такой проблемой?

-module ( test_tr ).
-export([ start/0, stop/0 ]).

start( ) ->
init_database(),
loop().

loop( ) ->
receive
after
2000 ->
io:format("Memory usage: ~p~n", [erlang:memory(ets)]),
test_trans(),
loop()
end.

stop() ->
mnesia:stop(),
mnesia:delete_schema([node()]),
io:format("~p stop\n", [self()]),
ok.

init_database() ->
R1 = mnesia:stop(),
R2 = mnesia:delete_schema([node()]),
R3 = mnesia:create_schema([node()]),
timer:sleep(1000),
R4 = mnesia:start(),
io:format("Mnesia stop,delete_schema,create_schema:~n~p~n",
[{R1,R2,R3,R4}]).

test_trans() ->
mnesia:transaction(fun() -> ok end).

вывод:

Erlang R14B (erts-5.8.1) [source] [64-bit] [smp:2:2] [rq:2] [async-
threads:0] [hipe] [kernel-poll:false]

Eshell V5.8.1 (abort with ^G)
1> test_tr:start().
Mnesia stop,delete_schema,create_schema:
{stopped,ok,ok,ok}
Memory usage: 335472
Memory usage: 335584
Memory usage: 335696
Memory usage: 335808
Memory usage: 336016
Memory usage: 336176
Memory usage: 336288
Memory usage: 336400
Memory usage: 336512
Memory usage: 336624
Memory usage: 336736
...


Владимир.

ostrovok ostrovok

unread,
Feb 8, 2011, 4:29:36 AM2/8/11
to Erlang в России
Ок. Тишина так тишмна.

7 февраля 2011 г. 15:16 пользователь Ostrov <ostr...@gmail.com> написал:

--
С уважением, Лашко Владимир.
ostr...@gmail.com
ostr...@mail.ru

Anton Fedorov

unread,
Feb 8, 2011, 4:52:33 AM2/8/11
to erlang-...@googlegroups.com

В письме от Втр, 08 Фев 2011, 15:29 ostrovok ostrovok пишет:

>> Есть подозрение, что пишется какой-то журнал транзакций. Никто не
>> сталкивался с такой проблемой?

а почему это проблема? потребление же растёт не до бесконечности.

--
Regards,
Anton Fedorov
Call2ru service
E-Mail: datac...@call2ru.com
Jabber: datac...@call2ru.com
ICQ: 272-35-262
Mobile: +7-913-925-7974 [SMS 24h, Call 05:00-19:00 MSKT (GMT+3)]

ostrovok ostrovok

unread,
Feb 8, 2011, 6:24:14 AM2/8/11
to erlang-...@googlegroups.com
На боевой системе за сутки отъедает 1.5 Гб начиная при старте в 60 MB.
Нагрузка довольно слабая, до 300 соединений на пике. Приходится
перегружать, т.к. становятся заметны некоторые тормоза.

8 февраля 2011 г. 12:52 пользователь Anton Fedorov
<datac...@call2ru.com> написал:

> --
> Страница рассылки: http://groups.google.com/group/erlang-russian
>  Jabber-конференция: erl...@conference.jabber.ru
>  Новости: http://erlanger.ru
> Написать письмо: erlang-...@googlegroups.com
> Отписаться: erlang-russia...@googlegroups.com

Anton Fedorov

unread,
Feb 8, 2011, 8:55:18 AM2/8/11
to erlang-...@googlegroups.com
mnesia:info() в студию.

В письме от Втр, 08 Фев 2011, 17:24 ostrovok ostrovok пишет:

Alexander Dergachev

unread,
Feb 8, 2011, 9:07:50 AM2/8/11
to erlang-...@googlegroups.com
да пожалуйста, репродьюсится у меня так же... память забивается, использовал приведенный пример

mnesia:info().
---> Processes holding locks <--- 
---> Processes waiting for locks <--- 
---> Participant transactions <--- 
---> Coordinator transactions <---
---> Uncertain transactions <--- 
---> Active tables <--- 
schema         : with 1        records occupying 411      words of mem
===> System info in version "4.4.14", debug level = none <===
opt_disc. Directory "/home/adergachev/Desktop/Mnesia.nonode@nohost" is used.
use fallback at restart = false
running db nodes   = [nonode@nohost]
stopped db nodes   = [] 
master node tables = []
remote             = []
ram_copies         = []
disc_copies        = [schema]
disc_only_copies   = []
[{nonode@nohost,disc_copies}] = [schema]
60 transactions committed, 0 aborted, 0 restarted, 0 logged to disc
0 held locks, 0 in queue; 0 local transactions, 0 remote
0 transactions waits for other nodes: []

и потребление памяти растет постоянно. Оставлю сейчас процесс, пусть повесит до завтра, покажу результаты.

2011/2/8 Anton Fedorov <datac...@call2ru.com>



--
With Best Regards,
Alexander Dergachev

Anton Fedorov

unread,
Feb 8, 2011, 9:23:15 AM2/8/11
to erlang-...@googlegroups.com
растет таблица mnesia_transient_decision

судя по всему -- по причине того, что записи о транзакциях в ней есть, но нет
записей о важных транзакциях, достойных записи на диск.

а ротейтится оно по наполнению полезными транзакциями.

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

но вообще это баг, достойный загнать в БТ эриксона.

хотя юзкейз мне непонятен :)

В письме от Втр, 08 Фев 2011, 20:07 Alexander Dergachev пишет:

ostrovok ostrovok

unread,
Feb 8, 2011, 9:31:17 AM2/8/11
to erlang-...@googlegroups.com
Ну так вывел я этот баг из "рабочей" схемы, где в транзакциях стояли
"нужны для базы" вещи.
Просто ищя причину сокращал и сокращал код. Пришел к вырожденной функции.

8 февраля 2011 г. 17:23 пользователь Anton Fedorov

Alexander Dergachev

unread,
Feb 8, 2011, 9:37:05 AM2/8/11
to erlang-...@googlegroups.com
ну если что, в БТ Erlang/OTP Team  оно обязательно попадет, я позабочусь, надо только выяснить по-подробнее что и как.

2011/2/8 Anton Fedorov <datac...@call2ru.com>

Anton Fedorov

unread,
Feb 8, 2011, 9:43:57 AM2/8/11
to erlang-...@googlegroups.com
Боевая система.
8970237 transactions committed, 33700 aborted, 3859 restarted, 4847164 logged to
disc

Памяти ест 363m.
36963434519 mnesia_transient_decision set 265 4258 mnesia_recover
36964806768 mnesia_transient_decision set 244 3943 mnesia_recover
36965916785 mnesia_transient_decision set 357 5638 mnesia_recover
36967735411 mnesia_transient_decision set 30 733 mnesia_recover
почему-то не растет на бревой системе.

В письме от Втр, 08 Фев 2011, 20:31 ostrovok ostrovok пишет:

Anton Fedorov

unread,
Feb 8, 2011, 10:02:44 AM2/8/11
to erlang-...@googlegroups.com
Поменял ваш тесткейс:

Первая тысяча, запуск test:start():
4141080 mnesia_transient_decision set 1002 15331 mnesia_recover

Вторая тысяча, запуск test:loop():
4141080 mnesia_transient_decision set 2002 30845 mnesia_recover

Третья тысяча:
4141080 mnesia_transient_decision set 3002 45845 mnesia_recover

Четвертая:
4141080 mnesia_transient_decision set 4002 61101 mnesia_recover

Пятая:
4141080 mnesia_transient_decision set 5002 76101 mnesia_recover

Шестая тысяча:
4141080 mnesia_transient_decision set 5058 76941 mnesia_recover
24866849 mnesia_transient_decision set 944 14461 mnesia_recover

Обратите внимание, создалась вторая таблица.

Если использовать after 1 вместо after 10 -- то таблица вторая не создавалась и
на 20 тысячах записей.

Если я вызываю mnesia:dump_log() -- новая копия создаётся, всё норм.

Поэтому, вопрос настройки сервера -- сколько памяти есть? есть ли своп?
какие размеры у mnesia_transient_decision на боевом сервере?

==========================

Кажисяма, я понялама!

-mnesia dump_log_write_threshold Max, where Max is an integer which specifies
the maximum number of writes allowed to the transaction log before a new dump of
the log is performed. It defaults to 100 log writes.
=> transaction(ok) не запись, и потмоу логи не ротейтятся по этому принципу

-mnesia dump_log_time_threshold Max, where Max is an integer which specifies the
dump log interval in milliseconds. It defaults to 3 minutes. If a dump has not
been performed within dump_log_time_threshold milliseconds, then a new dump is
performed regardless of how many writes have been performed.
=> думаю, вам надо поставить в 1 минуту.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-module ( test_tr ).
-export([ start/0, stop/0, loop/0 ]).

start( ) ->
init_database(),
loop().

loop( ) ->
loop( 1000 ).

loop( 0 ) ->


io:format("Memory usage: ~p~n", [erlang:memory(ets)]),

mnesia:info(),
ets:i();

loop( N ) ->
receive
after
10 ->
test_trans(),
loop(N-1)
end.

stop() ->
mnesia:stop(),
mnesia:delete_schema([node()]),
io:format("~p stop\n", [self()]),
ok.

init_database() ->
R1 = mnesia:stop(),
R2 = mnesia:delete_schema([node()]),
R3 = mnesia:create_schema([node()]),
timer:sleep(1000),
R4 = mnesia:start(),
io:format("Mnesia stop,delete_schema,create_schema:~n~p~n", [{R1,R2,R3,R4}]).

test_trans() ->
mnesia:transaction(fun() -> ok end).

ostrovok ostrovok

unread,
Feb 8, 2011, 11:08:41 AM2/8/11
to erlang-...@googlegroups.com
Огромное спасибо! Завтра буду эксперементировать.


8 февраля 2011 г. 18:02 пользователь Anton Fedorov
<datac...@call2ru.com> написал:

ostrovok ostrovok

unread,
Feb 10, 2011, 2:29:51 AM2/10/11
to erlang-...@googlegroups.com
Поигрался с настройками. Резкльтаты удовлетворительные, больше 620
мегов не жрет.
Тоже многовато, но уже не тормозит.

8 февраля 2011 г. 19:08 пользователь ostrovok ostrovok
<ostr...@gmail.com> написал:

Anton Fedorov

unread,
Feb 10, 2011, 3:02:49 AM2/10/11
to erlang-...@googlegroups.com
А таки какие параметры в итоге?

В письме от Чтв, 10 Фев 2011, 13:29 ostrovok ostrovok пишет:

ostrovok ostrovok

unread,
Feb 10, 2011, 3:39:27 AM2/10/11
to erlang-...@googlegroups.com
Стабилизировалось на 600 +/- 30 метрах. И по ощущениям не зависимо от нагрузки.

если что, система - FreeBSD 8.1,


Erlang R14B (erts-5.8.1) [source] [64-bit] [smp:2:2] [rq:2]
[async-threads:0] [hipe] [kernel-poll:false]

пока остановился на таких параметрах:

dc_dump_limit 1
dump_log_load_regulation false
dump_log_update_in_place true
dump_log_write_threshold 100
dump_log_time_threshold 40000
schema_location opt_disc

Reply all
Reply to author
Forward
0 new messages