Утечка памяти в Perl LWP с использованием HTTPS
Я думаю, что я обнаружил утечку памяти с LWP при подключении через HTTPS. При использовании следующего сценария использование памяти постоянно увеличивается:
use LWP::UserAgent;
$ua = LWP::UserAgent->new();
$request = HTTP::Request->new(GET=>'https://www.google.com/');
while (1) {
$response = $ua->request($request);
sleep(1);
}
Этот другой скрипт не имеет проблем:
use LWP::UserAgent;
$ua = LWP::UserAgent->new();
$request = HTTP::Request->new(GET=>'http://www.google.com/'); # https => http
while (1) {
$response = $ua->request($request);
sleep(1);
}
Perl 5.12.3 / LWP 5.837 / Crypt:: SSLeay 0.58 / Mac OS X 10.7.4
Кто-нибудь знает способ обойти это?
ОБНОВИТЬ
Perl 5.12.4 / LWP 6.05 / Crypt::SSLeay 0.64 / Mac OS X 10.8.4
Утечка памяти все еще существует при подключении через HTTPS. Чтобы попробовать это, запустите образец сценария на терминале и посмотрите, как увеличивается и увеличивается объем памяти с помощью Activity Monitor.
ОБНОВИТЬ
После некоторого тестирования я обнаружил, что с недавним обновлением моих библиотек все еще остается утечка памяти, но это происходит только при вызове определенных адресов по HTTPS. В приведенном выше примере я звонил по https://www.google.com/, и это один из этих адресов. Например, этот код не дает мне утечек памяти:
use LWP::UserAgent;
$ua = LWP::UserAgent->new();
$request = HTTP::Request->new(GET=>'https://twitter.com/'); # www.google.com => twitter.com
while (1) {
$response = $ua->request($request);
sleep(1);
}
ОБНОВИТЬ
Я сообщил об ошибке, и некоторые другие подтвердили мои выводы: https://rt.cpan.org/Ticket/Display.html?id=88287
2 ответа
В Linux с Perl 5.10, Crypt 0.58, Lwp 6.02 использование памяти постоянно. Попробуйте обновить ваши Perl-модули до последней.
Если проблема все еще существует, создайте билет RT для этой проблемы, и обслуживание этого модуля устранит утечку.
С Уважением,
По крайней мере для меня кажется, что вы можете обойти эту проблему, отключив проверку имени хоста:
my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
Очевидно, что это не рекомендуется, если безопасность важна для вашего приложения!