<?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; WP Super Cache</title>
	<atom:link href="http://blog.sjinks.pro/tag/wp-super-cache/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>WP Super Cache vs MaxSite Cache: часть 2</title>
		<link>http://blog.sjinks.pro/wordpress/725-689-wp-super-cache-vs-maxsite-cache-part-2/</link>
		<comments>http://blog.sjinks.pro/wordpress/725-689-wp-super-cache-vs-maxsite-cache-part-2/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 08:23:41 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[FastCGI]]></category>
		<category><![CDATA[MaxSite Cache]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[WP Super Cache]]></category>
		<category><![CDATA[кэш]]></category>
		<category><![CDATA[производительность]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=725</guid>
		<description><![CDATA[Тест страничных кэшей на грамотно настроенном сервере Вторая часть статьи WP Super Cache vs MaxSite Cache. В предыдущей части я сравнивал поведение MaxSite Cache и WP Super Cache на тестовом VDS (512 MiB RAM, 10 GB HD, Intel Xeon X3320 (1 ядро), 2.5 GHz), на котором ни операционная система, ни программное обеспечение не были специально [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/725-689-wp-super-cache-vs-maxsite-cache-part-2/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Тест страничных кэшей на грамотно настроенном сервере</em></h2>
<p><strong>Вторая часть статьи <a href="http://blog.sjinks.pro/wordpress/689-wp-super-cache-vs-maxsite-cache-part-1/">WP Super Cache vs MaxSite Cache</a></strong>.</p>
<p>В предыдущей части я сравнивал поведение <a href="http://blog.sjinks.pro/tag/maxsite-cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  MaxSite Cache">MaxSite Cache</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> на тестовом VDS (512 MiB RAM, 10 GB HD, Intel Xeon X3320 (1 ядро), 2.5 GHz), на котором ни операционная система, ни программное обеспечение не были специально настроены — бралась конфигурация «из коробки» и тестировалась. Одним словом, «VDS абсолютного чайника».</p>
<p>В этой части изменилась только конфигурация программного обеспечения: сервер настраивался на максимальную <a href="http://blog.sjinks.pro/tag/performance/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  производительность">производительность</a>.</p>
<p>В частности:</p>
<ul>
<li>отказ от <a href="http://blog.sjinks.pro/tag/apache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Apache">Apache</a> в пользу <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a> и от <code>mod_php5</code> в пользу <code>php-fcgi</code> (количество <a href="http://blog.sjinks.pro/tag/fastcgi/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  FastCGI">FastCGI</a>-процессов выбиралось таким образом, чтобы избежать использования файла подкачки);</li>
<li>смена ядра с <code>linux-image-server</code> на <code>linux-image-virtual</code>;</li>
<li>настройка MySQL: отказ от InnoDB (экономит примерно 100 МБ памяти), увеличение буфера ключей и т.п.;</li>
<li>установка и настройка xCache (я исходил из того, что далеко не все чувствуют себя комфортно при сборке программ из исходников, поэтому брал только готовое ПО);</li>
<li>настройка <span class="codebox"><code class="bash">iptables</code></span> для фильтрации пакетов.</li>
</ul>
<p><span id="more-725"></span></p>
<p>Методика тестирования осталась прежней: <a href="http://blog.sjinks.pro/linux/722-transform-sitemap-to-siege-url-list/">карта сайта преобразовывалась в список адресов</a>, на этот список натравливался <code>siege</code>, а я присматривал за сервером и вносил коррективы в конфигурацию ПО (да, с первого раза трудно всё настроить идеально).</p>
<p>Чтобы убедиться, что новая конфигурация <strong>не хуже</strong> старой, я полностью отключил кэширование и имитировал 50 одновременных посетителей в течение 15 минут. На момент выполнения теста у сервера было свободно 348.5 МиБ памяти.</p>
<table class="bordered" cellspacing="0" cellpadding="0" rules="all">
<thead>
<tr>
<th>&nbsp;</th>
<th><strong>Голый <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a></strong></th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Количество транзакций</th>
<td>4,825</td>
</tr>
<tr>
<th scope="row">Доступность сервера</th>
<td>99.98%</td>
</tr>
<tr>
<th scope="row">Объём данных, МБ</th>
<td>28.32</td>
</tr>
<tr>
<th scope="row">Среднее время ответа, с</th>
<td>9.23</td>
</tr>
<tr>
<th scope="row">Частота транзакций в секунду</th>
<td>5.36</td>
</tr>
<tr>
<th scope="row">Пропускная способность, МБ/с</th>
<td>0.03</td>
</tr>
<tr>
<th scope="row">Коэффициент параллельности</th>
<td>49.50</td>
</tr>
<tr>
<th scope="row">Максимальная длина транзакции, с</th>
<td>30.76</td>
</tr>
<tr>
<th scope="row">Минимальная длина транзакции, с</th>
<td>1.15</td>
</tr>
<tr>
<th scope="row">Максимальная загрузка процессора (system/user)</th>
<td>25.72%/68.39%</td>
</tr>
<tr>
<th scope="row">Load Average</th>
<td>40.81</td>
</tr>
<tr>
<th scope="row">Примерное потребление памяти, МиБ</th>
<td>414</td>
</tr>
</tbody>
</table>
<p>Данные загрузки/потребления памяти очень приблизительны. Хотя вряд ли пользователи станут ждать по 9 секунд загрузку страницы, радует, что сервер не ответил только на один запрос и не ушел в нокдаун. Простая экстраполяция показывает, что сервер выдержит примерно 463,000 обращения к PHP-страницам в сутки.</p>
<p>Мы убедились, что новая конфигурация вполне жизнеспособна (старой до неё, как до Китая в неудобной позе), переходим к тестированию плагинов.<br />
Тестирование проходило в 30 и 75 потоков. <strong>Я не разделял фазы построения и использования кэша</strong>.</p>
<table class="bordered" cellspacing="0" cellpadding="0" rules="all">
<thead>
<tr>
<th>&nbsp;</th>
<th><strong>MaxSite Cache</strong><br/>(30 потоков)</th>
<th><strong>MaxSite Cache</strong><br/>(75 потоков)</th>
<th><strong>WP Super Cache</strong><br/>(30 потоков, HALF ON)</th>
<th><strong>WP Super Cache</strong><br/>(30 потоков)</th>
<th><strong>WP Super Cache</strong><br/>(75 потоков)</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Количество транзакций</th>
<td>176,684</td>
<td>182,604</td>
<td>5,069</td>
<td>198,160</td>
<td>189,686</td>
</tr>
<tr>
<th scope="row">Объём данных, МБ</th>
<td>1,062.24</td>
<td>1,099.60</td>
<td>29.99</td>
<td>1,202.95</td>
<td>1,147.33</td>
</tr>
<tr>
<th scope="row">Среднее время ответа, с</th>
<td>0.13</td>
<td>0.34</td>
<td>5.30</td>
<td>0.10</td>
<td>0.29</td>
</tr>
<tr>
<th scope="row">Частота транзакций в секунду</th>
<td>196.36</td>
<td>203.00</td>
<td>5.64</td>
<td>220.20</td>
<td>210.95</td>
</tr>
<tr>
<th scope="row">Пропускная способность, МБ/с</th>
<td>1.18</td>
<td>1.32</td>
<td>0.03</td>
<td>1.34</td>
<td>1.28</td>
</tr>
<tr>
<th scope="row">Коэффициент параллельности</th>
<td>25.42</td>
<td>69.32</td>
<td>29.85</td>
<td>23.05</td>
<td>62.16</td>
</tr>
<tr>
<th scope="row">Максимальная длина транзакции, с</th>
<td>21.08</td>
<td>26.12</td>
<td>15.06</td>
<td>22.78</td>
<td>25.03</td>
</tr>
<tr>
<th scope="row">Минимальная длина транзакции, с</th>
<td>0.00</td>
<td>0.00</td>
<td>0.48</td>
<td>0.00</td>
<td>0.00</td>
</tr>
<tr>
<th scope="row">Load Average</th>
<td>1.8</td>
<td>2.2</td>
<td>30.1</td>
<td>1.3</td>
<td>1.65</td>
</tr>
</tbody>
</table>
<p><strong>Краткие выводы:</strong> на грамотно настроенном сервере лидирует WP Super Cache — и по скорости, и по создаваемой нагрузке. Это связано с тем, что задача по отдаче закэшированного контента переложена на web-сервер. Так как web-сервер справляется со статикой быстрее, чем с динамикой, в результате получаем рост производительности и снижение нагрузки.</p>
<p>Если по той или иной причине WP Super Cache не может работать в режиме Full On, то MaxSite Cache будет всё же предпочтительнее — ввиду своей простоты он обладает исключительным быстродействием.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/725-689-wp-super-cache-vs-maxsite-cache-part-2/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/725-689-wp-super-cache-vs-maxsite-cache-part-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WP Super Cache vs MaxSite Cache: часть 1</title>
		<link>http://blog.sjinks.pro/wordpress/689-wp-super-cache-vs-maxsite-cache-part-1/</link>
		<comments>http://blog.sjinks.pro/wordpress/689-wp-super-cache-vs-maxsite-cache-part-1/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 23:17:34 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[MaxSite Cache]]></category>
		<category><![CDATA[WP Super Cache]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=689</guid>
		<description><![CDATA[Тест страничных кэшей на виртуальном сервере абсолютного чайника После того, как MAX’у не понравился тест с участием MaxSite Cache, я решил несколько видоизменить методику тестирования. На этот раз я тестировал только два кэша: WP Super Cache и MaxSite Cache Lite. Так как по словам MAX’а в реальности все ставится «из коробки», я взял виртуальный сервер [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/689-wp-super-cache-vs-maxsite-cache-part-1/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Тест страничных кэшей на виртуальном сервере абсолютного чайника</em></h2>
<p>После того, как MAX’у не понравился <a href="http://blog.sjinks.pro/wordpress/683-wp-supercache-vs-hypercache-vs-w3-total-cache-vs-maxsite-cache/">тест с участием MaxSite Cache</a>, я решил несколько видоизменить методику тестирования.</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/maxsite-cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  MaxSite Cache">MaxSite Cache</a> Lite.<span id="more-689"></span></p>
<p>Так как по словам <cite>MAX</cite>’а <q>в реальности все ставится «из коробки»</q>, я взял виртуальный сервер (512 MiB RAM, 10 GB HD, Intel Xeon X3320 (1 ядро), 2.5 GHz), на который поставил Ubuntu 8.04 LTS Server Edition. Затем поставил <a href="http://blog.sjinks.pro/tag/apache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Apache">Apache</a> (2.2.8-1ubuntu0), PHP (5.2.4-2ubuntu5.6) и MySQL (5.0.51a-3ubuntu5.4). Конфигурационные файлы брались «из коробки» (только для <a href="http://blog.sjinks.pro/tag/apache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Apache">Apache</a> пришлось включить <a href="http://blog.sjinks.pro/tag/mod_rewrite/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  mod_rewrite">mod_rewrite</a>), в системной конфигурации абсолютно ничего не менялось. VDS абсолютного «чайника». Для мониторинга ресурсов системы установил <a href="http://blog.sjinks.pro/tag/munin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  munin">munin</a> (он рисует такие красивые графики).</p>
<p>Кому интересно, VDS конфигурировался так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p6892">
        <div class="code bash" id="p689code2">
<span class="kw2">wget</span> http:<span class="sy0">//</span>ubuntu-releases.eecs.wsu.edu<span class="sy0">/</span>hardy<span class="sy0">/</span>ubuntu-8.04.3-server-i386.iso<br />
VBoxManage registerimage dvd <span class="sy0">/</span>home<span class="sy0">/</span>user1<span class="sy0">/</span>ubuntu-8.04.3-server-i386.iso<br />
VBoxManage createhd <span class="re5">--filename</span> TestVDS-HD1 <span class="re5">--size</span> 10240 <span class="re5">--remember</span><br />
VBoxManage createvm <span class="re5">--name</span> TestVDS <span class="re5">--register</span><br />
VBoxManage modifyvm TestVDS \<br />
&nbsp; &nbsp; <span class="re5">--ostype</span> Ubuntu \<br />
&nbsp; &nbsp; <span class="re5">--memory</span> 512 <span class="re5">--vram</span> 1 \<br />
&nbsp; &nbsp; <span class="re5">--acpi</span> on <span class="re5">--ioapic</span> off <span class="re5">--pae</span> off <span class="re5">--hwvirtex</span> on <span class="re5">--nestedpaging</span> on \<br />
&nbsp; &nbsp; <span class="re5">--boot1</span> dvd \<br />
&nbsp; &nbsp; <span class="re5">--sata</span> on <span class="re5">--sataport1</span> TestVDS-HD1 \<br />
&nbsp; &nbsp; <span class="re5">--dvd</span> <span class="sy0">/</span>home<span class="sy0">/</span>user1<span class="sy0">/</span>ubuntu-8.04.3-server-i386.iso \<br />
&nbsp; &nbsp; <span class="re5">--floppy</span> disabled \<br />
&nbsp; &nbsp; <span class="re5">--nic1</span> nat \<br />
&nbsp; &nbsp; <span class="re5">--audio</span> none<br />
<br />
VBoxManage setextradata TestVDS <span class="st0">&quot;VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/Protocol&quot;</span> TCP<br />
VBoxManage setextradata TestVDS <span class="st0">&quot;VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/GuestPort&quot;</span> <span class="nu0">80</span><br />
VBoxManage setextradata TestVDS <span class="st0">&quot;VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/HostPort&quot;</span> <span class="nu0">8080</span>
        </div>
    </div>
</div>

<p>Затем я поставил <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> 2.8.5 с официального сайта, импортировал в блог порядка 800 статей среднего размера (авторство статей не моё, так что выложить не могу).</p>
<p>Вместо Apache Bench я использовал Siege, обращение производилось ко всем страницам сайта в случайном порядке (вероятность обращения к заданной странице задавалась количеством её повторений в файле с адресами). Тестирование каждого варианта (WP Super Cache и MaxSite Cache) проводилось по 45 минут — 30 минут при низкой нагрузке и 15 минут при высокой (увы, трафик не безлимитный, и раскидываться гигабайтами трафика для теста возможности пока нет). Это имитировало постепенный наплыв пользователей на сайт. Специфика теста такова, что новый запрос не выполнялся до тех пор, пока не завершался предыдущий.</p>
<p>Одновременно к страницам обращалось 30 пользователей (Apache просто больше не выдерживает). Между тестами системе перезагружалась (на всякий случай). Виртуальный сервер и сервер, с которого осуществлялось тестирование, были, естественно, разными; соединены гигабитным каналом.</p>
<p>Результаты получились очень интересными: MaxSite Cache Lite строит <a href="http://blog.sjinks.pro/tag/cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  кэш">кэш</a> несколько быстрее, чем WP Super Cache (у MaxSite Cache более простая логика работы). WP Super Cache создаёт более сильную нагрузку на диск (так как файлы разбрасываются по множеству каталогов, а не кидаются в один) и, за счёт этого, чуть большую нагрузку на процессор (если сравнивать по значению idle time). Но при этом у WP Super Cache больший коэффициент параллельности (обслуживает большее число запросов одновременно).</p>
<p>Но при отдаче кэша и с повышением нагрузки результат меняется: WP Super Cache отдаёт данные быстрее и, как результат, обслуживает большее количество клиентов. Потребление памяти при этом чуть меньше, но загрузка процессора чуть больше. Вообще картину очень сильно портил munin — <a href="http://blog.sjinks.pro/tag/load/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  нагрузка">нагрузка</a>, им создаваемая, вносила существенные погрешности в измерения (было видно в <span class="codebox"><code class="bash">top</code></span>).</p>
<table class="bordered" cellspacing="0" cellpadding="0" rules="all">
<caption>Построение кэша</caption>
<thead>
<tr>
<th>&nbsp;</th>
<th><strong>WP Super Cache</strong></th>
<th><strong>MaxSite Cache</strong></th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Количество транзакций</th>
<td>91,755</td>
<td>95,028</td>
</tr>
<tr>
<th scope="row">Объём данных, МБ</th>
<td>2,160.51</td>
<td>2,240.59</td>
</tr>
<tr>
<th scope="row">Среднее время ответа, с</th>
<td>0.05</td>
<td>0.04</td>
</tr>
<tr>
<th scope="row">Частота транзакций в секунду</th>
<td>50.97</td>
<td>52.79</td>
</tr>
<tr>
<th scope="row">Пропускная способность, МБ/с</th>
<td>1.20</td>
<td>1.24</td>
</tr>
<tr>
<th scope="row">Коэффициент параллельности</th>
<td>2.58</td>
<td>2.21</td>
</tr>
<tr>
<th scope="row">Максимальная длина транзакции, с</th>
<td>20.93</td>
<td>19.10</td>
</tr>
<tr>
<th scope="row">Минимальная длина транзакции, с</th>
<td>0.00</td>
<td>0.00</td>
</tr>
</tbody>
</table>
<table class="bordered" cellspacing="0" cellpadding="0" rules="all">
<caption>Использование кэша</caption>
<thead>
<tr>
<th>&nbsp;</th>
<th><strong>WP Super Cache</strong></th>
<th><strong>MaxSite Cache</strong></th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Количество транзакций</th>
<td>219,761</td>
<td>206,949</td>
</tr>
<tr>
<th scope="row">Объём данных, МБ</th>
<td>5,129.06</td>
<td>4,880.30</td>
</tr>
<tr>
<th scope="row">Среднее время ответа, с</th>
<td>0.07</td>
<td>0.09</td>
</tr>
<tr>
<th scope="row">Частота транзакций в секунду</th>
<td>244.29</td>
<td>229.92</td>
</tr>
<tr>
<th scope="row">Пропускная способность, МБ/с</th>
<td>5.70</td>
<td>5.42</td>
</tr>
<tr>
<th scope="row">Коэффициент параллельности</th>
<td>27.89</td>
<td>21.58</td>
</tr>
<tr>
<th scope="row">Максимальная длина транзакции, с</th>
<td>21.96</td>
<td>21.58</td>
</tr>
<tr>
<th scope="row">Минимальная длина транзакции, с</th>
<td>0.00</td>
<td>0.00</td>
</tr>
</tbody>
</table>
<p><strong>Краткие выводы:</strong> в плане построения кэша <a href="http://blog.sjinks.pro/tag/performance/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  производительность">производительность</a> у MaxSite Cache Lite выше, что объясняется простотой его логики. Но при  нагрузке и построенном кэше WP Super Cache обладает более высокой производительностью, так как web-сервер способен отдавать закэшированные данные без привлечения PHP. При одинаковом количестве запросов в секунду <em>под нагрузкой</em> WP Super Cache демонстрирует меньшее потребление памяти и нагрузку на процессор. При <em>средней</em> нагрузке на систему оба кэша ведут себя примерно одинаково — разница в потреблении памяти и нагрузке незаметна.</p>
<p><strong>В следующей части: <a href="http://blog.sjinks.pro/wordpress/725-689-wp-super-cache-vs-maxsite-cache-part-2/">тест WP Super Cache и MaxSite Cache на грамотно настроенном сервере</a>.</strong></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/689-wp-super-cache-vs-maxsite-cache-part-1/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/689-wp-super-cache-vs-maxsite-cache-part-1/feed/</wfw:commentRss>
		<slash:comments>9</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> — новое слово в кэшировании. Поддерживает сжатие скриптов, 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 />
Веб-сервер: nginx 0.8.19<br />
PHP: 5.2.10.dfsg.1-2ubuntu6.1 (<a href="http://blog.sjinks.pro/tag/fastcgi/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  FastCGI">FastCGI</a>) + 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>). Например, если вместо <a href="http://blog.sjinks.pro/tag/apache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Apache">Apache</a> поставить nginx, можно освободить довольно много драгоценной памяти (prefork у <a href="http://blog.sjinks.pro/tag/apache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Apache">Apache</a> — это весьма сильный убийца производительности); если увеличить размер буфера ключей 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>
		<item>
		<title>WP Super Cache и высокая нагрузка</title>
		<link>http://blog.sjinks.pro/wordpress/521-wp-super-cache-under-high-load/</link>
		<comments>http://blog.sjinks.pro/wordpress/521-wp-super-cache-under-high-load/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 13:28:47 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WP Super Cache]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=521</guid>
		<description><![CDATA[Интересные зависания, или, Синхронизация — это не так просто Проблема: PHP случайным образом перестаёт реагировать на внешние запросы. Сайт работает на WordPress (с WP Super Cache), web-сервером стоит nginx, php-fpm с 40 дочерними процессами висит в режиме FastCGI. Довольно-таки стандартная конфигурация. Иногда (периодичность не ясна) сайт падает. В том плане, что nginx выдаёт ошибку 502 Bad Gateway. При [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/521-wp-super-cache-under-high-load/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Интересные зависания, или, Синхронизация — это не так просто</em></h2>
<p>Проблема: PHP случайным образом перестаёт реагировать на внешние запросы.</p>
<p>Сайт работает на <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</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>), web-сервером стоит <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a>, php-fpm с 40 дочерними процессами висит в режиме <a href="http://blog.sjinks.pro/tag/fastcgi/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  FastCGI">FastCGI</a>. Довольно-таки стандартная конфигурация.</p>
<p>Иногда (периодичность не ясна) сайт падает. В том плане, что nginx выдаёт ошибку <code>502 Bad Gateway</code>. При этом в логах отображается примерно такое:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5216">
        <div class="code text" id="p521code6">
2009/03/23 00:50:57 [error] 29289#0: *1821923 connect() to unix:/dev/shm/php-fcgi-XXX.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 195.10.218.132, server: example.org, request: &quot;GET /wp-login.php HTTP/1.1&quot;, upstream: &quot;fastcgi://unix:/dev/shm/php-fcgi-XXX.sock:&quot;, host: &quot;example.org&quot;
        </div>
    </div>
</div>

<p>Лечится только перезапуском <code>php-fpm</code>.<span id="more-521"></span></p>
<p><a href="http://blog.sjinks.pro/tag/bug/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ошибка">Ошибка</a> очень интересная и нестандартная: один и тот же PHP обслуживает двух разных пользователей, соответственно, имеется два пула дочерних процессов. При этом висит только один пул. Следовательно, это не должна быть <a href="http://blog.sjinks.pro/tag/bug/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ошибка">ошибка</a> в <abbr title="FastCGI Process Manager">FPM</abbr>, иначе бы висело всё.</p>
<p>К счастью, php-fpm имеет один замечательный инструмент отладки: лог запросов к скриптам, выполняющихся дольше определённого времени с backtrace вызовов функций (нечто типа <span class="codebox"><code class="php"><span class="kw3">debug_backtrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> в PHP).</p>
<p>Оставил всё это дело на ночь, а наутро в логах получилась примерно такая картина (я оставил только уникальные backtrace):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5217">
        <div class="code text" id="p521code7">
Mar 22 18:25:06.569411 pid 3491 (pool XXX)<br />
script_filename = /index.php<br />
[0x00007fff494c81e0] sem_acquire() /wp-content/plugins/wp-super-cache/wp-cache-phase2.php:137<br />
[0x00007fff494ca6e0] wp_cache_writers_entry() /wp-content/plugins/wp-super-cache/wp-cache-phase2.php:198<br />
[0x00007fff494ca7e0] wp_cache_ob_callback() unknown:0<br />
[0x00007fff494cc280] ob_end_flush() /wp-content/plugins/wp-super-cache/wp-cache-phase2.php:515<br />
[0x00007fff494cc380] wp_cache_shutdown_callback() unknown:0<br />
<br />
Mar 22 18:32:29.859417 pid 3748 (pool XXX)<br />
script_filename = /wp-cron.php<br />
[0x00007fff494c7f00] sem_acquire() /wp-content/plugins/wp-super-cache/wp-cache-phase2.php:137<br />
[0x00007fff494c8a80] wp_cache_writers_entry() /wp-content/plugins/wp-super-cache/wp-cache-phase2.php:427<br />
[0x00007fff494c8ea0] wp_cache_phase2_clean_expired() /wp-content/plugins/wp-super-cache/wp-cache-phase2.php:673<br />
[0x00007fff494c8fa0] wp_cache_gc_cron() unknown:0<br />
[0x00007fff494c99d0] call_user_func_array() /wp-includes/plugin.php:414<br />
[0x00007fff494ca380] do_action_ref_array() /wp-cron.php:54
        </div>
    </div>
</div>

<p>Запросов первого типа было очень много, и они заняли все процессы, стрелки указывают на WP Super Cache. То, что проблема именно с семафором, подтверждает вывод <span class="codebox"><code class="bash"><span class="kw2">ps</span> <span class="re5">-C</span> php-cgi -opid,state,wchan:<span class="nu0">25</span>,args</code></span>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5218">
        <div class="code text" id="p521code8">
23023 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23024 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23025 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23047 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23048 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23049 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23050 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23051 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23052 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23053 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23054 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23055 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23056 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23057 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23058 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23059 &nbsp;S flock_lock_file_wait &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23060 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23061 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23062 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23063 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23064 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23065 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23066 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23067 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23068 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23069 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23070 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23071 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23072 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23073 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23074 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23078 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23079 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23080 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23081 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23082 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23083 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23084 &nbsp;S flock_lock_file_wait &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23085 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf<br />
23086 &nbsp;S semtimedop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/usr/bin/php-cgi --fpm --fpm-config /etc/php5/fpm.conf
        </div>
    </div>
</div>

<p><code>S</code> означает «сон, который можно прервать» (ожидание свершения события), а <code><a href="http://linux.die.net/man/2/semtimedop">semtimedop</a></code> — функция, в которой процесс уснул.</p>
<p>Так как в пуле 40 процессов, и все 40 процессов спят, имеем проблему с синхронизацией. Особенно смущает засыпание в <code>flock_lock_file_wait</code> — по идее, WP Super Cache использует либо семафоры, либо файловую блокировку, но вероятно, я что-то не учитываю (ибо не kernel developer).</p>
<p>Теоретически (если верить <a href="http://www.php.net/manual/en/function.sem-acquire.php">документации</a>) неосвобождённые семафоры автоматически удаляются при завершении скрипта (то есть в ситуации, когда скрипт захватил семафор и трагически погиб, семафор будет освобождён).</p>
<p>В общем, буду копать код WP Super Cache и искать баги.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/521-wp-super-cache-under-high-load/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/521-wp-super-cache-under-high-load/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>WP Super Cache + nginx: замена правил mod_rewrite</title>
		<link>http://blog.sjinks.pro/wordpress/509-wp-supercache-nginx-replace-mod_rewrite-rules/</link>
		<comments>http://blog.sjinks.pro/wordpress/509-wp-supercache-nginx-replace-mod_rewrite-rules/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 09:53:02 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[nginx]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[WP Super Cache]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=509</guid>
		<description><![CDATA[Конфигурация nginx для WP Super Cache Сборная солянка с нескольких форумов (ссылок, к сожалению, не дам, но Google может помочь); данная конфигурация является рабочей. if (-f $request_filename) { break; } set $supercache_file &#039;&#039;; set $supercache_uri $request_uri; if ($request_method = POST) { set $supercache_uri &#039;&#039;; } if ($query_string) { set $supercache_uri &#039;&#039;; } if ($http_cookie ~* [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/509-wp-supercache-nginx-replace-mod_rewrite-rules/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Конфигурация <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</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></em></h2>
<p>Сборная солянка с нескольких форумов (ссылок, к сожалению, не дам, но Google может помочь); данная конфигурация является рабочей.<br />
<span id="more-509"></span></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p50910">
        <div class="code nginx" id="p509code10">
<span class="kw1">if</span> (-f $request_filename) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;<br />
}<br />
<br />
<span class="kw1">set</span> $supercache_file <span class="st0">''</span>;<br />
<span class="kw1">set</span> $supercache_uri $request_uri;<br />
<br />
<span class="kw1">if</span> ($request_method = POST) {<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">set</span> $supercache_uri <span class="st0">''</span>;<br />
}<br />
<br />
<span class="kw1">if</span> ($query_string) {<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">set</span> $supercache_uri <span class="st0">''</span>;<br />
}<br />
<br />
<span class="kw1">if</span> ($http_cookie ~* <span class="st0">&quot;comment_author_|wordpress|wp-postpass_&quot;</span> ) {<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">set</span> $supercache_uri <span class="st0">''</span>;<br />
}<br />
<br />
<span class="kw1">if</span> ($supercache_uri ~ ^(.+)$) {<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">set</span> $supercache_file /wp-content/cache/supercache/$http_host/$1index.html;<br />
}<br />
<br />
<span class="kw1">if</span> (-f $document_root$supercache_file) {<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">rewrite</span> ^(.*)$ $supercache_file <span class="kw1">break</span>;<br />
}
        </div>
    </div>
</div>

<p>Этот блок нужно вставлять до основных правил переписывания адресов (в идеале сразу после <span class="codebox"><code class="nginx"><span class="kw1">root</span></code></span>).</p>
<p>Детали конфигурирования nginx для <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> описаны в статье <strong>«<a href="http://blog.sjinks.pro/wordpress/458-nginx-config-for-wordpress-look-from-the-gallery/">Конфигурация nginx для WordPress: критический взгляд со стороны</a>»</strong>.</p>
<p>Можно сделать проще: поместить правила для WP SuperCache в <code>/etc/nginx/includes/wpsupercache.conf</code>, а из конфигурации виртуального хоста делать <span class="codebox"><code class="nginx"><span class="kw1">include</span> /etc/nginx/includes/wpsupercache.conf;</code></span> — работать будет, так как конфигурация WP Super Cache не зависит от внешних параметров.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/509-wp-supercache-nginx-replace-mod_rewrite-rules/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/509-wp-supercache-nginx-replace-mod_rewrite-rules/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

