2010-12-12 2 views
0

Я запускаю несколько экземпляров скрипта, и все работает нормально. Каждый терминал, который я загружаю, строит CPU выше.Perl скрипты hogging CPU

Я запускаю 12 экземпляров и дросселирую 99% двухъядерного процессора. Я полностью уложил свой баран 8 гб DDR3. В какой-то момент во время проекта я использовал mysql, но обнаружил там тяжелые узкие места и случайную ошибку разъединения (о том, что googling сказал мне, может быть сетевым адаптером).

Anyways..Чтобы писать на диск было намного быстрее прямо из оболочки. Используемый модуль WWW: Механизировать

Насколько это возможно, профиль не страшен. Отскок вверх до 24%. Но я достигаю предела в исполнении до 100% загрузки с запущенными 8 или 9 терминальными окнами. Скорее всего, это результат пропускной способности и просто время загрузки. Могу ли я ускорить это вообще? Скажем, прекратите загрузку после # килобайта?

Спасибо, Peter

+1

Что это за скрипты? О чем вы говорите, когда ссылаетесь на «толкание большего количества на ОЗУ и выключение процессора»? Они не являются взаимозаменяемыми ресурсами. – fennec

+3

Вы, кажется, очень смущены. Пожалуйста, взгляните на кого-то, кто не знаком с тем, что вы пытаетесь сделать, и задайте свой вопрос, чтобы такой человек мог понять как ваши цели, так и ограничения. Кроме того, почему вы хотите, чтобы ваш процессор не работал? –

ответ

0

К сожалению, я не верю, что есть способ, чтобы повлиять на поведение интерпретатора Perl, что путь. Вы можете установить лимиты cpu для всех ваших скриптов perl на своем поле, но, насколько я знаю, в perl нет способа сделать это, поскольку интерпретатор сам управляет всем распределением памяти и т. Д.

Вы можете проверить эту ссылку: How to limit CPU usage in perl

Также вы можете посмотреть на потоки в Perl, как это, безусловно, будет более эффективным, а затем запустить интерпретатор для 19 раз.

+0

Спасибо за ответ .. Хм. Ну, а как насчет модуля. Это WWW: Mechanize .. Мысли, чтобы лучше использовать это? Являются ли альтернативы лучше, например, Curl, LWP? –

+3

Вы можете запустить скрипт под 'Devel :: NYTProf' и посмотреть, где ваш скрипт фактически тратит процессорное время. Профилирование! – fennec

+1

WWW :: Модуль Mechanize считается лучшим для веб-обработки. Что касается альтернатив, Mechanize является подклассом LWP, поэтому Mechanize обеспечивает лишь небольшую обработку данных. Для получения дополнительной помощи вы можете опубликовать фактический сценарий, о котором идет речь. @fennec: Хорошая точка! +1 –

1

Но я достигаю предела в исполнение до 100% нагрузки с 8 или 9 терминальные окна работает .. Скорее всего, это результат пропускной способности и просто скачать время ..

Umm ... Нет. Если вы нажмете стену из-за ограничений пропускной способности/времени загрузки, ваши процессы будут блокироваться на вводе-выводе (состояние процесса D в top/ps) и эффективно переходить в спящий режим, потребляя целые циклы процессора пока запрос ввода-вывода не завершится.

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

Обратите внимание, что при работе с 8 или 9 процессами вы гарантированно привяжете процессор на 100%, если один экземпляр усредняет больше, чем 11-12% использования ЦП. Вы не сказали ничего о среднем потреблении процессора в каждом процессе, но если он регулярно отскакивает до 24%, то я бы не удивился, обнаружив, что он составляет в среднем половину того или более.

+0

Дэйв благодарит вас за ввод (мне тоже понравился ваш сайт). Давайте держать этого генерала, поскольку я убежден, что моя неопытность - это ключ. Очевидно, что простая математика при запуске, что многие терминалы с 24% кажутся на 100% после 4 возможных. Есть несколько идей, которые я имею в виду, но, увы, время. FYI, хотя я нашел фантастическую команду «последним» для петель, которая потрясающая! –

+0

Для всех, кого это касается, я нашел отличное решение моей проблемы (частично). При использовании RAND() на сервере mysql мне приходилось индексировать более 300 000 записей каждый раз! Я знал, что RAND() был неэффективен в этом масштабе, но не смог найти альтернативу (попробовал генерировать предыдущие запросы в Perl, которые затормозили клиентскую сторону). Увы .. Пока ... "выберите id из' сходится', где rand ()> .9 order by rand() limit 1; " Этот запрос занял 90% от моих запросов! Вопрос, который у меня есть, - почему? :) –

+0

@Peter: О, ну, это объясняет это, да ... Когда вы используете 'RAND' в запросе, база данных должна генерировать случайное значение для каждой строки в таблице, даже если она возвращает только одна строка в конце. Хуже того, если вы собираетесь 'ORDER BY RAND', тогда он должен сортировать строки по неиндексированному значению, что является относительно дорогостоящей операцией. Добавив «WHERE RAND> .9', теперь он генерирует случайные числа в 330 тыс., Но ему нужно сортировать только 30 000 неиндексированных значений, так как 90% или записи, где первый« RAND »возвращает .9 или меньше, отбрасываются до того, ORDER BY' обрабатывается. –

Смежные вопросы