SuprSonicJetBoy's blog

いろいろです。

LWP::UserAgentでメモリリークする場合があるときの対策

LWP::UserAgentをwhile内で使用した時、メモリリークを起こすことがありました。

単純なコードですが、

my $ua = LWP::UserAgent->new;
my $request = HTTP::Request->new(GET => $URL);

while (1) {
    my $response = $ua->request($request);
    sleep 10;
}

のように、リクエストを投げていました。

すると、数分毎に0.1%ずつメモリの使用量が増えていくという現象が発生。
増加率は少ないので、1日~2日かけてゆっくりと60%まで増えていっていました。

一応、バグレポートとして上がっていて、Net::SSLeayのOCSP処理の問題のようで、 OCSP Staplingが無効にするという対策で改善することができました。

use IO::Socket::SSL;
my $ua = LWP::UserAgent->new;
$ua->ssl_opts(SSL_ocsp_mode => SSL_OCSP_NO_STAPLE);

stackoverflow.com

リクエスト先がOCSP Staplingが無効だったので、とりあえずはOKということにします。