parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Помогите разобраться в статистике ресурсозатрат

Саян 09.02.2014 13:56

Привет. Исследуя странное расходы памяти Парсером в некоторых конфигурациях, я сделал вот такой скрипт (код ниже). Но прежде чем приступать к серьезным измерениям, обнаружил несколько неожиданное поведение статусных параметров. Точнее:
- время работы скрипта, переданное в utime, на 10-20 ms больше времени, вычисленного как разность абсолютных дат с момента старта и окончания скрипта. Почему?
- время отклика веб-сервера при загрузке с того же самого хоста примерно вдвое превышает время выполнения типового скрипта. Это Apache с Nginx'ом такие тормозные или Парсер что-то не учитывает?
- в довесок: ^sleep() на 3.4.3/Debian, похоже, игнорирует дробные значения.

В общем, у меня такие параметры получились:
Среднее время выполнения скрипта utime 15.201 ms
Среднее время выполнения скрипта d(tv) 6.627 ms
Среднее время ожидания отклика 51.337 ms

Сам скрипт (для установки достаточно скопировать текст в любой файл):
@main[]
$timestart(^curtime[])
$u[^request:uri.split[?;lh]]$u[$u.0]
#загружает сам себя
$loadurl[http://$env:SERVER_NAME/$u?load_tester=1]
#или загружает главную страницу
#$loadurl[http://$env:SERVER_NAME/?load_tester=1]
$rm[^table::create{utime	tv	maxrss	usedmem	allmem}]


$wait(0)
$cnt(^form:cnt.int(0))
^if($cnt){
#больше 1000 итераций не дает существенного улучшения статистики
	^if($cnt > 1000){$cnt(1000)}
	^for[i](0;$cnt){
		$rn(^math:random(9999))
		^if($rn > 9900){^memory:compact[]}
		$before(^curtime[])
		$x[^file::load[text;$loadurl&rn=$rn][$.any-status(true)]] 
		^wait.inc(^curtime[] - $before)
		^rm.append{^untaint{$x.text}}
	} 
	
	$utime(0) $tv(0) $maxrss(0) $usedmem(0) $allmem(0)
	^try{
		^rm.menu{^utime.inc($rm.utime) ^tv.inc($rm.tv) ^maxrss.inc($rm.maxrss) ^usedmem.inc($rm.usedmem) ^allmem.inc($rm.allmem)}
	}{^blad[]}
	$rmc(^rm.count[])
	<p>Среднее время выполнения скрипта utime ^eval($utime / $rmc * 1000)[%.3f] ms
	<p>Среднее время выполнения скрипта d(tv) ^eval($tv / $rmc * 1000)[%.3f] ms
	<p>Среднее время ожидания отклика ^eval($wait * 1000 / $rmc)[%.3f] ms
	<p>
	<p>Средняя память процесса maxrss ^eval($maxrss / $rmc)[%.0f] kbytes
	<p>Средняя память gc ^eval($usedmem / $rmc)[%.0f] kbytes
	<p>Средняя полная память gc ^eval($allmem / $rmc)[%.0f] kbytes
}{
#эту строчку можно добавить в конец выполнения скрипта главной страницы на сайте
^if(def $form:load_tester){^for[i](1;999){$j(^math:random(9999))}^sleep(0)$response:body[$status:rusage.utime	^eval(^curtime[]-$timestart)	$status:rusage.maxrss	$status:memory.used	$status:memory.ever_allocated_since_start]}
}

@curtime[]
$result($status:rusage.tv_sec - 1391900000 + $status:rusage.tv_usec / 1000000 )
Благодарю за внимание.