Страница 1 из 2

Perl Out of memory!

Добавлено: 2008-09-04 14:58:32
iye
Доброго времени суток!
Суть проблемы: Запускаю скрипт который обрабатывает кучу бинарных файлов со статистикой. Скрипт как и положено ему - запускается и начинает активно хавать память. Когда заканчивается оперативка пишет Out of memory! И начинает хавать своп. И все бы хорошо но вот когда общий обем памяти (физическая + своп) достигает ~800 Мб скрипт тихо умирает без матов. Почитал гуглю на эту тему. Выяснил что есть в ядре хитрые цифири которые определяют максимальный размер ресурсов. Точнее вот тут: http://hyperrate.com/topic-view-thread.php?tid=2719 Дык вот. как рассчитать вот эти самые : kern.maxbcache, kern.maxtsiz, kern.dfldsiz, kern.maxdsiz, kern.dflssiz, kern.maxssiz and kern.sgrowsiz. так чтобы не пришлось потом к машине ехать ? На машине 512 мб рамы и 1.5 Гб своп. Заранее благодарен за ответы.

Re: Perl Out of memory!

Добавлено: 2008-09-04 15:36:05
zingel

Код: Выделить всё

ulimit -c 10000

Re: Perl Out of memory!

Добавлено: 2008-09-04 20:58:48
iye
Не помогло. И я что то не понимаю при чем тут количество одновременно открытых файлов и то что процесс превышает лимит по памяти ?

Re: Perl Out of memory!

Добавлено: 2008-09-04 21:12:15
ProFTP
покажите то чт овы делаете?

Re: Perl Out of memory!

Добавлено: 2008-09-04 21:33:30
zingel

Код: Выделить всё

systcl -a | gremp kern | grep max

Re: Perl Out of memory!

Добавлено: 2008-09-04 21:38:18
hizel
рассмотреть вариант изменения алгоритма работы программы?
всетаки скриптовой язык, проще изменить :)

Re: Perl Out of memory!

Добавлено: 2008-09-05 6:03:46
zg
iye писал(а):со статистикой. Скрипт как и положено ему - запускается и начинает активно хавать память.
странный скрипт.... у меня для обработки гигового лога (привязки типа трафика и договора к ip-получателю) требуется несколько (!) килобайт, а сама обработка занимает несколько секунд. При этом неважно какого размера будет лог. Всё реализовано на С.

Re: Perl Out of memory!

Добавлено: 2008-09-05 7:03:27
iye
1) Скрипт писан не мной и он очень сложен, в котором встречаются бинарные вставки на С++. Поэтому переписывать все это у меня не возникает никакого желания. Да и писал все это человек, которому как кодеру я вполне доверяю.
2)
zingel писал(а):systcl -a | gremp kern | grep max

Код: Выделить всё

kern.maxvnodes: 35524
kern.maxproc: 4020
kern.maxfiles: 8040
kern.argmax: 65536
kern.maxfilesperproc: 7236
kern.maxprocperuid: 3618
kern.ipc.maxsockbuf: 262144
kern.ipc.somaxconn: 128
kern.ipc.max_linkhdr: 16
kern.ipc.max_protohdr: 40
kern.ipc.max_hdr: 56
kern.ipc.max_datalen: 156
kern.ipc.msgmax: 16384
kern.ipc.shmmax: 33554432
kern.ipc.mcl_pool_max: 0
kern.ipc.maxsockets: 8040
kern.kq_calloutmax: 4096
kern.maxusers: 250

Re: Perl Out of memory!

Добавлено: 2008-09-05 8:38:20
Alex Keda
я бы рекомендвал увеличить количество рамы на машине.
или переписать скрипт.
==========
300 мегов свопа на машине с 512 рамы - это не работа.

Re: Perl Out of memory!

Добавлено: 2008-09-05 8:39:05
ProFTP
просто так не может быть ничего :evil: :evil:

Re: Perl Out of memory!

Добавлено: 2008-09-05 8:40:22
hizel
ProFTP как бэ намекает, что сделает из этого скрипта конфетку забесплатно :)

Re: Perl Out of memory!

Добавлено: 2008-09-05 8:42:45
ProFTP
hizel писал(а):ProFTP как бэ намекает, что сделает из этого скрипта конфетку забесплатно :)
нет, хотел потелепатировать... :drinks:

Re: Perl Out of memory!

Добавлено: 2008-09-05 8:43:23
iye
lissyara писал(а):300 мегов свопа на машине с 512 рамы - это не работа.
А где написано про 300 мегов свопа ? Своп 1.5 Гб
ProFTP писал(а):просто так не может быть ничего
угу .. не может .. вот и копаю
hizel писал(а):ProFTP как бэ намекает, что сделает из этого скрипта конфетку забесплатно
Мне гараздо интереснее разобраться где вилы )

Re: Perl Out of memory!

Добавлено: 2008-09-05 8:48:54
Alex Keda
iye писал(а):
lissyara писал(а):300 мегов свопа на машине с 512 рамы - это не работа.
А где написано про 300 мегов свопа ? Своп 1.5 Гб
между строк.
процесс умирает на 800 мегах.
значит 800-500=300 мегов процесса находиться в свапе.
у меня на серверах когда две сотни мегабайт в свапе - я суетиться начинаю, при том что на сервере 4 гига рамы.

Re: Perl Out of memory!

Добавлено: 2008-09-05 9:05:36
iye
Машина вполне себе адекватная. В рабочем режиме она хавает не более 100 Мб рамы и все себе вполне летает. А чтобы посчитать итоговые цифирки раз в месяц - можно и подождать. На ней скорость не необходима.
Блин .. где еще ограничения копнуть ... и вот что странно ... до недавнего времени когда выполнялся скрипт и начинал заполнять своп надписи Out of memory! не вылазило ... может в перле есть какие то хитрые ограничения ? Гугль мне на эту тему ничего не рассказал. В login.conf все ограничения стоят в unlimited.

Re: Perl Out of memory!

Добавлено: 2008-09-05 9:35:33
iye
Устану постить .. ладно пойду куплю памяти раз идей больше нет.

Re: Perl Out of memory!

Добавлено: 2008-09-05 9:51:17
hizel
а идей больше и не будет
смысл увеличивать лимит памяти для процесса если он по самые гланды в свопе

Re: Perl Out of memory!

Добавлено: 2008-09-05 11:38:28
zg
iye писал(а):Устану постить .. ладно пойду куплю памяти раз идей больше нет.
iye писал(а):Скрипт писан не мной и он очень сложен, в котором встречаются бинарные вставки на С++. Поэтому переписывать все это у меня не возникает никакого желания. Да и писал все это человек, которому как кодеру я вполне доверяю.
я бы так не доверял, последний раз когда я сталкивался с биллингом на перле, там вся обработка была сделана на массивах :st: идиотизм полнейший

выложи кусок скрипта, можно не весь

Re: Perl Out of memory!

Добавлено: 2008-09-05 11:41:30
hizel
что то я вас не понял
я што же наезд на перл !!?
или всетаки на идиотов? :)

Re: Perl Out of memory!

Добавлено: 2008-09-05 11:43:02
zg
hizel писал(а):или всетаки на идиотов? :)
я когда плохо о перле говорил? :smile:

Re: Perl Out of memory!

Добавлено: 2008-09-05 11:45:32
ProFTP
если на пхп поставить 8Мб в пхп.ини, то он напишет всегда, по-моиму, что памяти не хватило.

если я правильно понял, то mod_perl работает? мало информации вообще :bn:

Re: Perl Out of memory!

Добавлено: 2008-09-05 11:53:58
zg
ProFTP писал(а):если на пхп поставить 8Мб в пхп.ини, то он напишет всегда, по-моиму, что памяти не хватило.
у меня движок кушает в пике 2метра, на сайте постоянно загружены полтыщи разделов, ограничение стоит по-моему в 16метров, так что не надо ;-)
ProFTP писал(а):если я правильно понял, то mod_perl работает? мало информации вообще :bn:
наврядли мод_перл, там биллинг, серверная часть, как я понимаю обработка логов.

Re: Perl Out of memory!

Добавлено: 2008-09-05 12:17:50
iye
Вы хочите кода. Вот нате вам кусок из генерации отчета.

Код: Выделить всё

$message_text .= $owner_id." ".$owner_data::name{$owner_id}."\n";
    @ip_list = keys %$mon_total;
    $need_ip_total = $#ip_list>0;
    if ($need_ip_total) {
        $ip_total[0] = new Math::BigInt 0;
        $ip_total[1] = new Math::BigInt 0;
        $ip_total[2] = new Math::BigInt 0;
        $ip_total[3] = new Math::BigInt 0;
    }
    foreach $ip (@ip_list) {
        $message_text .= "        ".$ip.": ".$mon_total->{$ip}->[2]."\n";
        if ($need_ip_total) {
            $ip_total[0] += $mon_total->{$ip}->[0];
            $ip_total[1] += $mon_total->{$ip}->[1];
            $ip_total[2] += $mon_total->{$ip}->[2];
            $ip_total[3] += $mon_total->{$ip}->[3];
        }
    }
    $message_text .= "        Итого: ".$ip_total[2]."\n" if $need_ip_total;

Re: Perl Out of memory!

Добавлено: 2008-09-05 12:29:06
zg
iye писал(а):$mon_total->{$ip}->[0];
ну и не мудрено, что памяти не хватает, ваш программер вместо того, чтобы взвалить работу с огроменными массивами на мускул, решил сделать её на перле и очень зря, перл кушает горзадо больше памяти чем мускул на тех же таблицах.

Тут нужно делать всю обработку данных на временных таблицах муси, хоть heap, хоть myisam, но никак не на перле. Можешь, конечно оперативу растить, но это путь в никуда. Делать надо на мускуле, перл юзать только как связку.

Re: Perl Out of memory!

Добавлено: 2008-09-05 12:34:58
iye
Все это понятно. Но вот я одного понять не могу - если своп не полный - то почему в него до предела нельзя данные пихать а ? :st: