Perl — танец на мультипоточных граблях.

Posted: 2012-03-04 in IT, Software
Метки:

Итак, первая радость от применения мультипоточности в Perl разбилась от жестокого удара граблями. …

Скрипт, вполне себе работавший на 300 нитях, сдох при попытке обработать 600 нитей, несмотря на то, что их завершение было корректно прописано. Берем вот такой вот тестовый скрипт:

#!/usr/bin/perl -w

print "# Test Threads In Perl n";

use threads;
use threads::shared;

sub thrd($) {
  my $num = shift;
  print "   In-thread :: [$num] n";
  threads->exit(0);
  return 0;
}

for ($n = 0; $n < 600; $n++) {
  print "=== Create thread [$n] ===n";
  threads->create(&thrd, ($n));
};

sleep 20;

$_->join for(threads->list());

print "=== End. === n";

Запускаем в линуксе, и видим полнейший ахуй:

$ ./threads_test.cgi
# Test Threads In Perl
=== Create thread [0] ===
=== Create thread [1] ===
   In-thread :: [0]
=== Create thread [2] ===
   In-thread :: [1]
=== Create thread [3] ===
   In-thread :: [2]
=== Create thread [4] ===
   In-thread :: [3]
=== Create thread [5] ===
   In-thread :: [4]
...
=== Create thread [360] ===
   In-thread :: [359]
=== Create thread [361] ===
   In-thread :: [360]
=== Create thread [362] ===
   In-thread :: [361]
Thread creation failed: pthread_create returned 11 at ./threads_test.cgi line 17.
=== Create thread [363] ===
Thread creation failed: pthread_create returned 11 at ./threads_test.cgi line 17.
=== Create thread [364] ===
Thread creation failed: pthread_create returned 11 at ./threads_test.cgi line 17.
=== Create thread [365] ===
...
=== Create thread [599] ===
Thread creation failed: pthread_create returned 11 at ./threads_test.cgi line 17.
=== End. ===

После долгого чтения манов и гугления находим, какую функцию вызывает перл, и уже гораздо ниже уровнем находим суть проблемы в форуме совершенно иной тематики: http://forum.sources.ru/index.php?showtopic=247550 и восхищаемся:

система банкротится на целых 9(!) метров ОЗУ. Причём, при завершении этого потока путём pthread_exit(0); память не освобождается.

Открываем второй шелл, запускаем скрипт от отдельного пользователя (чтобы в htop с фильтром по пользователю не было не относящихся к делу процессов) и созерцаем восхитительное: Вообщем, вставляя в скрипт паузы, удалось выяснить, что несмотря на вызов threads->exit(0); , по завершении нити выделенная ей память не освобождается. Ну а поскольку нитей надо создавать много, и каждая ест чудовищные 9Мб, то при VIRT=3Gb скрипту вполне закономерно приходит северный полярный лис.

Но самая жесть — что на FreeBSD 7.3 такой проблемы нету, хотя потребление памяти тоже пиздецовое:

  PID USERNAME  THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
 6669 test        1   8    0   342M   262M nanslp  1   0:02  4.20% perl5.8.9

Мне конечно хорошо, что нужный мне скрипт будет в конечном итоге работать именно на фряхе, но как-то такие баги совсем не радуют, кроссплатформенность пошла по пизде, и это очень, очень плохо.

- комментарии
  1. anonymous:

    Karman writes:Тролололололо!!!!111одинодин.Я всегда знал? что аргумент "У меня все работает ЧТОЯДТ?" уёбищен в нашем не совершенном мире.

  2. anonymous:

    Анонимно writes:говрю ж, на хуй этот ебаный перл! если в двух словах, то перл по сути это пизда не бритая: хуй найдешь трещину, куда вставлять. и ваще… ушел доводить до ума руткит под никсы. пиздец грядет никсам!

  3. Aminux:

    А каким именно никсам грядет пиздец ? А то их тут чего-то много развелось…JunOS, Ubiquity AirOS и новые Cisco IOS — опасносте ? И как срочно мне надо переезжать с фрях и федор на Шindoшs-2008 ?Кстати, насколько легко встроенными средствами в виндовс-2008 замутить скрипт, который законнектиться к базе, возьмет оотуда список железок и портов, и за адекватное время через телнет/ссш настроит автоматически ацл-ки на 600 железках ?

  4. anonymous:

    Анонимно writes::lol: про переезд на вантуз смешно сказано! пиздец, что в разработке, это капля в море тех пиздюлей, что творятся в цифровом мире, будь то никсы или вантуз. (кстати, рута под сиську). под вантуз вири писать уже как-то даже не интересно, там ведь одна пизда слабая на хуевертел. да и хуй с ним… насколько? да легко, на поше, например. вот тока пример накидать не могу, сижу под опенсюзей, проверить негде.

  5. anonymous:

    Perlovka writes:А мну Perl ндравится, даже несмотря на высеры прочих об уёбищности сабжа. Уже лет семь как на "перловке" и полет нормальный. Есть правда кое-какие косяки, но это не критично. Язык хороший. Я бы с удовольствие читал посты господина Amin'а о перле на http://forum.script-coding.com/ — эдаком средоточии скриптописателей. Даже несмотря на большой програмярский ёпыт мне есть чему поучиться.

  6. Aminux:

    Кстати, не подскажите тогда, как мне красиво вывернуться из такой задницы с многопоточностью ? Мне пока пришла мысль принимать параметрами число железок и номера блока с (0 по 6 например), после чего последовательно запускать 6 разных процессов, каждый из которых будет апдейтить по 100 железок параллельно. Но это будет уже два-три скрипта, а не один + параметр LIMIT m,n для SQL-запроса.Может есть менее костылистое решение ? Не хочу ждать три минуты на последовательный обход в один поток…За приглашение спасибо, но на форумы я как-то обращаюсь сугубо по тематическим вопросам, и это чаще всего форумы производителей софта и железа. Свою инфу я предпочитаю выкладывать и модерировать сам, без оглядки на кого-либо.Да и не считаю себя настолько продвинутым скриптописателем-гуру.

  7. anonymous:

    Читатель writes:Скажу сразу, нравится многое из того что тут прочитал. Со многим согласен.Но иногда вас заносит. Вот это уже фанатизм:"Кстати, насколько легко встроенными средствами в виндовс-2008 замутить скрипт который законнектиться к базе, возьмет оотуда список железок и портов".Вам что-то мешает установить на винду перл? Или другой интерпретатор?Неужели в бсд или федоре вы скрипты пишете прямо в ядре на ассемблере? 🙂 или даже бинарными кодами? :)перл он вроде бы не "встроенное средство" 🙂

  8. anonymous:

    МэтрХуйСКилометр writes:[Потёрто]Оскорбления и переход на личности тут не приветствуются. Простите, если сможете.

  9. Aminux:

    Читатель, ключевое слово тут — "установить". На каждый элементарный чих мне надо что-то установить, обновить, пропатчить и довольно часто — раза три перезагрузить. Перл — он какбе в репозитариях есть. И базовый перл — таки да, встроенное средство.Иногда конечно надо поставить модули, но для этого есть репозитарии. А в виндовс ничего с подобным уровнем удобства и близко нет. И в ближайшие лет пять точно не появится. Я не хочу возиться с виндой, она меня достала до самых печенок. Понятно объяснил ?И кстати, если вы заговорили про ассемблер и даже машинные коды — я так понимаю, ваш уровень компетенции позволяет оценить сложность разработки подобным методом ? Если позволяет, зачем несете бред про ядро ?

  10. anonymous:

    mo(u)Z writes:Не пойму всех этих холиваров: "винда достала", "линукс говно"… Давайте посмотрим на все трезво: есть те, кому удобнее в работе использовать никсы и те, кому более приятна винда, — а холиварить и нести бред по поводу, что вот то-то я могу сделать в этой ОСи, а то нет, не имеет ничего общего с объективностью данных, ведь нет ничего совершенного из того, что делается человеком, всегда найдется какой-нибудь баг, а потому выбор ОСи, языка программирования, интернет обозревателей, стиля одежды, женщин (нужное подчеркнуть) завист напрямую в конечном итоге от личных пристрастий, не более. Ну нравится Amin'у никсы, что с того? Мне, например, нравится OpenSUSE и Fedora, но чаще приходится работать с Windows. А Perl как язык программирования мне никогда не нравился, хотя и на нем приходится кодить порой. Я предпочитаю Python (кто-то назовет это данью моде, но мне просто приятен этот язык), если речь об интерпретируемости. Что же касается компилируемости, то мне нравится Assembler и Си (причем чистый, а не приплюснутый).

  11. Aminux:

    Да нет никаких холиваров. Есть задача — обойти свыше 600 железок скриптом и твикнуть их, причем многопоточно, каждая нить — одна железка и одно сетевое соединение. Извините, но виндоффс — это не та система, которой я могу это доверить. (* ехидно намекая на фотку синего экрана в afd.sys)С перлом я еще немного поиграюсь, и если не найду способ победить многопоточность — буду пробовать питон.Ассемблер пиздат, когда пишется прошивка к аццкому микроконтроллеру. Для моих же задач он решительно непригоден.