Почему повышается использование памяти plackup (или starman)?

У меня есть это простое приложение PSGI (app.psgi).

use strict;
use warnings;

my $app = sub {
    my $mem = `ps -o rss= -p $$`;
    $mem =~ s/^\s*|\s*$//gs;
    return [ 200, [ 'Content-Type' => 'text/text' ], [ $mem ]];
};

Меня запрашивали 1000 раз выше, и я увеличил использование памяти. В зависимости от того, как был запущен сервер, получилось:

  • plackup - использование памяти увеличивается при первых 3 запросах и остается постоянным для следующих 997 запросов

  • plackup -r - использование памяти увеличивается случайным образом ( не при каждом запросе) на 4k.

  • starman - как и выше, использование памяти случайным образом увеличивается на 4k, но с меньшей скоростью

Вопрос:

  • ПОЧЕМУ увеличивает использование памяти ? Где утечка и как добиться постоянного использования памяти (особенно на Starman), потому что я не хочу, чтобы память закончилась в долгосрочной перспективе. (В ПОРЯДКЕ, можно определить, например, --max-requests 100), но это не ответ на использование памяти.
  • или - что не так в моем примере?

Если кто-то захочет проверить и это - вот мой скрипт для выборки:

use strict;
use warnings;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => 'http://localhost:5000');

my $old_mem = 0;
print "req#\tmem\n";
foreach my $i (1..1000) {
    my $res = $ua->request($req);
    (my $mem = $res->content) =~ s/\D//g;
    next if( $mem == $old_mem );
    print "$i\t$mem\n";
    $old_mem = $mem;
}

Мои результаты:

plackup                 plackup -r              starman
req#    mem             req#    mem             req#    mem
1       7780            1       3924            1       3280
2       7800            2       4296            5       3728
3       7804            3       4304            8       3280
                        ...                     ...
                        ... deleted             ... deleted
                        ...                     ...
                        839     4596            994     3912
                        866     4600            998     3908
                        962     4604            1000    3912

Итак,

  • почему plackup поднимает первые 3 запроса?
  • plackup -r - увеличение на 4k (см. последние строки) - в начале намного больше
  • starman - тоже повышение, но по умолчанию 5 рабочих медленнее (3280-> 3912)

Версии:

# cpanm Plack Starman
Plack is up to date. (0.9979)
Starman is up to date. (0.2010)
# perl -v

This is perl 5, version 12, subversion 3 (v5.12.3) built for darwin-thread-multi-2level
5
задан kobame 23 May 2011 в 15:12
поделиться