У меня есть это простое приложение 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
- использование памяти увеличивается случайным образом (не при каждом запросе) на 4 тыс.
starman
- как и выше, использование памяти случайным образом увеличивается на 4 тыс.но с более медленной скоростью
Вопрос:
- ПОЧЕМУ повышается использование памяти ?Где утечка и как добиться постоянного использования памяти (особенно на Starman), потому что я не хочу исчерпывать память в долгосрочной перспективе.(ОК, можно определить, например, --max-запросы 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