<?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>Ars Longa, Vita Brevis &#187; нагрузка</title>
	<atom:link href="http://blog.sjinks.pro/tag/load/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Mon, 06 Feb 2012 17:56:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>nginx и gzip_static: еще один способ снизить нагрузку на сервер</title>
		<link>http://blog.sjinks.pro/nginx/684-nginx-gzip_static-reduce-server-load/</link>
		<comments>http://blog.sjinks.pro/nginx/684-nginx-gzip_static-reduce-server-load/#comments</comments>
		<pubDate>Sun, 08 Nov 2009 10:09:11 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[nginx]]></category>
		<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[нагрузка]]></category>
		<category><![CDATA[сжатие]]></category>
		<category><![CDATA[трафик]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=684</guid>
		<description><![CDATA[Отдача предварительно сжатых файлов для снижения нагрузки на процессор Чем меньше размер страниц сайта, тем меньше расход трафика, загрузка канал и выше скорость загрузки страниц. Один из самых распространённых способов уменьшения страниц — сжатие перед отправкой пользователю. В Apache для этих целей используется mod_deflate, в nginx — ngx_http_gzip_module.html. В других web-серверах используются похожие решения. Что mod_deflate, что [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/nginx/684-nginx-gzip_static-reduce-server-load/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Отдача предварительно сжатых файлов для снижения нагрузки на процессор</em></h2>
<p>Чем меньше размер страниц сайта, тем меньше расход трафика, загрузка канал и выше скорость загрузки страниц. Один из самых распространённых способов уменьшения страниц — <a href="http://blog.sjinks.pro/tag/compression/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  сжатие">сжатие</a> перед отправкой пользователю.</p>
<p>В Apache для этих целей используется <a href="http://httpd.apache.org/docs/2.2/mod/mod_deflate.html">mod_deflate</a>, в <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a> — <a href="http://sysoev.ru/nginx/docs/http/ngx_http_gzip_module.html">ngx_http_gzip_module.html</a>. В других web-серверах используются похожие решения.</p>
<p>Что <code>mod_deflate</code>, что <code>ngx_http_gzip_module</code> используют сжатие «на лету» — файл сжимается перед отдачей пользователю. Но сжатие — операция, нагружающая процессор, и чем выше степень сжатия, тем больше <a href="http://blog.sjinks.pro/tag/load/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  нагрузка">нагрузка</a>. Это не было бы проблемой, если бы один и тот же файл не приходилось сжимать каждый раз заново.<span id="more-684"></span></p>
<p>Для nginx есть простой вариант, который позволяет избежать повторного сжатия — использование модуля <a href="http://sysoev.ru/nginx/docs/http/ngx_http_gzip_static_module.html">ngx_http_gzip_static_module</a>. Но этот модуль по умолчанию <strong>не собирается</strong> — поэтому нужно разрешить его сборку путём передачи параметра <code>--with-http_gzip_static_module</code> скрипту <code>configure</code>.</p>
<p>Включается модуль путём добавления директивы <span class="codebox"><code class="nginx"><span class="kw1">gzip_static</span> <span class="kw2">on</span>;</code></span> в блок <span class="codebox"><code class="nginx">http</code></span> или виртуальный хост, после чего nginx будет отдавать вместо обычного файла предварительно сжатый файл с таким же именем и дополнительным расширением <code>.gz</code>. То есть если есть файл <code>index.html.gz</code>, то nginx будет отдавать его при запросе к файлу <code>index.html</code>.</p>
<p>Дело осталось за малым — сжать все статические файлы. И задать им ту же дату модификации, что у исходного файла.</p>
<p>Вручную это делается так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p6847">
        <div class="code bash" id="p684code7">
<span class="kw2">gzip</span> <span class="re5">-9</span> <span class="re5">-c</span> index.html <span class="sy0">&gt;</span> index.html.gz<br />
<span class="kw2">touch</span> <span class="re5">-r</span> index.html index.html.gz
        </div>
    </div>
</div>

<p>Но сжимать все файлы вручную — это скучно и муторно. Можно воспользоваться двумя скриптами:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p6848">
        <div class="code bash" id="p684code8">
<span class="co0">#! /bin/sh</span><br />
<br />
<span class="re2">EXTENSIONS</span>=<span class="st0">&quot;txt|html?|css|js|xml|ico|patch|diff|c&quot;</span><br />
<br />
<span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re5">-z</span> <span class="st0">&quot;$1&quot;</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; <span class="re2">DIR</span>=<span class="st0">&quot;<span class="es5">`pwd`</span>&quot;</span><br />
<span class="kw1">else</span><br />
&nbsp; &nbsp; <span class="re2">DIR</span>=<span class="st0">&quot;$1&quot;</span><br />
<span class="kw1">fi</span><br />
<br />
<span class="kw2">find</span> <span class="re1">$DIR</span> <span class="re5">-type</span> f <span class="re5">-regextype</span> posix-egrep <span class="re5">-regex</span> <span class="st0">&quot;.*\.(<span class="es2">$EXTENSIONS</span>)<span class="es1">\$</span>&quot;</span> <span class="re5">-exec</span> <span class="sy0">`</span><span class="kw2">dirname</span> $<span class="nu0">0</span><span class="sy0">`/</span>do-compress.sh <span class="st_h">'{}'</span> \;
        </div>
    </div>
</div>

<p>и </p>
          
<div class="codebox">
    <div class="the_code" style="" id="p6849">
        <div class="code bash" id="p684code9">
<span class="co0">#! /bin/sh</span><br />
<br />
<span class="re2">MINSIZE</span>=100<br />
<span class="re2">GZIP</span>=<span class="st0">&quot;gzip -9 -c -n&quot;</span><br />
<span class="re2">AWK</span>=<span class="kw2">awk</span><br />
<span class="re2">TOUCH</span>=<span class="kw2">touch</span><br />
<br />
<span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re5">-n</span> <span class="st0">&quot;$1&quot;</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; <span class="re2">GZ_NAME</span>=<span class="st0">&quot;$1.gz&quot;</span><br />
&nbsp; &nbsp; <span class="re2">DATA_PLAIN</span>=<span class="sy0">`</span><span class="kw2">stat</span> <span class="re5">--format</span> <span class="st0">&quot;%s %Y&quot;</span> <span class="st0">&quot;$1&quot;</span><span class="sy0">`</span><br />
&nbsp; &nbsp; <span class="re2">PLAIN_SIZE</span>=<span class="sy0">`</span><span class="kw3">echo</span> <span class="st0">&quot;<span class="es2">$DATA_PLAIN</span>&quot;</span> <span class="sy0">|</span> <span class="re1">$AWK</span> <span class="st_h">'{ print $1}'</span><span class="sy0">`</span><br />
&nbsp; &nbsp; <span class="re2">PLAIN_MTIME</span>=<span class="sy0">`</span><span class="kw3">echo</span> <span class="st0">&quot;<span class="es2">$DATA_PLAIN</span>&quot;</span> <span class="sy0">|</span> <span class="re1">$AWK</span> <span class="st_h">'{ print $2}'</span><span class="sy0">`</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re1">$PLAIN_SIZE</span> <span class="re5">-lt</span> <span class="re1">$MINSIZE</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Ignoring file $1: its size (<span class="es2">$PLAIN_SIZE</span>) is less than <span class="es2">$MINSIZE</span> bytes&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">0</span>;<br />
&nbsp; &nbsp; <span class="kw1">fi</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re5">-f</span> <span class="st0">&quot;<span class="es2">$GZ_NAME</span>&quot;</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">GZIPPED_MTIME</span>=<span class="sy0">`</span><span class="kw2">stat</span> <span class="re5">--format</span> <span class="st0">&quot;%Y&quot;</span> <span class="st0">&quot;<span class="es2">$GZ_NAME</span>&quot;</span><span class="sy0">`</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re1">$GZIPPED_MTIME</span> <span class="re5">-eq</span> <span class="re1">$PLAIN_MTIME</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Ignoring file $1: there is a compressed file <span class="es2">$GZ_NAME</span> with the same modification time&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">exit</span> 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fi</span><br />
&nbsp; &nbsp; <span class="kw1">fi</span><br />
<br />
&nbsp; &nbsp; <span class="re1">$GZIP</span> <span class="st0">&quot;$1&quot;</span> <span class="sy0">&gt;</span> <span class="st0">&quot;<span class="es2">$GZ_NAME</span>&quot;</span><br />
&nbsp; &nbsp; <span class="re1">$TOUCH</span> <span class="re5">-r</span> <span class="st0">&quot;$1&quot;</span> <span class="st0">&quot;<span class="es2">$GZ_NAME</span>&quot;</span><br />
&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Compressed $1 to <span class="es2">$GZ_NAME</span>&quot;</span><br />
<span class="kw1">fi</span>
        </div>
    </div>
</div>

<p>Файлы нужно поместить в один и тот же каталог, сделать исполняемыми (<span class="codebox"><code class="bash"><span class="kw2">chmod</span> 0755 compress.sh do-compress.sh</code></span>) и немного настроить.</p>
<p>В файле <code>compress.sh</code> задаётся список расширений (регулярным выражением) файлов, которые нужно сжимать:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p68410">
        <div class="code bash" id="p684code10">
<span class="re2">EXTENSIONS</span>=<span class="st0">&quot;txt|html?|css|js|xml|ico|patch|diff|c&quot;</span>
        </div>
    </div>
</div>

<p>Для тех, кто с регулярными выражениями не знаком, есть простое правило: новые расширения разделяются вертикальной чертой. Иными словами, если нужно сжимать файлы с расширением <code>.svg</code>, то строка выше примет следующий вид:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p68411">
        <div class="code bash" id="p684code11">
<span class="re2">EXTENSIONS</span>=<span class="st0">&quot;txt|html?|css|js|xml|ico|patch|diff|c|svg&quot;</span>
        </div>
    </div>
</div>

<p>В файле <code>do-compress.sh</code> единственным параметром, который, вероятно, придется изменить, является <code>MINSIZE</code>. Он задаёт минимальный размер (в байтах) файла, который стоит сжимать. По умолчанию это 100 байт, по идее, должно быть нормально.</p>
<p>Запускается скрипт так (предполагая, что он находится в текущем каталоге):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p68412">
        <div class="code bash" id="p684code12">
.<span class="sy0">/</span>compress.sh <span class="sy0">/</span>path<span class="sy0">/</span>to<span class="sy0">/</span>blog
        </div>
    </div>
</div>

<p>Параметр, передаваемый скрипту — это путь к каталогу, где находится блог (сайт): скрипт рекурсивно обработает все подкаталоги.</p>
<p>Скрипт нужно запускать каждый раз (да, есть такой недостаток), когда изменился/добавился какой-либо подходящий для сжатия файл. Например, если вы изменили файл со стилями темы <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>. Скрипт не будет пытаться сжимать файл, если существует сжатый файл с одинаковым временем последнего изменения — при последующих запусках будут сжиматься только новые и изменённые файлы. Что значительно снижает ресурсоёмкость процесса.</p>
<p>После всех манипуляций nginx будет отдавать заранее сжатые файлы, что позволит снизить нагрузку на процессор.</p>
<p>Разочарую всех тех, кто думает, что снижение нагрузки будет кардинальным: вряд ли. Но всё зависит от железа. Чем меньше мощность сервера, тем больше снижение нагрузки.</p>
<p><strong>Обновление 8 мая 2011:</strong> добавил <code>-n</code> в командную строку <code>gzip</code>: данная опция исключает имя файла из архива (оно там все равно не нужно), что позволяет сэкономить еще десяток байт.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/nginx/684-nginx-gzip_static-reduce-server-load/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/nginx/684-nginx-gzip_static-reduce-server-load/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>WP Super Cache vs HyperCache vs W3 Total Cache vs MaxSite Cache</title>
		<link>http://blog.sjinks.pro/wordpress/683-wp-supercache-vs-hypercache-vs-w3-total-cache-vs-maxsite-cache/</link>
		<comments>http://blog.sjinks.pro/wordpress/683-wp-supercache-vs-hypercache-vs-w3-total-cache-vs-maxsite-cache/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 10:59:55 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Hyper Cache]]></category>
		<category><![CDATA[MaxSite Cache]]></category>
		<category><![CDATA[W3 Total Cache]]></category>
		<category><![CDATA[WP Super Cache]]></category>
		<category><![CDATA[нагрузка]]></category>
		<category><![CDATA[производительность]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=683</guid>
		<description><![CDATA[Сравнение различных плагинов кэширования для WordPress Для WordPress написано много кэширующих плагинов, предназначенных для борьбы со слабой производительностью сервера (либо кривыми руками администратора, который не в состоянии настроить PHP/MySQL). Простой пользователь зачастую задаётся вопросом: какой же из плагинов выбрать? В данной статье я рассмотрю наиболее популярные плагины (WP Super Cache, Hyper Cache, W3 Total Cache [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/683-wp-supercache-vs-hypercache-vs-w3-total-cache-vs-maxsite-cache/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Сравнение различных плагинов кэширования для <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a></em></h2>
<p>Для WordPress написано много кэширующих плагинов, предназначенных для борьбы со слабой производительностью сервера (либо кривыми руками администратора, который не в состоянии настроить PHP/MySQL). Простой пользователь зачастую задаётся вопросом: какой же из плагинов выбрать?</p>
<p>В данной статье я рассмотрю наиболее популярные плагины (<a href="http://blog.sjinks.pro/tag/wp-super-cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WP Super Cache">WP Super Cache</a>, <a href="http://blog.sjinks.pro/tag/hyper-cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Hyper Cache">Hyper Cache</a>, <a href="http://blog.sjinks.pro/tag/w3-total-cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  W3 Total Cache">W3 Total Cache</a> и <a href="http://blog.sjinks.pro/tag/maxsite-cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  MaxSite Cache">MaxSite Cache</a>), а затем расскажу о результатах жестокого теста, которому я подверг все эти плагины.<span id="more-683"></span></p>
<p>Прежде, чем перейти к делу, отмечу, что я <strong>не фанат</strong> ни одного из плагинов и <strong>не использую</strong> их на своих сайтах, считая, что овчинка не стоит выделки: будущее за динамическими страницами <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Поехали.</p>
<ol>
<li><a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP Super Cache</a> написан Donncha O&#8217;Caoimh, одним из разработчиков WordPress. Про своё отношение к этому плагину я уже <a href="http://blog.sjinks.pro/?s=Super+Cache">писал</a>. <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">Плагин</a> разрабатывался как замена WP-Cache. Ключевой особенностью плагина является генерация статических HTML-страниц таким образом, что они будут отдаваться Web-сервером — минуя PHP.</li>
<li><a href="http://wordpress.org/extend/plugins/hyper-cache/">Hyper Cache</a>. С ним я тоже <a href="http://blog.sjinks.pro/wordpress/patches/98-hyper-cache-compressed-content/">сталкивался</a>, и какое-то время плагин стоял у меня на сайте. Плагин написан гораздо проще, чем WP Super Cache и имеет более высокий рейтинг на wordpress.org.</li>
<li><a href="http://wordpress.org/extend/plugins/w3-total-cache/">W3 Total Cache</a> — новое слово в кэшировании. Поддерживает <a href="http://blog.sjinks.pro/tag/compression/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  сжатие">сжатие</a> скриптов, CSS, <a href="http://blog.sjinks.pro/tag/cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  кэш">кэш</a> для базы данных, работу с CDN и многое другое.</li>
<li><a href="http://maxsite.org/page/maxsite-cache">MaxSite Cache</a> — отечественная разработка, при этом платная. Я тестировал Lite-версию, так как покупать полную версию чисто для тестирования желания нет. По словам автора, выйдет абсолютным победителем при сравнении с WP Super Cache и компанией.</li>
</ol>
<p>Для теста была взята машина такое конфигурации: Intel(R) Xeon(R) CPU X3320 @ 2.50GHz, 4 ядра, 3 MiB кэш, 8 GiB DDR-2 RAM, 2×500 GB SATA, RAID1 (ARC-1210 4-Port PCI-Express to SATA RAID Controller), 82572EI Gigabit Ethernet Controller.<br />
Операционная система: Ubuntu 9.10 64-bit Server Edition<br />
Веб-сервер: <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a> 0.8.19<br />
PHP: 5.2.10.dfsg.1-2ubuntu6.1 (FastCGI) + xCache 1.2.2-5, 75 процессов.</p>
<p>На тестируемой странице 25 несложных запросов, время их выполнения — 0.00993 сек.</p>
<p>На сайт натравливался ApacheBench — 10,000 запросов в 100…500 потоков. Это создаёт весьма приличную нагрузку, так как запросы идут один за другим.</p>
<p>Базовая <a href="http://blog.sjinks.pro/tag/load/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  нагрузка">нагрузка</a> — 100 параллельных потоков. Я увеличивал количество потоков до тех пор, пока web-сервер не стал отдавать ответ, отличный от 200. Более 500 потоков не тестировал.</p>
<table cellpadding="0" cellspacing="0" class="bordered" rules="all">
<thead>
<tr>
<th>&nbsp;</th>
<th>WordPress</th>
<th colspan="2">WP Super Cache 0.9.7</th>
<th colspan="2">Hyper Cache 2.6.2</th>
<th colspan="3">MaxSite Cache Lite</th>
<th colspan="2">W3 Total Cache 0.8</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Количество потоков</th>
<td>100</td>
<td>100</td>
<td>500</td>
<td>100</td>
<td>250</td>
<td>100</td>
<td>500</td>
<td>130</td>
<td>100</td>
<td>130</td>
</tr>
<tr>
<th scope="row">Время тестирования, с</th>
<td>677.442</td>
<td class="good">1.115</td>
<td class="good">1.079</td>
<td>18.736</td>
<td class="unreliable">8.633</td>
<td>3.291</td>
<td class="unreliable">2.501</td>
<td>2.992</td>
<td>21.284</td>
<td>21.086</td>
</tr>
<tr>
<th scope="row">Количество ошибок</th>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td class="imp">3663</td>
<td>0</td>
<td class="imp">2713</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<th scope="row">Скорость, запрос/с</th>
<td>14.76</td>
<td class="good">8967.28</td>
<td class="good">9268.36</td>
<td>544.20</td>
<td class="unreliable">1158.30</td>
<td class="good">3038.98</td>
<td class="unreliable">3997.80</td>
<td class="good">3341.72</td>
<td>469.84</td>
<td>474.25</td>
</tr>
<tr>
<th scope="row">Среднее время обработки запроса, мс</th>
<td>6774.423</td>
<td>11.152</td>
<td>53.947</td>
<td>183.757</td>
<td class="unreliable">215.833</td>
<td>32.906</td>
<td class="unreliable">125.069</td>
<td>38.902</td>
<td>212.838</td>
<td>274.116</td>
</tr>
<tr>
<th scope="row">Среднее время обработки запроса по всем потокам, мс</th>
<td>67.744</td>
<td class="good">0.112</td>
<td class="good">0.108</td>
<td>1.838</td>
<td class="unreliable">0.863</td>
<td class="good">0.329</td>
<td class="unreliable">0.250</td>
<td class="good">0.299</td>
<td>2.128</td>
<td>2.109</td>
</tr>
<tr>
<th scope="row">Скорость передачи, Кбайт/с</th>
<td>175.12</td>
<td class="good">106154.90</td>
<td class="good">109865.55</td>
<td>6393.68</td>
<td class="unreliable">8754.04</td>
<td class="good">35537.15</td>
<td class="unreliable">34413.87</td>
<td class="good">39075.95</td>
<td>4928.74</td>
<td>4974.58</td>
</tr>
<tr>
<th scope="row">Порог завершения 95% запросов, мс</th>
<td>9188</td>
<td class="good">11</td>
<td class="good">27</td>
<td>394</td>
<td class="unreliable">268</td>
<td class="good">52</td>
<td class="unreliable">91</td>
<td class="good">58</td>
<td>344</td>
<td>364</td>
</tr>
</tbody>
</table>
<p>То, что не вошло в таблицу: средняя загрузка системы (load average) при тесте голого WordPress зашкаливала за 60. При тесте WP Super Cache и MaxSite Cache я не успевал ее измерить (была ничтожной). С Hyper Cache и W3 Total Cache загрузка доходила до где-то 10. Так что <strong>кэширование работает и выполняет свою работу — снижает нагрузку на сервер</strong>.</p>
<p>«Голый» WordPress тестировать более, чем со 100 потоками смысла нет <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>В ходе тестирования выяснился абсолютный лидер — WP Super Cache. Скорость отдачи кэшированных страниц поистине фантастическая — почти 800 мегабит/сек. Хотя такая скорость — это больше заслуга nginx.</p>
<p>MaxSite Cache Lite на 100 параллельных потоках проиграл WP Super Cache <strong>практически в пять раз</strong>! Причина понятна: WP Super Cache создает статические файлы так, что web-сервер их может отдавать клиенту без привлечения PHP-интерпретатора. А статические запросы при прочих равных всегда быстрее динамических. Так что платить 30 WMZ за полную версию MaxSite Cache я пока не готов <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Среди остальных плагинов MaxSite Cache выигрывает благодаря свой простоте: минимум проверок, никаких регулярных выражений и лишних подключаемых файлов. Но даже такой подход не спасёт от хорошего SlashDot-эффекта: какой-то процент пользователей будет видеть ошибку сервера, для других возрастёт время генерации страницы. Это касается и остальных плагинов. Мораль: подключение PHP-интерпретатора — дорогое удовольствие.</p>
<p>По поводу масштабируемости: более 130 потоков не пережил ни один кэш (кроме WP Super Cache).</p>
<p>Аутсайдером, на мой взгляд, оказался W3 Total Cache — при почти одинаковой с Hyper Cache нагрузкой на сервер, время отдачи страниц было значительно выше. Хотя если бы тест был не таким искусственным, то <a href="http://blog.sjinks.pro/tag/performance/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  производительность">производительность</a> W3 Total Cache могла быть и более высокой. Хотя во многом W3 Total Cache делает то, что <a href="http://blog.sjinks.pro/feedback/">опытный системный администратор</a> может настроить на уровне сервера.</p>
<p>Вообще плагины кэширования обладают очень интересной особенностью: они переносят нагрузку с одной подсистемы (процессор) на другую (диск). Так что на десктопном железе, слабых дисках или виртуальных серверах <strong>кэш может ухудшить ситуацию</strong>: процессор будет тратить время не на выполнение кода, а на ожидание завершения ввода/вывода (iowait). Так что при большом количестве оперативной памяти имеет смысл создавать RAM-диск и помещать кэш на него.</p>
<p>Кстати, даже при хорошей дисковой подсистеме, но при малом объеме оперативной памяти при большом объеме кэша могут возникать проблемы: например, если дисковый кэш у операционной системы мал, то при интенсивном равномерном обращении к разным страницам может возникнуть большая дисковая активность.</p>
<p>Вообще, как показывает мой опыт, прежде чем использовать плагин кэширования страниц, имеет смысл все же грамотно настроить сервер (<a href="http://blog.sjinks.pro/feedback/">обращайтесь</a>). Например, если вместо Apache поставить nginx, можно освободить довольно много драгоценной памяти (prefork у Apache — это весьма сильный убийца производительности); если увеличить размер буфера ключей MySQL, можно добиться уменьшения дисковой активности. Если поставить opcode cacher (APC, xCache, eAccelerator), то можно значительно снизить затраты на перекомпиляцию PHP-кода и уменьшить время отклика системы. Если использовать оптимизатор, встроенный в eAccelerator, то можно <a href="http://blog.sjinks.pro/php/650-php-code-beauty-impacts-performance/">повысить производительность PHP-кода</a>. <a href="http://wordpress.org/extend/plugins/sqlmon/">Анализ производительности MySQL-запросов</a> и знание принципов работы оптимизатора помогут переписать слабые запросы/добавить отсутствующие индексы в базу данных. Простор для действий довольно-таки большой. И динамика страниц остаётся <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/683-wp-supercache-vs-hypercache-vs-w3-total-cache-vs-maxsite-cache/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/683-wp-supercache-vs-hypercache-vs-w3-total-cache-vs-maxsite-cache/feed/</wfw:commentRss>
		<slash:comments>53</slash:comments>
		</item>
		<item>
		<title>WP Super Cache и высокая нагрузка: часть 2</title>
		<link>http://blog.sjinks.pro/wordpress/601-wp-supercache-under-high-load-part-2/</link>
		<comments>http://blog.sjinks.pro/wordpress/601-wp-supercache-under-high-load-part-2/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 02:03:31 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[munin]]></category>
		<category><![CDATA[WP Super Cache]]></category>
		<category><![CDATA[кэш]]></category>
		<category><![CDATA[нагрузка]]></category>
		<category><![CDATA[плагин]]></category>
		<category><![CDATA[производительность]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=601</guid>
		<description><![CDATA[Стоит ли овчинка выделки? Вчера я наконец-то поднял munin и новый monit на сервере, а сегодня посмотрел на результаты мониторинга. Самое первое, что бросилось в глаза: iostat показывает очень большое количество записей (превышавшее количество чтений почти в тысячу раз). На сервере живут четыре сайта на WordPress, два из которых (littlefox.ru и cat-tv.ru) находятся в Alexa Top 100,000 [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/601-wp-supercache-under-high-load-part-2/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Стоит ли овчинка выделки?</em></h2>
<p>Вчера я наконец-то поднял <a href="http://munin.projects.linpro.no/">munin</a> и <a href="http://blog.sjinks.pro/linux/600-monit-for-debian-ubuntu-linux/">новый monit</a> на сервере, а сегодня посмотрел на результаты мониторинга. Самое первое, что бросилось в глаза: <code>iostat</code> показывает очень большое количество записей (превышавшее количество чтений почти в тысячу раз).</p>
<p>На сервере живут четыре сайта на <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>, два из которых (<a href="http://littlefox.ru/">littlefox.ru</a> и <a href="http://cat-tv.ru/">cat-tv.ru</a>) находятся в Alexa Top 100,000 (они создают основную нагрузку на сервер).</p>
<p>Особенность обоих сайтов — они используют небезызвестный <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> <a href="http://blog.sjinks.pro/tag/wp-super-cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WP Super Cache">WP Super Cache</a>. Мне с этим плагином приходилось неоднократно <a href="http://blog.sjinks.pro/wordpress/509-wp-supercache-nginx-replace-mod_rewrite-rules/">сталкиваться</a>, и <a href="http://blog.sjinks.pro/wordpress/521-wp-super-cache-under-high-load/">не всегда с хорошей стороны</a> (так получилось), так что я имею представление о том, как он работает.</p>
<p>С целью поэкспериментировать мы отключили WP Super Cache. В результате получилась такая картина.<span id="more-601"></span></p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2009/07/stats.png" rel="lightbox[601]" title="Статистика munin"><img src="http://static.sjinks.info/wp-content/uploads/2009/07/stats-380x1024.png" alt="Статистика munin" title="Статистика munin — IOstat, Traffic, CPU Usage, Load Average, Interrupts" width="380" height="1024" class="alignnone size-large wp-image-602" /></a></p>
<p>Так сложилось, что WP Super Cache мы отключили практически при пиковой посещаемости (хорошо видно на графике «eth0 traffic»), и тем интереснее смотрятся результаты. Практически сразу упало количество записей на диск (дисковая подсистема вздохнула с облегчением): при количестве записей, тысячекратно превышающих количество чтений, эффективность дискового кэша, очевидно, падает. В случае с виртуальным сервером такая <a href="http://blog.sjinks.pro/tag/load/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  нагрузка">нагрузка</a> могла бы его положить: дело в том, что виртуализаторы не очень хорошо справляются с операциями ввода/вывода (это их слабое место); как результат, от этого начинает увеличиваться <a href="http://blog.sjinks.pro/tag/load/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  нагрузка">нагрузка</a> на процессор (все больше времени проводится в <code>iowait</code>). </p>
<p>Также, как это ни странно, <strong>упала нагрузка на процессор</strong>! Причём заметнее всего это отразилось на <code>user time</code> (а не на <code>system</code>, как можно было бы ожидать) — если внимательно посмотреть на графики «CPU Usage» и «Load Average», то можно заметить, что при примерно одинаковом количестве посетителей (я сужу по объемам отдаваемого трафика) <strong>нагрузка при отключенном WP Super Cache оказывается меньшей</strong> (причем это заметно даже при низкой нагрузке — впрочем, при низкой нагрузке, наверное, любой <a href="http://blog.sjinks.pro/tag/cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  кэш">кэш</a> не особо эффективен из-за затрат на реализацию кэширования)! Так же уменьшилось количество переключений контекста (что, видимо, и объясняет уменьшение system time) и уменьшилось количество прерываний от контроллера жесткого диска.</p>
<p>А вот статистика MySQL далеко не однозначна:</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2009/07/mysql_queries.png" rel="lightbox[601]" title="Статистика по запросам MySQL"><img src="http://static.sjinks.info/wp-content/uploads/2009/07/mysql_queries.png" alt="Статистика по запросам MySQL" title="Статистика по запросам MySQL" width="495" height="343" class="alignnone size-full wp-image-603" /></a></p>
<p>С одной стороны, вроде бы и среднее количество запросов в секунду резко упало, но с другой стороны, это произошло до отключения WP Super Cache. Также заметно, что при выключенном WP Super Cache кэш запросов стал медленно таять (хотя это можно объяснить падением нагрузки и чисткой кэша). Хотя процентное отношение количества запросов, результат для которых был взят из кэша, весьма впечатляет. Что значит <a href="http://blog.sjinks.pro/feedback/">грамотная настройка MySQL</a>. Тем не менее, данных для однозначных выводов недостаточно.</p>
<p>Перейдём к ответу на вопрос, стоит ли овчинка выделки. Как обычно, однозначного ответа нет. Нужно смотреть в каждом конкретном случае. Тем не менее, если сайт стоит на виртуальном сервере, то высокая нагрузка при включенном WP Super Cache может его убить. Если есть достаточно памяти (что на виртуалках большая редкость), то имеет смысл помещать каталоги с кэшем на RAM-диск и разгрузить дисковую подсистему. При высокой нагрузке на выделенном сервере нужно очень внимательно смотреть на конфигурацию MySQL, а также типы запросов. Если же сайт стоит на shared-сервере, то выбор здесь небольшой: либо отказаться от плагинов, которые грузят MySQL, либо сменить WordPress на что-то более легкое. Кэширование на shared-сервере, как правило, не оправдывает себя (во многом зависит от жадности хостеров, которые на одном сервере стремятся разместить как можно большее количество сайтов). Тем же, кто имеет административный доступ на сервер, я бы очень рекомендовал мониторинг сервера (<a href="http://blog.sjinks.pro/tag/munin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  munin">munin</a>, nagios/nagvis и т.п.) со включенным и выключенным кэшем. Возможно, что результат очень сильно удивит <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/601-wp-supercache-under-high-load-part-2/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/601-wp-supercache-under-high-load-part-2/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
	</channel>
</rss>

