2012-06-21 3 views
0

гуру.утечка памяти в скрипте perl, использующем while (1)

У меня есть скрипт perl, который нужно запускать в бесконечном цикле и контролировать загрузку среднего gnu/linux в среднем и бесплатно, и отправлять электронное письмо с использованием учетной записи google, если значение load/ram выше/ниже установленного значения.

я нашел эти

Memory usage of Perl script

How can I find memory leaks in long-running Perl program?

и сделали, как предложено использовать UNDEF, но это не кажется, помогает, как, скорее всего, у меня есть что-то, что никогда не будет очищено/освобожденного.

here's a sample о том, как использование памяти постоянно увеличивается, и через день он может выделять довольно много баранов.

Here's the perl script. Может кто-нибудь указать мне где-нибудь, как это исправить. Благодарю.

ответ

1

Помимо использования cron, есть много инструментов для мониторинга системы, которые делают все это для вас.

В любом случае - это будет легче проверить, где используется память, если написать несколько подпрограмм по линиям:

while (1) { 
    my $cpu = ... 
    my $stat = ... 
    if (need_to_send_msg($cpu, $stat)) { send_message($cpu,$stat) } 
} 

sub send_message { 
    my ($cpu, $stat) = @_; 
    my $msg_body = compose_message($cpu, $stat); 
    transmit_message($msg_body, $from, $to); 
} 

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

Ох - мне кажется, что вы постоянно создаете $ smtp-соединения, даже если вы не собираетесь отправлять сообщение. Было бы легче убедиться, если у вас есть основной цикл меньше, используя некоторые подпрограммы.

+0

+1 для подключения smtp. Я тоже это заметил. @ViruSzZ: Это занимает время, память и создает соединение на каждой итерации. Почему бы не создать его, только если вам это нужно, подпрограмма или нет? – simbabque

+0

Да, вы были правы. Я сделал переписку, и теперь кажется, что сценарий не выделяет более 9 мб баранов. вот как переписывание выглядит => http://pastebin.com/1JJ50btn и соответствующее использование мем => http://pastebin.com/fVTs1pzj есть какие-либо советы я могу сделать для того, чтобы уменьшить использование памяти сценария? – ViruSzZ

+0

Это 1,7% вашей оперативной памяти и устойчиво удерживается - даже если вы отрубите еще 25% от своего использования, вы никогда не заметите. Однако я бы добавил несколько подпрограмм - это упростит просмотр основного цикла и облегчит изменение различных частей скрипта. –

1

Утечка может скрываться в части XS модулей. Похоже, что на Perl нет утечки. Вы можете попытаться удалить внешние модули один за другим и проверить, когда происходит утечка.

В любом случае, он выглядит достаточно маленьким и не содержит постоянных данных между итерациями. Почему бы не поставить его на cron, чтобы он запускал каждую минуту, а не сохранял его в памяти в любое время?

+0

Да, я согласен с использованием cron - лучшее решение, но я просто играю там со сценарием и не был уверен, что утечка памяти может исходить из части perl .... Я использую Sys: : Статистика :: Linux; Net :: SMTP :: SSL; поэтому попробуйте отключить и посмотреть, вызвано ли это любым из них ... спасибо – ViruSzZ

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