<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Roman Barczyński &#187; php</title>
	<atom:link href="http://www.romke.net/priv/blog/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.romke.net/priv/blog</link>
	<description>romke blog</description>
	<lastBuildDate>Thu, 10 Jun 2010 12:03:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>itk vs peruser &#8211; wydajność apache</title>
		<link>http://www.romke.net/priv/blog/2009/03/itk-vs-peruser-wydajnosc-apache/</link>
		<comments>http://www.romke.net/priv/blog/2009/03/itk-vs-peruser-wydajnosc-apache/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 00:49:12 +0000</pubDate>
		<dc:creator>Roman Barczyński</dc:creator>
				<category><![CDATA[Różne]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[wydajność]]></category>

		<guid isPermaLink="false">http://www.romke.net/priv/blog/?p=54</guid>
		<description><![CDATA[Zrobiłem ostatnio parę testów pomiędzy dwoma MPM apacha: itk oraz peruser. Obydwa moduły zapewniają przydział użytkownika i grupy do konkretnych hostów wirtualnych co jest niezmiernie ważne w przypadku shared hostingu.Popatrzmy teraz na filozofię działania obu MPMów. Obydwa są pochodnymi modułu prefork zapewniającego przyzwoitą wydajność a nie zmuszającego, w odróżnieniu od worker, do użycia wyłącznie &#8222;thread [...]]]></description>
			<content:encoded><![CDATA[<p>Zrobiłem ostatnio parę testów pomiędzy dwoma MPM apacha: <strong>itk</strong> oraz <strong>peruser</strong>. Obydwa moduły zapewniają przydział użytkownika i grupy do konkretnych hostów wirtualnych co jest niezmiernie ważne w przypadku shared hostingu.<span id="more-54"></span>Popatrzmy teraz na filozofię działania obu MPMów. Obydwa są pochodnymi modułu <strong>prefork</strong> zapewniającego przyzwoitą wydajność a nie zmuszającego, w odróżnieniu od <strong>worker</strong>, do użycia wyłącznie &#8222;thread safe&#8221; bibliotek.</p>
<p><strong>itk</strong> działa bardzo podobnie do prefork, mianowicie w momencie gdy przychodzi żądanie, sprawdza jakiego vhosta ono dotyczy i dokonuje: &#8222;fork &amp; setgid &amp; setuid&#8221; a po zakończeniu serwowania zabija proces pochodny. Ah, i gdzie tu zysk z prefork które miało zapewniać obsługę iluśtam requestów na już wcześniej przygotowanym zforkowanym procesie? No właśnie ten zysk znika z powodu kolejnego forka w środku :/</p>
<p><strong>peruser</strong> ma to rozwiązane znacznie lepiej, lecz wymaga dokładniejszej konfiguracji. <strong>peruser </strong>tworzy, tak samo jak <strong>prefork</strong>, określoną pulę procesów i już na tym etapie dokonuje setgid &amp; setuid, nie mamy tu zależności: jeden request = jeden proces (fork &amp; &#8230; &amp; kill)</p>
<p>Ale dość teorii, oto linki w których możecie poczytać jak konfigurować zarówno <a href="http://blog.stuartherbert.com/php/2008/04/19/using-mpm-itk-to-secure-a-shared-server/">itk</a> jak i <a href="http://blog.stuartherbert.com/php/2008/03/20/using-mpm-peruser-to-secure-a-shared-server/">peruser</a> i przejdźmy już do testów.</p>
<p>Do testowania posłużył mi siege, domyślny WordPress na mysql (mod_php i php-cgi) oraz prosty serwis django (mod_python).<strong><strong></strong></strong></p>
<p>Siege wywoływane było dla każdego przypadku tak: <strong>siege -c 20 -b -t 1m URL</strong></p>
<pre><strong>itk, mod_python (django):
</strong>Transactions:                    566 hits
Availability:                  99.65 %
Elapsed time:                  63.20 secs
Data transferred:               0.61 MB
Response time:                  1.87 secs
Transaction rate:               <strong>8.96 trans/sec</strong>
Throughput:                     0.01 MB/sec
Concurrency:                   16.74
Successful transactions:         565
Failed transactions:               2
Longest transaction:           28.07
Shortest transaction:           0.25
<strong>peruser, mod_python (django):
</strong>Transactions:                  17422 hits
Availability:                 100.00 %
Elapsed time:                  59.55 secs
Data transferred:              16.13 MB
Response time:                  0.07 secs
Transaction rate:             <strong>292.56 trans/sec</strong>
Throughput:                     0.27 MB/sec
Concurrency:                   19.97
Successful transactions:       17422
Failed transactions:               0
Longest transaction:            5.10
Shortest transaction:           0.01

<strong>itk, php5cgi (wordpress):
<strong></strong></strong>Transactions:                    757 hits
Availability:                  99.87 %
Elapsed time:                  61.29 secs
Data transferred:              11.13 MB
Response time:                  1.53 secs
Transaction rate:              <strong>12.35 trans/sec</strong>
Throughput:                     0.18 MB/sec
Concurrency:                   18.91
Successful transactions:         757
Failed transactions:               1
Longest transaction:           29.51
Shortest transaction:           0.19
<strong>peruser, php5cgi (wordpress):
<strong></strong></strong>Transactions:                    762 hits
Availability:                 100.00 %
Elapsed time:                  61.12 secs
Data transferred:              11.24 MB
Response time:                  1.57 secs
Transaction rate:              <strong>12.47 trans/sec</strong>
Throughput:                     0.18 MB/sec
Concurrency:                   19.57
Successful transactions:         762
Failed transactions:               0
Longest transaction:           17.14
Shortest transaction:           0.19

<strong>itk, mod_php5 (wordpress):
<strong></strong></strong>Transactions:                    814 hits
Availability:                  99.88 %
Elapsed time:                  60.95 secs
Data transferred:              11.52 MB
Response time:                  1.31 secs
Transaction rate:              <strong>13.36 trans/sec</strong>
Throughput:                     0.19 MB/sec
Concurrency:                   17.54
Successful transactions:         814
Failed transactions:               1
Longest transaction:           22.11
Shortest transaction:           0.17
<strong>peruser, mod_php5 (wordpress):
<strong></strong></strong>Transactions:                   1034 hits
Availability:                 100.00 %
Elapsed time:                  64.72 secs
Data transferred:              14.63 MB
Response time:                  1.21 secs
Transaction rate:              <strong>15.98 trans/sec</strong>
Throughput:                     0.23 MB/sec
Concurrency:                   19.34
Successful transactions:        1034
Failed transactions:               0
Longest transaction:           24.50
Shortest transaction:           0.15</pre>
<p>Wnioski? Jest szybciej (no może poza CGI ale czego tu oczekiwać jak w obu przypadkach i tak następuje exec binarki PHP), w jednych przypadkach więcej (mod_python/django naprawdę szczęka opada) a w innych mniej. Tak czy inaczej do konkretnych zastosowań warto przeprowadzić testy samemu bo jak uczy praktyka &#8211; nie ma rzeczy idealnych do wszystkiego&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.romke.net/priv/blog/2009/03/itk-vs-peruser-wydajnosc-apache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
