<?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>JL&#039;s blog &#187; profiling</title>
	<atom:link href="http://john.5070.info/tag/profiling/feed/" rel="self" type="application/rss+xml" />
	<link>http://john.5070.info</link>
	<description>:-)</description>
	<lastBuildDate>Sun, 06 Dec 2009 17:11:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Nginx против oProxy: друг другу сливаем :)</title>
		<link>http://john.5070.info/2009/02/nginx-%d0%bf%d1%80%d0%be%d1%82%d0%b8%d0%b2-oproxy-%d0%b4%d1%80%d1%83%d0%b3-%d0%b4%d1%80%d1%83%d0%b3%d1%83-%d1%81%d0%bb%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc/</link>
		<comments>http://john.5070.info/2009/02/nginx-%d0%bf%d1%80%d0%be%d1%82%d0%b8%d0%b2-oproxy-%d0%b4%d1%80%d1%83%d0%b3-%d0%b4%d1%80%d1%83%d0%b3%d1%83-%d1%81%d0%bb%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc/#comments</comments>
		<pubDate>Sun, 01 Feb 2009 15:19:55 +0000</pubDate>
		<dc:creator>John Lepikhin</dc:creator>
				<category><![CDATA[Ocaml]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[oProxy]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[profiling]]></category>

		<guid isPermaLink="false">http://john.5070.info/?p=69</guid>
		<description><![CDATA[Потестировал производительность проксирования HTTP трафика. Результаты местами получились весьма неожиданными.
Повторю, тестировалось именно проксирование. Известно, что при прямой отдаче и Apache, и Nginx использует ядрёный вызов sendfile(), который отдаёт содержимое файлика в сокет без лишних копирований. Это неинтересно. А вот проксирование — это совсем другое дело. В ядре пока что ещё нет прямых путей для копирования [...]]]></description>
			<content:encoded><![CDATA[<p>Потестировал производительность проксирования HTTP трафика. Результаты местами получились весьма неожиданными.</p>
<p>Повторю, тестировалось именно проксирование. Известно, что при прямой отдаче и Apache, и Nginx использует ядрёный вызов sendfile(), который отдаёт содержимое файлика в сокет без лишних копирований. Это неинтересно. А вот проксирование — это совсем другое дело. В ядре пока что ещё нет прямых путей для копирования из сокета в сокет (есть полупрямой вариант splice() + pipe(), но как выяснилось он даже не на всех современных ядрах работает).</p>
<p>Итак…</p>
<p><span id="more-69"></span>На порту 8080 живёт Apache 2 ITK. У него в VirtualHost лежит bigfile размером ровно 20MB.</p>
<p>На порту 8081 живёт Nginx, который проксирует в Apache. Его конфиг:</p>
<p>worker_processes  16;</p>
<p>error_log  /var/log/nginx/error.log;<br />
pid        /var/run/nginx.pid;</p>
<p>events {<br />
worker_connections  1024;<br />
}</p>
<p>http {<br />
sendfile        on;<br />
tcp_nodelay        on;<br />
gzip  off;</p>
<p>server {<br />
listen 12.34.56.78:8081;<br />
server_name test1.com www.test1.com;<br />
location / {<br />
proxy_pass http://12.34.56.78:8080;<br />
proxy_redirect http://test1.com:8080/ /;<br />
proxy_set_header Host $host;<br />
}<br />
}<br />
}</p>
<p>Результаты siege для Nginx:</p>
<p>debian2:~# siege -t30s -b -c 10 http://test1.com:8081/bigfile &gt;/dev/null<br />
** SIEGE 2.66<br />
** Preparing 10 concurrent users for battle.<br />
The server is now under siege&#8230;</p>
<p>Lifting the server siege&#8230;      done.<br />
Transactions:                 372 hits<br />
Availability:              100.00 %<br />
Elapsed time:               29.66 secs<br />
Data transferred:         6773.34 MB<br />
Response time:                0.78 secs<br />
Transaction rate:           12.54 trans/sec<br />
Throughput:              228.37 MB/sec<br />
Concurrency:                9.82<br />
Successful transactions:         372<br />
Failed transactions:               0<br />
Longest transaction:            4.09<br />
Shortest transaction:            0.07</p>
<p>228MB в секунду. Конкурентность 9.82. Доступность 100%. Самый медленный ответ: через 4 секунды.</p>
<p>Результаты oProxy (тоже 16 рабочих, чтобы было абсолютно честно):</p>
<p>debian2:~# siege -t30s -b -c 10 http://test1.com/bigfile &gt;/dev/null<br />
** SIEGE 2.66<br />
** Preparing 10 concurrent users for battle.<br />
The server is now under siege&#8230;</p>
<p>Lifting the server siege&#8230;      done.<br />
Transactions:                 691 hits<br />
Availability:              100.00 %<br />
Elapsed time:               29.71 secs<br />
Data transferred:        13820.00 MB<br />
Response time:                0.38 secs<br />
Transaction rate:           23.26 trans/sec<br />
Throughput:              465.16 MB/sec<br />
Concurrency:                8.94<br />
Successful transactions:         691<br />
Failed transactions:               0<br />
Longest transaction:            9.18<br />
Shortest transaction:            0.05</p>
<p>465MB в секунду (лучше более, чем в 2 раза). Конкурентность 9.18. Доступность 100%. Самый медленный ответ: через 9 секунд (хуже более, чем в 2 раза). Почувствуйте разницу ©</p>
<p>Мерим на маленьком файле. smallfile имеет размер 5 байт. Эмулируем атаку яростных 10 пользователей. Прочая конфигурация такая же. Результаты в Nginx:</p>
<p>debian2:~# siege -t30s -b -c 10 http://test1.com:8081/smallfile &gt;/dev/null<br />
** SIEGE 2.66<br />
** Preparing 10 concurrent users for battle.<br />
The server is now under siege&#8230;</p>
<p>Lifting the server siege&#8230;      done.<br />
Transactions:               16952 hits<br />
Availability:              100.00 %<br />
Elapsed time:               30.47 secs<br />
Data transferred:            0.08 MB<br />
Response time:                0.02 secs<br />
Transaction rate:          556.35 trans/sec<br />
Throughput:                0.00 MB/sec<br />
Concurrency:                9.97<br />
Successful transactions:       16952<br />
Failed transactions:               0<br />
Longest transaction:            0.20<br />
Shortest transaction:            0.00</p>
<p>Результаты в oProxy:</p>
<p>debian2:~# siege -t30s -b -c 10 http://test1.com/smallfile &gt;/dev/null<br />
** SIEGE 2.66<br />
** Preparing 10 concurrent users for battle.<br />
The server is now under siege&#8230;</p>
<p>Lifting the server siege&#8230;      done.<br />
Transactions:                8718 hits<br />
Availability:              100.00 %<br />
Elapsed time:               29.57 secs<br />
Data transferred:            0.04 MB<br />
Response time:                0.03 secs<br />
Transaction rate:          294.83 trans/sec<br />
Throughput:                0.00 MB/sec<br />
Concurrency:                9.27<br />
Successful transactions:        8718<br />
Failed transactions:               0<br />
Longest transaction:            9.00<br />
Shortest transaction:            0.00</p>
<p>А вот тут сливаем, почти в 2 раза. Аналогичная картина при увеличении конкурентных запросов. Но прокся при этом начинает показывать ещё более худшие результаты в Longext transaction. Буду над этим работать.</p>
<p>Update: нашёл в чём причина. В <span style="text-decoration: line-through;">генах</span> архитектуре. Завтра найду время, и перееду с socket passing на shared accept() и, возможно, epoll. Правда, при этом не совсем понятно, что делать с шедулингом нагрузки по рабочим. Рычаг теряю. Судя по логам, accept() на каждое соединение в среднем 3 миллисекунды тратит. Отсюда и цифра — 300 транзакций в секунду.</p>
]]></content:encoded>
			<wfw:commentRss>http://john.5070.info/2009/02/nginx-%d0%bf%d1%80%d0%be%d1%82%d0%b8%d0%b2-oproxy-%d0%b4%d1%80%d1%83%d0%b3-%d0%b4%d1%80%d1%83%d0%b3%d1%83-%d1%81%d0%bb%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
