<?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; Результаты поиска  &#187;  Super Cache</title>
	<atom:link href="http://blog.sjinks.pro/search/Super+Cache/feed/rss2/" 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>WordPress: кэширование средствами nginx</title>
		<link>http://blog.sjinks.pro/wordpress/877-wordpress-caching-with-nginx/</link>
		<comments>http://blog.sjinks.pro/wordpress/877-wordpress-caching-with-nginx/#comments</comments>
		<pubDate>Fri, 10 Dec 2010 12:08:15 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[nginx]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[FastCGI]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[кэш]]></category>
		<category><![CDATA[производительность]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=877</guid>
		<description><![CDATA[Уменьшение потребления ресурсов во много раз Много было сказано про кэширование в WordPress… Сегодня я хочу рассказать о действительно эффективном методе, позволяющем сильно снизить нагрузку. Метод основан на использовании кэша FastCGI web-сервера nginx. Идея состоит в генерации статических страниц и отдачи их пользователям, не имеющим cookie комментатора. Зарегистрированным пользователям, а также комментаторам всегда отдаётся свежая [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/877-wordpress-caching-with-nginx/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Уменьшение потребления ресурсов во много раз</em></h2>
<p>Много было сказано про <a href="http://blog.sjinks.pro/?s=WordPress%20cache">кэширование в WordPress</a>… Сегодня я хочу рассказать о действительно эффективном методе, позволяющем сильно снизить нагрузку.</p>
<p>Метод основан на использовании кэша <a href="http://blog.sjinks.pro/tag/fastcgi/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  FastCGI">FastCGI</a> web-сервера <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a>.</p>
<p>Идея состоит в генерации статических страниц и отдачи их пользователям, не имеющим cookie комментатора. Зарегистрированным пользователям, а также комментаторам всегда отдаётся свежая страница. Так как читателей, ни разу не оставлявших комментарий, как правило, гораздо больше, чем комментаторов, то подобный использование кэша позволяет значительно снизить нагрузку на <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/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</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> заметят, что WPSC использует тот же принцип работы.<span id="more-877"></span></p>
<p>В чем же преимущество перекладывания работы на Web-сервер (nginx)?</p>
<ol>
<li>PHP — интерпретируемый язык. Как следствие, аналогичный код на компилируемом языке будет во много раз быстрее.</li>
<li>WordPress во многом bloatware <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  От момента начала загрузки страницы до окончания выполнения стадии <code>init</code> выполняется очень много «лишнего» кода.</li>
<li>В зависимости от нагрузки на сервер от запроса страницы до выполнения PHP-кода может пройти некоторое время: всё зависит от загруженности PHP (если все дочерние процессы PHP заняты обработкой запроса, новому запросу придётся ждать освобождения одного из процессов. Если за приемлемое время ни один процесс не освободился, пользователь видит сообщение о печально знаменитой ошибке 504).</li>
<li>Когда обслуживанием кэша занимается web-сервер, шансы на возникновение <a href="http://blog.sjinks.pro/wordpress/521-wp-super-cache-under-high-load/">подобной ситуации</a></li>
 (когда даже автор не может понять, в чём дело) значительно снижаются: реализация синхронизации/блокировок средствами PHP — неблагодарное дело.
</ol>
<p>Теперь переходим от теории к практике.</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8773">
        <div class="code nginx" id="p877code3">
<ol class="nginx" style="font-family:monospace;"><li class="li1"><div class="de1"><span class="kw1">fastcgi_cache_path</span> /var/lib/nginx/myblog levels=2 keys_zone=myblog:10m max_size=512m inactive=20m;</div></li>
<li class="li1"><div class="de1"><span class="kw1">server</span> {</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">server_name</span> example.com;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">root</span> /path/to/blog;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">index</span> <span class="kw1">index</span>.php;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> ($http_cookie ~* <span class="st0">&quot;comment_author_|wordpress_(?!test_cookie)|wp-postpass_&quot;</span> ) {</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">set</span> $do_not_cache <span class="nu0">1</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; }</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; fastcgi_cache_bypass $do_not_cache;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; fastcgi_no_cache $do_not_cache;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">fastcgi_pass_header</span> Cookie;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">fastcgi_cache</span> myblog;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">fastcgi_cache_key</span> $request_method|$host|$request_uri;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">fastcgi_cache_valid</span> 301 8h;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">fastcgi_cache_valid</span> 404 1h;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">fastcgi_cache_valid</span> 200 15m;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> ($http_user_agent !~ FeedBurner) {</div></li>
<li class="li1"><div class="de1"><span class="co1"># Здесь идут перенаправления для FeedBurner</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; }</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">error_page</span> 404 = @wordpress;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">log_not_found</span> <span class="kw2">off</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">location</span> ^~ /files/ {</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">rewrite</span> /files/(.+) /wp-includes/ms-files.php?file=$1 last;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; }</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">location</span> ~ ^/(wp-admin/.*\.php|wp-login\.php|wp-register\.php|(feed|comment/feed)(/.*)?)$ {</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try_files</span> $uri @wordpress;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">set</span> $do_not_cache <span class="nu0">1</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_cache_bypass <span class="nu0">1</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_no_cache <span class="nu0">1</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_pass</span> unix:/dev/shm/php-fcgi.sock;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_index</span> <span class="kw1">index</span>.php;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span> /etc/nginx/fastcgi_params;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_FILENAME $document_root$fastcgi_script_name;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; }</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">location</span> @wordpress {</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span> /etc/nginx/fastcgi_params;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_NAME /<span class="kw1">index</span>.php;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_FILENAME $document_root/<span class="kw1">index</span>.php;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_index</span> <span class="kw1">index</span>.php;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_pass</span> unix:/dev/shm/php-fcgi.sock;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> ($do_not_cache != <span class="st0">&quot;1&quot;</span>) {</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">add_header</span> Vary Cookie;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; }</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; }</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">location</span> ~ \.php$ {</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span> /etc/nginx/fastcgi_params;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_index</span> <span class="kw1">index</span>.php;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_FILENAME $document_root$fastcgi_script_name;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try_files</span> $uri @wordpress;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_pass</span> unix:/dev/shm/php-fcgi.sock;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> ($do_not_cache != <span class="st0">&quot;1&quot;</span>) {</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">add_header</span> Vary Cookie;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; }</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; }</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">location</span> ^~ /blogs.dir/ {</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">internal</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">root</span> /path/to/blog/wp-content/;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; }</div></li>
<li class="li1"><div class="de1">}</div></li>
</ol>
        </div>
    </div>
</div>

<p>Документация по использованию FastCGI в nginx приведена <a href="http://sysoev.ru/nginx/docs/http/ngx_http_fastcgi_module.html">здесь</a>, поэтому я не буду подробно останавливаться на том, что конкретно каждая директива делает.</p>
<p>Основная магия происходит в строка 8—10: здесь определяются условия, при которых отдаётся свежая страница. В данном случае проверяется наличие авторизационных cookie и cookie комментатора. Важно, чтобы в случае отказа от кэширования переменная $<code>do_not_cache</code> устанавливалась в 1.</p>
<p>Строка 16 задаёт ключ, по которому страница доступна в кэше. В ключе присутствует <code>$request_method</code>, чтобы различать запросы GET и HEAD (для HEAD данные не возвращаются, только заголовки).</p>
<p>Строки 17—19 задают время жизни кэша в зависимости от кода ответа. Чем больше время жизни, тем реже будет обновляться информация для незарегистрированных пользователей.</p>
<p>В строке 32 задаётся маска для страниц, которые не должны кэшироваться (например, админка, страницы логина и регистрации, фиды).</p>
<p>Так как содержимое страницы <em>может</em> отличаться в зависимости от cookie пользователя, в строках 49 и 59 для закэшированных страниц принудительно выставляется заголовок <code>Vary: Cache</code>. Если используются другие правила (например, фильтрация по User-Agent), нужно добавлять соответствующее правило.</p>
<p>Строки 21—23: подробнее описано в статье <strong>«<a href="http://blog.sjinks.pro/wordpress/691-redirect-rss-feeds-to-feedburner-with-nginx/">Перенаправление RSS в WordPress на FeedBurner для nginx</a>»</strong></p>
<p>Строки 28—30, 63—66 подробнее описаны в статье <strong>«<a href="http://blog.sjinks.pro/wordpress/874-wpms-nginx-accel-redirect/">WordPress MultiSite, nginx и X-Accel-Redirect</a>»</strong></p>
<p>Вроде бы ничего не забыл. Теперь о том, какую <a href="http://blog.sjinks.pro/tag/performance/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  производительность">производительность</a> мы получаем:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8774">
        <div class="code text" id="p877code4">
$ ab -n 10000 -c 100 http://blog.sjinks.pro/<br />
Server Software: &nbsp; &nbsp; &nbsp; &nbsp;nginx<br />
Server Hostname: &nbsp; &nbsp; &nbsp; &nbsp;blog.sjinks.pro<br />
Server Port: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;80<br />
<br />
Document Path: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/<br />
Document Length: &nbsp; &nbsp; &nbsp; &nbsp;50294 bytes<br />
<br />
Concurrency Level: &nbsp; &nbsp; &nbsp;100<br />
Time taken for tests: &nbsp; 46.925 seconds<br />
Complete requests: &nbsp; &nbsp; &nbsp;10000<br />
Failed requests: &nbsp; &nbsp; &nbsp; &nbsp;0<br />
Write errors: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0<br />
Total transferred: &nbsp; &nbsp; &nbsp;504940000 bytes<br />
HTML transferred: &nbsp; &nbsp; &nbsp; 502940000 bytes<br />
Requests per second: &nbsp; &nbsp;213.10 [#/sec] (mean)<br />
Time per request: &nbsp; &nbsp; &nbsp; 469.254 [ms] (mean)<br />
Time per request: &nbsp; &nbsp; &nbsp; 4.693 [ms] (mean, across all concurrent requests)<br />
Transfer rate: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;10508.28 [Kbytes/sec] received<br />
<br />
Connection Times (ms)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; min &nbsp;mean[+/-sd] median &nbsp; max<br />
Connect: &nbsp; &nbsp; &nbsp; 16 &nbsp; 94 &nbsp;76.9 &nbsp; &nbsp; 94 &nbsp; &nbsp;3125<br />
Processing: &nbsp; 118 &nbsp;373 &nbsp;81.7 &nbsp; &nbsp;360 &nbsp; &nbsp;1334<br />
Waiting: &nbsp; &nbsp; &nbsp; 17 &nbsp; 69 &nbsp;38.5 &nbsp; &nbsp; 57 &nbsp; &nbsp; 422<br />
Total: &nbsp; &nbsp; &nbsp; &nbsp;156 &nbsp;467 105.0 &nbsp; &nbsp;445 &nbsp; &nbsp;3535<br />
<br />
Percentage of the requests served within a certain time (ms)<br />
&nbsp; 50% &nbsp; &nbsp;445<br />
&nbsp; 66% &nbsp; &nbsp;454<br />
&nbsp; 75% &nbsp; &nbsp;471<br />
&nbsp; 80% &nbsp; &nbsp;494<br />
&nbsp; 90% &nbsp; &nbsp;541<br />
&nbsp; 95% &nbsp; &nbsp;589<br />
&nbsp; 98% &nbsp; &nbsp;655<br />
&nbsp; 99% &nbsp; &nbsp;768<br />
&nbsp;100% &nbsp; 3535 (longest request)
        </div>
    </div>
</div>

<p>Сервер зафлудили 10,000 запросами в 100 <strong>параллельных</strong> потоков. Сервер выдал практически полгигабайта за 47 секунд; в среднем сервер обрабатывал <strong>213 запросов в секунду</strong>, при этом <strong>99% запросов были обработаны за 768 мс</strong> (при том, что на сервере несколько сайтов в Alexa Top 100,000)! Нагрузка на сервер была минимальной (изменений Load Average замечено не было).</p>
<p><strong style="color: red">UPDATE:</strong> есть один небольшой нюанс: CAPTCHA. Если вы их используете, убедитесь, что они работают. Дело в том, что страница со статьёй будет отдаваться непосредственно из кэша nginx, PHP загружаться не будет. Поэтому если CAPTCHA полагается на использование сессии, она может работать неправильно. Здесь всё зависит от используемого плагина.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/877-wordpress-caching-with-nginx/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/877-wordpress-caching-with-nginx/feed/</wfw:commentRss>
		<slash:comments>61</slash:comments>
		</item>
		<item>
		<title>SJ Object Cache: еще более быстрое объектное кэширование для WordPress</title>
		<link>http://blog.sjinks.pro/wordpress/plugins/776-sj-object-cache-faster-object-cache-for-wordpress/</link>
		<comments>http://blog.sjinks.pro/wordpress/plugins/776-sj-object-cache-faster-object-cache-for-wordpress/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 06:34:35 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Плагины WordPress]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[eAccelerator]]></category>
		<category><![CDATA[Memcache]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[SJ Object Cache]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WP File Cache]]></category>
		<category><![CDATA[xCache]]></category>
		<category><![CDATA[кэш]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=776</guid>
		<description><![CDATA[Делаем WordPress еще быстрее После года тестирования наконец-то вышла первая стабильная версия плагина SJ Object Cache. SJ Object Cache — альтернатива плагину WP File Cache, поддерживающая APC, eAccelerator, xCache, Zend Disk Cache, Zend Shared Memory Cache, memcache и memcached. В отличие от WP File Cache, SJ Object Cache ориентирован на VPS/VDS и выделенные сервера. Одним из недостатков [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/plugins/776-sj-object-cache-faster-object-cache-for-wordpress/">источник</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>После года тестирования наконец-то вышла первая стабильная версия плагина SJ Object Cache.</p>
<p>SJ Object Cache — альтернатива плагину <a href="http://blog.sjinks.pro/tag/wp-file-cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WP File Cache">WP File Cache</a>, поддерживающая APC, <a href="http://blog.sjinks.pro/tag/eaccelerator/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  eAccelerator">eAccelerator</a>, <a href="http://blog.sjinks.pro/tag/xcache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  xCache">xCache</a>, Zend Disk Cache, Zend Shared Memory Cache, <a href="http://blog.sjinks.pro/tag/memcache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Memcache">memcache</a> и <a href="http://blog.sjinks.pro/tag/memcached/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Memcached">memcached</a>.</p>
<p><strong>В отличие от WP File Cache, SJ Object Cache ориентирован на VPS/VDS и выделенные сервера.</strong><br />
<span id="more-776"></span></p>
<p>Одним из недостатков WP File Cache является то, что он смещает нагрузку с базы данных на файловую систему. Хотя это может быть не сильно критично для <em>хорошего</em> shared-хостинга, на виртуальных серверах и серверах со слабой дисковой подсистемой это может быть критично (виртуализация очень часто негативно сказывается на скорости ввода/вывода, в результате процессор может проводить много времени в ожидании окончания ввода/вывода). Вдобавок ко всему при включённом <code>open_basedir</code> файловые операции осуществляются медленнее из-за лишних проверок (привет всем, использующим Plesk).</p>
<p>Решением данной проблемы является использование разделяемой памяти (shared memory). Так как многие администраторы для повышения производительности ставят на выделенных серверах акселераторы (APC, xCache, eAccelerator), SJ Object Cache использует их интерфейс (API) для работы с выделенной памятью.</p>
<h3>Функциональность SJ Object Cache</h3>
<ul>
<li>реализация долговременного кэширования на уровне запросов;</li>
<li>возможность отключения кэширования (в том числе и встроенного в WordPress);</li>
<li>возможность отключения межсессионного кэширования;</li>
<li>полная совместимость с интерфейсом класса WP_Object_Cache WordPress;</li>
<li>использование памяти под сессионный <a href="http://blog.sjinks.pro/tag/cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  кэш">кэш</a> для увеличения производительности;</li>
<li>сессионное кэширование часто изменяющихся объектов;</li>
<li>возможность задания групп, не подлежащих межсессионному кэшированию (может быть полезно для <a href="http://wordpress.org/support/topic/364580?replies=3">обеспечения совместимости со сторонними плагинами</a>);</li>
<li>модульная архитектура, позволяющая добавлять новые кэширующие движки;</li>
<li>хранение настроек в коде плагина.</li>
</ul>
<h3>Кэширующие движки</h3>
<ul>
<li>Base Cache — аналог объектного кэша WordPress без возможности сохранения данных между сессиями; по тестам показывает чуть большую производительность, чем встроенный в WordPress кэш;</li>
<li><a href="http://ua2.php.net/manual/en/book.apc.php">Alternative PHP Cache</a> (APC);</li>
<li><a href="http://www.eaccelerator.net/">eAccelerator</a> (<strong>внимание:</strong> eAccelerator 0.9.6 не поддерживается, так как из него <a href="http://www.eaccelerator.net/wiki/Release-0.9.6">убрали</a> функции кэширования пользовательских данных);</li>
<li><a href="http://xcache.lighttpd.net/">xCache</a></li>
<li>Zend Disk/Shared Memory Cache (<strong>данный движок не тестировался, но работать должен</strong>);</li>
<li>File Cache — модифицированная версия движка WP File Cache;</li>
<li>File Group Cache — модифицированная версия File Cache, оптимизированная под слабую дисковую подсистему (при доступе к кэшу читается сразу вся группа, что приводит к минимизации числа обращений к диску и увеличению объема потребляемой памяти);</li>
<li><a href="http://php.net/manual/en/book.memcache.php">Memcache</a>;</li>
<li><a href="http://php.net/manual/en/book.memcached.php">Memcached</a>;</li>
<li>Версия 1.2 плагина полностью совместима с WordPress 3.x (в том числе с 3.1).</li>
</ul>
<h3>Замечания по установке</h3>
<p>Плагину при активации/сохранении настроек должен быть доступен на запись каталог <code>wp-content</code>: в него копируется файл <code>object-cache.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code>.</p>
<p>В настройках акселератора (APC, eAccelerator, xCache) нужно отвести достаточно места под пользовательский кэш. WordPress весьма прожорлив!</p>
<p><strong>Настройки, контролирующие размер кэша APC:</strong> <a href="http://ua2.php.net/manual/en/apc.configuration.php#ini.apc.shm-segments"><code>apc.shm_segments</code></a>, <a href="http://ua2.php.net/manual/en/apc.configuration.php#ini.apc.shm-size">apc.shm_size</a>.</p>
<p><strong>Настройки, контролирующие размер кэша xCache:</strong> <a href="http://xcache.lighttpd.net/wiki/XcacheIni"><code>xcache.var_size</code></a>. xCache — единственный из трёх рассматриваемых акселераторов, имеющий раздельные кэши для опкода и пользовательских данных.</p>
<p><strong>Настройки, контролирующие размер кэша eAccelerator:</strong> <a href="http://www.eaccelerator.net/wiki/Settings"><code>eaccelerator.shm_size</code></a>.</p>
<p>Для APC и eAccelerator размер кэша должен учитывать кэш опкода. По скромным подсчётам, WordPress 2.9.2 без плагинов (PHP 5.1.22, amd-64) занимает порядка десяти мегабайт. Для настройки размера кэша очень рекомендую воспользоваться утилитами, входящими в дистрибутив акселератора: они позволяют оценить объем занятой памяти, фрагментации кэша и просматривать различную статистику. Если с первого раза оптимальный размер кэша подобрать не удаётся, это нормально <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><strong>Memcache и Memcached</strong> требуют наличия установленных расширений PHP из PECL (<a href="http://pecl.php.net/package/memcache">Memcache</a> и <a href="http://pecl.php.net/package/memcached">Memcached</a> соответственно).</p>
<p>На данном сервере (пять разных WordPress с разным наборов плагинов (SJ Object Cache настроен на трёх из них), три Simple Machines Forum, куча всего по мелочи, <del datetime="2010-10-14T06:26:44+00:00">кэш eAccelerator для хранения сессий</del>) размер кэша колеблется в пределах 128–192 мегабайт. Север выдерживает больше тысячи одновременных посетителей, порядка 100,000 посетителей в сутки и генерирует в среднем 64 гигабайта трафика в сутки — и это безо всяких страничных кэшей типа <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>, Hyper Cache, <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> и т.п. Не без напильника, но тем не менее.</p>
<h3>Удаление/деактивация плагина</h3>
<p>Для успешной деактивации каталог <code>wp-content</code> должен быть доступен на запись — требуется удаление файла <code>wp-content/object-cache.php</code>.</p>
<p>Для версии 1.2 плагина на запись должен быть доступен каталог плагина — настройки плагина теперь хранятся в файле <code>options.php</code> (специально для тех, кто не хотел держать <code>wp-content</code> открытым на запись).</p>
<p><strong><a href="http://d.sjinks.pro/wordpress/sj-object-cache-1.0.zip" rel="nofollow">Скачать SJ Object Cache 1.0</a>.</strong><br />
<strong><a href="http://d.sjinks.pro/wordpress/sj-object-cache-1.1.zip" rel="nofollow">Экспериментальная версия SJ Object Cache 1.1 с поддержкой WordPress MU</a>.</strong><br />
<strong><a href="http://d.sjinks.pro/wordpress/sj-object-cache-1.2.zip" rel="nofollow">Экспериментальная версия SJ Object Cache 1.2 с поддержкой Memcache/Memcached</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/plugins/776-sj-object-cache-faster-object-cache-for-wordpress/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/plugins/776-sj-object-cache-faster-object-cache-for-wordpress/feed/</wfw:commentRss>
		<slash:comments>157</slash:comments>
		</item>
		<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_<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a>5</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>установка и настройка <a href="http://blog.sjinks.pro/tag/xcache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  xCache">xCache</a> (я исходил из того, что далеко не все чувствуют себя комфортно при сборке программ из исходников, поэтому брал только готовое ПО);</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), <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a> (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="p6896">
        <div class="code bash" id="p689code6">
<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>Сравнение различных плагинов кэширования для WordPress</em></h2>
<p>Для WordPress написано много кэширующих плагинов, предназначенных для борьбы со слабой производительностью сервера (либо кривыми руками администратора, который не в состоянии настроить <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a>/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>, Hyper Cache, W3 Total Cache и <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>) + <a href="http://blog.sjinks.pro/tag/xcache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  xCache">xCache</a> 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 (<a href="http://blog.sjinks.pro/tag/apc/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  APC">APC</a>, xCache, <a href="http://blog.sjinks.pro/tag/eaccelerator/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  eAccelerator">eAccelerator</a>), то можно значительно снизить затраты на перекомпиляцию PHP-кода и уменьшить время отклика системы. Если использовать оптимизатор, встроенный в <a href="http://blog.sjinks.pro/tag/eaccelerator/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  eAccelerator">eAccelerator</a>, то можно <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>Проблема: <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a> случайным образом перестаёт реагировать на внешние запросы.</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="p52110">
        <div class="code text" id="p521code10">
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="p52111">
        <div class="code text" id="p521code11">
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="p52112">
        <div class="code text" id="p521code12">
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="p50914">
        <div class="code nginx" id="p509code14">
<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>
		<item>
		<title>WP File Cache: долговременное кэширование в WordPress</title>
		<link>http://blog.sjinks.pro/wordpress-plugins/wp-file-cache/</link>
		<comments>http://blog.sjinks.pro/wordpress-plugins/wp-file-cache/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 11:23:47 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Всё подряд]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WP File Cache]]></category>
		<category><![CDATA[кэш]]></category>
		<category><![CDATA[плагин]]></category>
		<category><![CDATA[производительность]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?page_id=418</guid>
		<description><![CDATA[Повышение производительности WordPress в один клик Как известно, WordPress поддерживает два вида кэширования: Кэширование на уровне страниц; Кэширование на уровне запросов. Кэширование на уровне страниц WordPress поддерживает, но самостоятельно не реализует, вследствие чего приходится использовать сторонние плагины (Hyper Cache, WP Super Cache и т.д.). При всех достоинствах постраничного кэширования, у него есть несколько недостатков, а именно: [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress-plugins/wp-file-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 поддерживает два вида кэширования:</p>
<ol>
<li>Кэширование на уровне страниц;</li>
<li>Кэширование на уровне запросов.</li>
</ol>
<p>Кэширование на уровне страниц WordPress поддерживает, но самостоятельно не реализует, вследствие чего приходится использовать сторонние плагины (<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/wp-super-cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WP Super Cache">WP Super Cache</a> и т.д.). При всех достоинствах постраничного кэширования, у него есть несколько недостатков, а именно:</p>
<ul>
<li>невозможность использования динамических элементов (например, captcha, работающая по методу «<a href="http://blog.sjinks.pro/wordpress/plugins/329-sjcaptcha-lite-invisible-spam-protection/">изящного отсеивания спама</a>») или виджетов, генерирующих динамический контент (например, quote of the day);</li>
<li>плагины, которые отдают комментатору статическую версию страницы (в этом был замечен Hyper Cache), вынуждают пользователя каждый раз вводить свои данные (имя, сайт, email) заново.</li>
</ul>
<p>Кэширование на уровне запросов WordPress поддерживает и реализует самостоятельно, но в этой реализации есть один недостаток: <a href="http://blog.sjinks.pro/tag/cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  кэш">кэш</a> между сессиями не сохраняется (что может привести к <a href="http://pokrovskii.com/kak-uskorit-rabotu-wordpress/">неприятным последствиям</a>). Тем не менее, из-за <a href="http://blog.sjinks.pro/wordpress/410-monstrosa-horribilis/">особенностей архитектуры WordPress</a>, без кэша WordPress работать будет очень медленно.</p>
<p>Очевидно, что если сохранять кэш между сессиями (что WordPress поддерживает, но самостоятельно реализовать не может), это может весьма положительно повлиять на <a href="http://blog.sjinks.pro/tag/performance/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  производительность">производительность</a>.</p>
<p>Отмечу, что хотя поддержка кэширования на уровне запросов (в том виде, как она реализована сейчас) появилась в версии 2.5, в ядро WordPress были внесены изменения, позволяющие поддерживать долговременное кэширование без танцев с бубнами, только в версии 2.6.</p>
<p>На WordPress.org, как ни странно, плагинов, поддерживающих долговременное кэширование на уровне запросов, я не нашел. Вероятно, разработчики считают, что это экономия на спичках и разумнее будет творить что-то более глобальное (например, страничное кэширование).</p>
<p>Первая версия плагина <a href="http://blog.sjinks.pro/tag/wp-file-cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WP File Cache">WP File Cache</a> родилась у меня давно — еще в июне. И лишь недавно я нашел время, чтобы привести <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> в человеческий вид, добавить интерфейс для администратора и перевести <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> на русский язык.</p>
<p><strong>Функциональность плагина:</strong></p>
<ul>
<li>реализация долговременного кэширования на уровне запросов;</li>
<li>полная совместимость с интерфейсом класса <code>WP_Object_Cache</code> WordPress;</li>
<li>использование памяти под сессионный кэш для увеличения производительности;</li>
<li>сессионное кэширование часто изменяющихся объектов;</li>
<li>хранение настроек в коде плагина.</li>
</ul>
<p><strong>Особенности плагина:</strong></p>
<ul>
<li>возможность отключения кэширования (в том числе и встроенного в WordPress);</li>
<li>возможность отключения межсессионного кэширования;</li>
<li>возможность задания групп, не подлежащих межсессионному кэшированию (полезно только разработчикам, которые знают, о чём идёт речь);</li>
<li>плагин хранит свои настройки непосредственно в коде (в файле <code>wp-content/object-cache.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code>). Это связано с проблемой курицы и яйца, а также с архитектурными особенностями WordPress: дело в том, что WordPress инициализирует кэш вызовом <span class="codebox"><code class="php">wp_cache_init<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>: при обработке данного вызова плагин должен инициализировать кэш. Если бы настройки хранились в таблице <code>wp_options</code>, плагин бы использовал функцию <span class="codebox"><code class="php">get_option<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>. Но функция <span class="codebox"><code class="php">get_option<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> вызывает <span class="codebox"><code class="php">wp_cache_get<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>, а <span class="codebox"><code class="php">wp_cache_get<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> не может использовать кэш, потому что он не инициализирован. В принципе, это не является проблемой; проблема заключается в том, что <span class="codebox"><code class="php">get_option<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> читает <em>все</em> опции из таблицы, для которых <code>autoload</code> установлен в 1. На практике это  90–95% таблицы. <a href="http://blog.sjinks.pro/wordpress/410-monstrosa-horribilis/">Ранее</a> я уже писал, что WordPress в целом и <span class="codebox"><code class="php">get_option<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> в частности спроектированы так, что если кэширующий модуль не вернул данные, функция затребует их вновь и в полном объеме. Иными словами, опции будут загружены дважды (два обращения к базе данных). А это нехорошо. Поэтому настройки хранятся непосредственно в коде.</li>
</ul>
<p>Плагин существует в четырёх локализациях: ураинской, русской, английской и белорусской. Если есть желание перевести плагин на другой язык, пишите.</p>
<p><strong>Замечания по установке:</strong></p>
<p>После активации плагин для хранения кэша будет использовать каталог <code>wp-content/plugins/file-cache/cache</code>. Поэтому <strong>перед</strong> активацией каталог должен быть доступен на запись. Каталог для хранения кэша можно изменить в настройках (для увеличения производительности имеет смысл размещать кэш на RAM-диске); каталог также должен быть доступен на запись.</p>
<p>Плагину при активации/сохранении настроек должен быть доступен на запись каталог <code>wp-content</code>: в него копируется файл <code>object-cache.php</code>. После того, как плагин активирован <strong>и</strong> сконфигурирован, права на запись можно убрать.</p>
<p><strong>Удаление/деактивация плагина:</strong><br />
Для успешной деактивации каталог <code>wp-content</code> должен быть доступен на запись — требуется удаление файла <code>wp-content/object-cache.php</code>.</p>
<p>Для срочной деактивации плагина можно удалить или переименовать файл <code>wp-content/object-cache.php</code>. В этом случае WordPress будет использовать встроенные механизмы кэширования.</p>
<p><strong>Download</strong></p>
<p><a href="http://wordpress.org/extend/plugins/wp-file-cache/">Скачать последнюю версию плагина WP File Cache</a>.</p>
<p><strong>Список изменений</strong></p>
<ul>
<li><strong>Версия 1.2.8:</strong>
<ul>
<li>Добавлена украинская локализация (спасибо <strong><a href="http://andrey.eto-ya.com/">Андрею К.</a></strong>).</li>
</ul>
</li>
<li><strong>Версия 1.2.7:</strong>
<ul>
<li>Добавлена белорусская локализация (спасибо <strong><a href="http://antsar.info/">Antsar</a></strong>);</li>
<li>Добавлена экспериментальная возможность использовать свежие данные в панели администрирования (данные будут браться из базы данных, кэш при записи будет обновляться).</li>
</ul>
</li>
<li><strong>Версия 1.2.5:</strong>
<ul>
<li>Кэшируемые данные больше не передаются по ссылке, что позволяет избежать случайного изменения данных в кэше;</li>
<li>Кэшируемые объекты перед помещением в кэш клонируются (из тех же соображений).</li>
</ul>
</li>
<li><strong>Версии 1.2.3–1.2.4:</strong>
<ul>
<li>Размещение плагина в репозитории WordPress и исправление ошибок, вызванных изменением каталога плагина. Спасибо <strong><a href="http://www.trancedl.com/">Raveex</a></strong> за терпение и тестирование.</li>
</ul>
</li>
<li><strong>Версия 1.2.2:</strong>
<ul>
<li>Добавлена базовая совместимость с WordPress 3.0.</li>
</ul>
</li>
<li><strong><a href="http://blog.sjinks.pro/wordpress/plugins/750-wp-file-cache-1-2-1/">Версия 1.2.1</a>:</strong>
<ul>
<li>Оптимизация кода, ускорение работы кэширующего движка;</li>
<li>Блокировка файла при записи;</li>
<li>Использование меньшего количества системных вызовов при записи файлов.</li>
</ul>
</li>
<li><strong><a href="http://blog.sjinks.pro/wordpress/plugins/738-wp-file-cache-1-1/">Версия 1.1</a></strong></li>
<li><strong><a href="http://blog.sjinks.pro/wordpress/plugins/420-wp-file-cache-10/">Версия 1.0</a></strong></li>
<li><strong><a href="http://blog.sjinks.pro/wordpress/plugins/190-wp-file-cache-replacement-for-wp_object_cache-with-persistent-caching/">Версии 0.2.x</a></strong></li>
</ul>
<p><strong>Оценки производительности</strong></p>
<ol>
<li><em>«Голый» <a href="http://wordpress.org/development/2008/12/wordpress-27-release-candidate-1/">WordPress 2.7rc1</a></em>:
<ol>
<li><strong>Кэширование запрещено:</strong> 191&nbsp;запроса, 0.587 с</li>
<li><strong>Встроенный в WordPress кэш:</strong> 18&nbsp;запросов, 0.350 с</li>
<li><strong>WP File Cache: сессионное кэширование:</strong> 18 запросов, 0.334 с</li>
<li><strong>WP File Cache: долговременное кэширование:</strong> 3 запроса, 0.315 с</li>
</ol>
</li>
<li><em>Данный сайт:</em>
<ol>
<li><strong>Кэширование запрещено:</strong> 1442 запроса, 3.558 с</li>
<li><strong>Встроенный в WordPress кэш:</strong> 51 запрос, 0.776 с</li>
<li><strong>WP File Cache: сессионное кэширование:</strong> 51 запрос, 0.615 с</li>
<li><strong>WP File Cache: долговременное кэширование:</strong> 13 запросов, 0.576 с</li>
</ol>
</li>
</ol>
<p></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress-plugins/wp-file-cache/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress-plugins/wp-file-cache/feed/</wfw:commentRss>
		<slash:comments>289</slash:comments>
		</item>
		<item>
		<title>Ответ на «13 Тэгов, которые следует удалить из вашей темы»</title>
		<link>http://blog.sjinks.pro/wordpress/188-re-13-tags-to-delete-from-your-theme/</link>
		<comments>http://blog.sjinks.pro/wordpress/188-re-13-tags-to-delete-from-your-theme/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 01:23:49 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[оптимизация]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=188</guid>
		<description><![CDATA[Стоит ли экономить на спичках? Сегодня мне наконец-то посчастливилось найти концы (в смысле, оригинал) статьи, которую публикуют многие блоггеры (в переводе на родной язык). Статья носит название «13 Тэгов, которые следует удалить из вашей темы» (с ней можно ознакомиться, например, здесь). В переводе меня смутило то, что автор, на мой взгляд, «экономил на спичках», вместо [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/188-re-13-tags-to-delete-from-your-theme/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Стоит ли экономить на спичках?</em></h2>
<p>Сегодня мне наконец-то посчастливилось найти концы (в смысле, оригинал) статьи, которую публикуют многие блоггеры (в переводе на родной язык). Статья носит название «13 Тэгов, которые следует удалить из вашей темы» (с ней можно ознакомиться, например, <a href="http://wpnews.ru/13-tegov-kotoryie-sleduet-udalit-iz-vashey-temyi" rel="trackback external nofollow">здесь</a>).</p>
<p>В переводе меня смутило то, что автор, на мой взгляд, «экономил на спичках», вместо того, чтобы использовать что-либо стоящее, поэтому я решил обратиться к <a href="http://www.problogdesign.com/general-tips/13-tags-to-delete-from-your-theme/" rel="trackback external nofollow">оригиналу</a>, в надежде на то, что автор хоть как-нибудь обосновал свою точку зрения.<span id="more-188"></span></p>
<p>Приведу эти «тринадцать вещей», чтобы было понятно, о чем я говорю.</p>
<blockquote cite="http://wpnews.ru/13-tegov-kotoryie-sleduet-udalit-iz-vashey-temyi">
<ol>
<li><span class="codebox"><code class="php"><span class="kw2">&lt;?php</span> language_attributes<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></code></span> находится в header.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a>.</li>
<li><span class="codebox"><code class="php"><span class="kw2">&lt;?php</span> bloginfo<span class="br0">&#40;</span><span class="st_h">'html_type'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></code></span> находится в header.php.</li>
<li><span class="codebox"><code class="php"><span class="kw2">&lt;?php</span> bloginfo<span class="br0">&#40;</span><span class="st_h">'charset'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></code></span> находится в header.php.</li>
<li><span class="codebox"><code class="php"><span class="kw2">&lt;?php</span> bloginfo<span class="br0">&#40;</span><span class="st_h">'name'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></code></span> встречается в теме постоянно.</li>
<li><span class="codebox"><code class="php"><span class="sy0">&lt;</span>meta name<span class="sy0">=</span><span class="st0">&quot;generator&quot;</span> content<span class="sy0">=</span><span class="st0">&quot;WordPress &lt;?php bloginfo('version'); ?&gt;&quot;</span> <span class="sy0">/&gt;</span> <span class="sy0">&lt;!</span>–<span class="sy0">-</span> leave this <span class="kw1">for</span> stats <span class="sy0">-</span>–<span class="sy0">&gt;</span></code></span> находится в header.php.</li>
<li><span class="codebox"><code class="php"><span class="kw2">&lt;?php</span> bloginfo<span class="br0">&#40;</span><span class="st_h">'stylesheet_url'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></code></span> находится в header.php.</li>
<li><span class="codebox"><code class="php"><span class="kw2">&lt;?php</span> bloginfo<span class="br0">&#40;</span><span class="st_h">'rss2_url'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></code></span> находится в header.php, sidebar.php и footer.php. Будьте осторожны, если у вас включен FeedBurner. Не забывайте обновлять адреса фидов вручную (<a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> FeedSmith не сделает этого).</li>
<li><span class="codebox"><code class="php"><span class="kw2">&lt;?php</span> bloginfo<span class="br0">&#40;</span><span class="st_h">'pingback_url'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></code></span> находится в header.php.</li>
<li><span class="codebox"><code class="php"><span class="kw2">&lt;?php</span> bloginfo<span class="br0">&#40;</span><span class="st_h">'stylesheet_directory'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></code></span> встречается в теме постоянно.</li>
<li><span class="codebox"><code class="php"><span class="kw2">&lt;?php</span> bloginfo<span class="br0">&#40;</span><span class="st_h">'description'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></code></span> встречается в теме постоянно. Описание вашего сайта.</li>
<li><span class="codebox"><code class="php"><span class="kw2">&lt;?php</span> bloginfo<span class="br0">&#40;</span><span class="st_h">'comments_rss2_url'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></code></span> находится в sidebar.php и footer.php.</li>
<li><span class="codebox"><code class="php"><span class="sy0">&lt;!-</span>– <span class="kw2">&lt;?php</span> <span class="kw1">echo</span> get_num_queries<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span> queries<span class="sy0">.</span> <span class="kw2">&lt;?php</span> timer_stop<span class="br0">&#40;</span>1<span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span> seconds<span class="sy0">.</span> <span class="sy0">-</span>–<span class="sy0">&gt;</span></code></span> находится в footer.php. Этот HTML-комментарий многими из нас не используется, так что удаляйте!</li>
<li>Если вы используете виджеты, то можете удалить код из sidebar.php между строчками <span class="codebox"><code class="php"><span class="kw2">&lt;?php</span> <span class="coMULTI">/* Widgetized sidebar, if you have the plugin installed. */</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="sy0">!</span><span class="kw3">function_exists</span><span class="br0">&#40;</span><span class="st_h">'dynamic_sidebar'</span><span class="br0">&#41;</span> <span class="sy0">||</span> <span class="sy0">!</span>dynamic_sidebar<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="sy0">:</span> <span class="sy1">?&gt;</span></code></span> и <span class="codebox"><code class="php"><span class="kw2">&lt;?php</span> <span class="kw1">endif</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></code></span>.<br />
Контент между двумя этими строчками используется только тогда, когда виджеты отключены. Если вы уверены, что будете продолжать использовать виджеты, то можно выделить это как неиспользуемый код, а к строке можно оставить комментарий «Этот контент используется, если отключены виджеты», чтобы не забыть о назначении этого куска кода).</li>
</ol>
</blockquote>
<p>Как утверждает сам автор, <q cite="http://www.problogdesign.com/general-tips/13-tags-to-delete-from-your-theme/">&hellip;the theme uses PHP tags to get the information. However, it has to use these tags every time a page is loaded. As most of the information never changes, you can delete these tags from your theme, and replace them with normal text. That way, your server has less to process next time around.</q></p>
<p>Конечно, в логике отказать автору трудно: если заменить вызовы функций их результатом, то интерпретатору не придется вызывать эти функции, на чем, собственно, и происходит экономия. Однако, как показали замеры, выигрыш ничтожен — тысячные доли секунды (в среднем; при этом я тестировал на довольно слабом компьютере). Конечно, если блог посещает несколько сотен посетителей в секунду, то даже эти микросекунды могут хоть немного помочь. Но <strong>для среднестатистического блога такие оптимизации что слону дробина</strong>.</p>
<p>Пункты 12 и 13 что есть, что нет — лично я не смог заметить изменений.<br />
Пункт 5 — это, наверное, в целях безопасности. Хочу огорчить: версию <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> можно установить косвенно (хоть это и труднее).</p>
<p>Вызовы <span class="codebox"><code class="php">blog_info<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> и <span class="codebox"><code class="php">get_feed_link<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> сводятся (в конечном итоге) к <span class="codebox"><code class="php">get_option<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>. А <span class="codebox"><code class="php">get_option<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> достает требуемые значения из кэша — запрос к базе данных не производится.</p>
<p>Аргументация в комментариях сводится к тому, что интерпретатору придется выполнять меньше инструкций. Но в этом случае, на мой взгляд, оптимизацию нужно начинать не с темы.</p>
<p>Вообще, если не экономить на спичках, лучших результатов можно достигнуть, используя специальные плагины — Super Cache, <a href="http://blog.sjinks.pro/tag/hyper-cache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Hyper Cache">Hyper Cache</a> и подобные им. Вряд ли кто будет спорить, что статическая страница отдается быстрее, нежели динамическая при прочих равных условиях <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><strong>Не экономьте на спичках!</strong></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/188-re-13-tags-to-delete-from-your-theme/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/188-re-13-tags-to-delete-from-your-theme/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

