[Moscow.pm] Socket и утечка памяти
Nick Knutov
mail на knutov.com
Вт Янв 8 16:22:26 PST 2013
А обновиться до 5.14 можно?
08.01.2013 21:08, Loginoff Nick пишет:
> Добрый день.
> Появилась интересная проблема, с которой в одиночку справится не могу и
> обращаюсь к вам.
>
> Perl v.5.8.8
> Операционка CentOs
>
> Суть ПО - есть несколько миллионов предложений, программа, с помощью
> SynamDaemon (когда-то взятом с aot.ru) получает полную семантику
> предложения, далее проводит кое-какие действия и получаем "новое
> предложение" (авторерайтинг). В программе были замечены хаотические
> утечки памяти. Копание и копание и копание нашло место утечки.
> SynamDaemon на некоторых(редких) предложениях передает в скрипт не 1-2кб
> данных как обычно, а более 500кб, доходя до 30Мб. Перл выделяет память
> на получение данных и не освобождает её, причем выделяет довольно
> крупные размеры и через пару часов работы скрипта он зажирает всю память
> сервера.
>
> Исходники лежат тут http://wwproject.ru/img/test.tar.gz
> На код не холиварить, там все сумбурно, чтобы собрать всё в единый тест.
>
>
> Я собрал порядка 500 предложений, на которые SynamDaemon неправильно
> реагирует и прогоняю их по этому тесту.
> Сразу отмечу, что проверял много раз и память выделяется именно в момент
> $remote->getline()
> Кусок кода:
> sub test {
> my $sentences = Conf->base('slave')->selectall_arrayref("SELECT *
> FROM parse_test ORDER by id ASC", { Slice=>{} } );
> foreach my $sentence (@$sentences) {
> print "\n--------------------\n";
> print "ID: ".$sentence->{'id'}." ";
> my $ret_rules = get_socket_data($sentence->{'data_text'});
> print "\n Memory: ".get_memory();
> }
> }
>
> sub get_socket_data {
> my $sentence = shift;
>
> $sentence = utf_to_cp1251(pack 'C*', unpack 'U0C*', $sentence);
>
> my $lang = "_Russian";
> my $str = $lang."#".utf_to_cp1251($sentence);
> my $strLen = length($str);
>
> my $req = pack("V", $strLen).$lang."#".$sentence;
>
> my @data=();
>
> my $remote = IO::Socket::INET->new(
> 'Proto' => 'tcp',
> 'Timeout' => 3,
> 'PeerAddr' => 'localhost',
> 'PeerPort' => 9090
> );
>
> if ($remote) {
> print $remote $req;
> #push @data,$remote->getlines();
>
> my $i=0;
> while ( my $line = $remote->getline ) {
> push @data,$line;
> $i++;
> }
> #warn "Lines: ".$i; # вот тут оказалось, что все идет в 1 строку
> close $remote;
> }
>
> my $result = pack 'U0C*', unpack 'C*', cp1251_to_utf(join('', на data));
>
> print "Get Length: ".(length $result);
>
> return $result;
> }
>
>
> Кусок кода из логов:
> --------------------
> ID: 1 Get Length: 1157940
> Memory: 124506112
> --------------------
> ID: 2 Get Length: 1730569
> Memory: 169852928
> --------------------
> ID: 3 Get Length: 3447876
> Memory: 280252416
> --------------------
> ID: 4 Get Length: 1009747
> Memory: 272359424
> --------------------
> ID: 5 Get Length: 1085522
> Memory: 272359424
> --------------------
> ID: 6 Get Length: 3535001
> Memory: 296792064
> --------------------
> ID: 7 Get Length: 2091008
> Memory: 292573184
> --------------------
> ID: 8 Get Length: 2776465
> Memory: 301273088
> --------------------
> ID: 9 Get Length: 5706835
> Memory: 445558784
> --------------------
> ID: 10 Get Length: 6386430
> Memory: 561889280
> --------------------
> ID: 11 Get Length: 2291249
> Memory: 522055680
> --------------------
>
>
> --------------------
> ID: 212 Get Length: 1769513
> Memory: 731144192
> --------------------
> ID: 213 Get Length: 550348
> Memory: 731144192
> --------------------
> ID: 214 Get Length: 541876
> Memory: 703389696
> --------------------
> ID: 215 Get Length: 17032988
> Memory: 1192304640
> --------------------
> ID: 216 Get Length: 4204764
> Memory: 1158500352
> --------------------
> ID: 217 Get Length: 1631550
> Memory: 1158500352
> --------------------
>
>
> --------------------
> ID: 251 Get Length: 724272
> Memory: 1110773760
> --------------------
> ID: 252 Get Length: 2905076
> Memory: 1126662144
> --------------------
> ID: 253 Get Length: 1179906
> Memory: 1126662144
> --------------------
> ID: 254 Get Length: 26327835
> Memory: 1879842816
> --------------------
> ID: 255 Get Length: 2612506
> Memory: 1762312192
> --------------------
> ID: 256 Get Length: 1997323
> Memory: 1762312192
> --------------------
>
> --------------------
>
> Главный вопрос тут, почему память не освобождается? И какие есть
> возможные пути решения?
>
> --
> С Уважением, Login|off Nick или STork.
>
>
--
Best Regards,
Nick Knutov
http://knutov.com
ICQ: 272873706
Voice: +7-904-84-23-130
Подробная информация о списке рассылки Moscow-pm