Автор Тема: Perl и оперативка  (Прочитано 4437 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CyRUS

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 2
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Perl и оперативка
« : 05 Сентября 2003, 11:18:07 »
Народ, такая проблема!
запускаю perl скрипты(у меня IIS 5.0) все отлично работает, но черз некоторое время все виснет т.к. оперативка полностью забита. мне каждется что после запуска скрипта perl не возвращает память... причем это у меня со всем pl скриптами...
в чм может быть дело?

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Perl и оперативка
« Ответ #1 : 05 Сентября 2003, 11:28:55 »
Она как...
Тут нужно смотреть скрипт и читать дебаги.
Но вот ты мне ответь, с какого такого бодуна запускать Perl скрипт на IIS?
Это религия или что другое?
The documentations is your friend

Оффлайн КшЫуфксрук

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 99
  • +0/-0
  • 0
    • Просмотр профиля
    • http://risearch.org/
Perl и оперативка
« Ответ #2 : 05 Сентября 2003, 16:37:47 »
Ну да, Перл память не возвращает. Он ее потом снова пытается использовать. Но в больших и сложных скриптах часто (точнее почти всегда) случается так, что Перл периодически берет понемногу все новые блоки памяти. И если скрипт работает очень долго, внешне это может выглядеть так, как будто у него утечка памяти (хотя это не утечка, он как бы все за собой подчищает, но для ускорения работы ему проще запросить у системы новый блок памяти, чем пытаться найти свободный в своем сборщике мусора. Все это очень сильно зависит от того, что и как делает скрипт. Там много тонких моментов, что и как нужно и не нужно делать, но полного контроля над памятью все равно не добиться, Перл будет есть столько, сколько посчитает нужным. В одном скрипте я даже свой хеш реализовал, чтобы контролировать потребление памяти, но она все равно утекала в других местах.

Но на вебсервере это обычно не является большой проблемой, потому что после окончания работы скрипта память возвращается системе (это не относится к mod_perl, там всегда нужно быть очень осторожным).

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Perl и оперативка
« Ответ #3 : 05 Сентября 2003, 16:55:44 »
Цитировать
КшЫуфксрук:
Ну да, Перл память не возвращает.

У меня были совершенно противоположные наблюдения. Правда это под mod_fastcgi...
The documentations is your friend

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Perl и оперативка
« Ответ #4 : 07 Сентября 2003, 18:56:35 »
Да там и IP хватит. Он постоянный

может быть os так поступает?

Оффлайн CyRUS

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 2
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Perl и оперативка
« Ответ #5 : 08 Сентября 2003, 00:02:15 »
Вообщем тут дело такое... на web сервере стоит статистика для игры Counter-Strike. Есть мониторинг сервера КС, который отображает кто сейчас играет на сервере, количество игроков, текущю карту т.д. Скрипт написан на perl и в своей работе подгружает exe файл (QSTAT.org), который в свою очередь берет инфу с сервера кс. Perl скрипт в свою очередь является темплэйтом для вывода результатов. Через пару десяткой рефрешей все виснет!

Вот скрипт:


#!/usr/local/bin/perl
#print STDERR "hello\\n";
print "Content-type: text/html\\n\\n";
print <<
EOF;
<
html>
<
head>
<
title>Nautilus Net CS Stats Мониторинг</title>
<
meta HTTP-EQUIV="Refresh" content=20>
<
meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<
style>
.
plrheader {
  
background-color
	
#142234;
  
filter
	
	
alpha(opacity=80);
}
.
plrmiddle {
  
background-color
	
#142234;
  
filter
	
	
alpha(opacity=00);
}
.
plrrow {
  
background-color
	
#142234;
  
filter
	
	
alpha(opacity=70);
}

.
toprow {
  
background-color
	
#142234;
  
filter
	
	
alpha(opacity=60);
}
.
bottomrow {
  
background-color
	
#142234;
  
filter
	
	
alpha(opacity=60);
}
.
stat_highlight {
  
background-color
	
#142234;
}

.
table1 {
  
background-repeat
	
no-repeat;
  
background-position
	
center;
}

.
plrheaderrow {
  
background-color
	
"black";
}

.
plrheaderfont {
  
color
	
	
"white";
}

.
tablecell2 {
  
background-colorblack
  
filteralpha(opacity=80);
}
</
style>

</
head>

EOF


open
(QSTAT"E:/Users/AHTOHuO/Local/Stats/cgi-bin/qstat -P -sort T -tsw -nh -f server.lst |");
$count=0;
while(<
QSTAT>) {
	
chop;
	
if (
$count == 0) {
	
	
(
$server$players$map, @servername) = (split(/[\\s]+/))[0127..20];
	
	
if (/
DOWN/) {
	
	
	
$servername "Сервер выключен!";
	
	
	
$countplayers 0;
	
	
	
$maxplayers 0;
	
	
	
$map "Нет карты.";
	
	
} else {
	
	
	
$servername join(\' \', @servername);
	
	
	
$servername =~ s/\\s+$//g;
	
	
	
($countplayers, $maxplayers) = (split(/[\\/]/, $players));
	
	
}

	
	
print \' <body background="../images/stat/\'.$map.\'.jpg" leftmargin=0 topmargin=0 marginwidth=0 marginheight=0>\'."\\n";
	
	


	
      
	
print \'<table width="300" height="225" border="0" cellpadding="0" cellspacing="0" align="left">\'."\\n";
        
	
print \'<tr align="left" height="99%" valign="center" align="center">\'."\\n";
          
	
print \'<td valign="top" style="background-image: none;">\'."\\n";
   
	
        print \'<table width="100%" border="0" cellpadding="0" cellspacing="0">\'."\\n";
        
	
print \'<tr><td class="toprow" align="center"><font style="font-family: Arial; font-size: 15px; font-weight: bold; color: white;">Карта: \'.$map.\'</font></td></tr>\'."\\n";
            
	
print \'</table>\'."\\n";
	
	
print \'<center>\'."\\n";

	
	
print \'<table width="295" border="0" cellpadding="0" cellspacing="0">\'."\\n";
	
	
print \'<tr><td colspan="4" width="295"><font style="font-size: 6px;"> </font></td></tr><tr>\'."\\n";
	
	
print \'<td class="plrheader" style="background-image: none;" align="left" width="127">\'."\\n";
	
	
print \'<font style="font-family: Arial; font-size: 10px; color: white;"> Ник</font></td>\'."\\n";

	
	
print \'<td class="plrheader" style="background-image: none;" align="right" width="62">\'."\\n";
	
	
print \'<font style="font-family: Arial; font-size: 10px; color: white;">Фраги </font></td>\'."\\n";
	
	
print \'<td class="plrheader" style="background-image: none;" align="right" width="65">\'."\\n";
	
	
print \'<font style="font-family: Arial; font-size: 10px; color: white;"> Время</font></td></tr>\'."\\n";

	
	
$maxplayers = 20 if ($maxplayers == 0);
	
} else {
	
	
s/^\\s+//g;
	
	
($frags, $times, @username) = (split(/[\\s]+/))[0, 2, 3..10];
	
	
$username = join(\' \', @username);
	
	
$username =~ s/\\s+$//g;
	
	
print \'      <tr>\'."\\n";
	

	
print \'<td class="plrrow" style="background-image: none;" align="left" width="127"><font style="font-family: Arial; font-size: 10px; color: white;"> \'.$username.\'</font></td>\'."\\n";
	
print \'<td class="plrrow" style="background-image: none;" align="right" width="62"><font style="font-family: Arial; font-size: 10px; color: white;">\'.$frags.\'</font></td>\'."\\n";
	
print \'<td class="plrrow" style="background-image: none;" align="right" width="65"><font style="font-family: Arial; font-size: 10px; color: white;">  \'.$times.\'</font></td>\'."\\n";
}
	
$count++;
}


        print \'</tr></table></td></tr><tr align="center" valign="bottom">\'."\\n";
	
print \'      <td class="bottomrow" style="background-image: none;"><font style="font-family: Arial; font-size: 12px; color: white;">Игроков на сервере: \'.$countplayers.\'/\'.$maxplayers.\'</font></td></tr>\'."\\n";




print <<EOF;
      </table>
</body>
</html>
EOF


Оффлайн КшЫуфксрук

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 99
  • +0/-0
  • 0
    • Просмотр профиля
    • http://risearch.org/
Perl и оперативка
« Ответ #6 : 08 Сентября 2003, 11:20:15 »
To CyRUS:

Неужели так трудно было вырезать оформление, которое абсолютно не интересует читателей этого форума? А вообще я сомневаюсь, что подобный скрипт может повесить сервер. Может qstat вешает?

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Perl и оперативка
« Ответ #7 : 08 Сентября 2003, 12:13:41 »
CyRUS
А ты не пробовал закрыть QSTAT? close например?
И потом IMHO лучше выгрузить полученные данные в переменную или массив и потом производить обработку, а не держать файл открытым во время обработки, и проверь выгружается ли у тебя из памяти qstat после выдачи данных.

Оффлайн mike

  • ProPerl\'er
  • Старожил
  • ****
  • Сообщений: 435
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Perl и оперативка
« Ответ #8 : 08 Сентября 2003, 12:14:16 »
CyRUS
А ты смотрел, какие именно процессы кушают память? Может, это не один процесс, а туча клонов одной программы, например, того же qstat\'a?
[ основной браузер когда-то был, теперь попробуй разберись =]

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28