Почему повышается использование памяти в виде плакапа (или стармэна)? - PullRequest
5 голосов
/ 23 мая 2011

У меня есть это простое приложение 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

Ответы [ 2 ]

5 голосов
/ 24 мая 2011

Основываясь на комментариях miyagava , ответ таков:

"plackup - использование памяти возрастает в первые 3 запроса и остается постоянным для следующих 997 запросов" Это означает, чтонекоторые модули загружаются в первые несколько запросов.После этого нет утечки.- miyagawa 14 часов назад

По умолчанию Starman включает поддержку активности и конвейерную передачу HTTP, что означает, что если вы отправите 1000 запросов за короткий промежуток времени, у вас будут подключены эти соединения, если вы явно не отключите их.Я могу подтвердить это с помощью ApacheBench - память временно увеличивается, но когда они отключаются / тайм-аут, память возвращается туда, где она была.- Миягава 14 часов назад

спасибо.

1 голос
/ 23 мая 2011

Вы использовали последнюю версию? Я не могу воспроизвести ваш вывод.

С "plackup":

sidburn@sid:~/perl/plack$ ./memory.pl 
req#    mem
1   5340
2   5380

С "plackup -r":

sidburn@sid:~/perl/plack$ ./memory.pl 
req#    mem
1   4860
2   5060

С "звездным":

sidburn@sid:~/perl/plack$ ./memory.pl 
req#    mem
1   5176
5   5224
6   5176
7   5224

Версия:
Perl: 5.12.1 и 5.12.3
Plack: 0,9979
Starman: 0.2010

...