А обновиться до 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 mailing list [email protected] | http://moscow.pm.org
