• Donncha or whoever is listening, I have a few questions. I am running a multisite, multi-database WordPress Network with hundreds of blogs on a MediaTemple DV server (a VPS with 512mb RAM, PHP 5, on CentOS 5). I have successfully installed WP Super Cache and Memcached (and its associated PHP extension and WordPress plugin).

    Upon studying the uses of Memcached and similar tools, I successfully installed APC. My reasoning: let Memcached foot the object caching, and let APC foot the opcode caching.

    I’m going to think out loud here for a second, and then I’ll get to my questions:

    Memcached is useful because it excels in multiserver setups, which is where you need to balance server load in a distributed environment and avoid unnecessarily duplicating cached objects across the server network.

    But APC, while it can do object caching, can’t distribute caching across more than one server — that’s APC’s “weakness”. But APC’s strength: in single-server setups, it is demonstrably quicker than Memcached in object caching. Additionally, APC provides *opcode caching*.

    Now for my questions:

    Can APC opcode caching improve the speed of the WordPress backend?

    If so, does it begin to do so automatically once it is installed and enabled in PHP as an extension, or does APC need to be called from a WordPress plugin in order to opcode cache WordPress’ PHP?

    For single-server WordPress multisite installations, am I better off getting rid of Memcached and relying on APC both for opcode caching *and* object caching, and thus keep it all to one process? If so, is WP Super Cache able to make the most of APC, supposing I have an APC WordPress plugin, as it does with Memcached and it’s associated WordPress plugin?

    My network has a team of web designers building sites on it. Currently, they are all using a single Super Admin user login for all their activity. As far as you know, would I see any increase in speed in the WordPress backend if I have each web designer create and use his/her own Super Admin user, rather than this practice of having a single user entity performing multiple simultaneous activities?

    As we speak, Memcached and APC are coexisting on my single-server setup, but I’m still pushing the limits of available RAM due to server load from my WordPress backend, so I’m really trying to figure out the best way to pimp this server short of upgrading to more RAM. My frontend is fast enough; it’s my backend where I’m seeing all my server load issues.

    http://wordpress.org/extend/plugins/wp-super-cache/

Viewing 15 replies - 1 through 15 (of 17 total)
  • If you’re going to use a multi server setup you should probably use Batcache. I’ve had more luck with xcache rather than APC but it seems to be random as other people have better luck with APC!

    There’s no correct answer here. xcache or APC is useful as an opcache but as you point out can be an object cache too. Memcached can be an object cache storage as well but of course you have a separate process to take care of.

    Supercache has very basic support for using an object cache to store cached files but it’s very coarse – changes are made by invalidating the whole cache. File based caching is a lot more mature.

    Donncha: from what I’m reading about Batcache, it looks like the cache does not refresh upon a post change/update, but only on an expiration date. Is that correct?

    Hubert — If the Batcache plugin (note, different from the caching engine) is installed, then posts are force-flushed on post update.

    Mark, thanks for the info. I found this http://wordpress.org/extend/plugins/batcache/, but you’re the first person who differentiates between the plugin and the caching engine. I haven’t tried it yet, but I assumed that the caching engine and the plugin were one and the same – looks like a good WE project

    Thread Starter davegregg

    (@davegregg)

    Hubert, my understanding is that WP caching plugins, like Batcache, may be used to supplement some server-installed caching engine (like APC). On its own, a server app like APC would do caching, but would only know to refresh the cache on a schedule, which is why an associated plugin in WordPress is useful: the plugin tells the server caching app to refresh on content updates, like new posts. Some WordPress caching plugins are able to communicate with server caching apps, some aren’t. Some WP caching plugins are capable of using alternative or additional methods of caching (or otherwise improving your site’s speed) in addition to their server-caching extensibility, and some aren’t capable of doing so.

    Someone correct me if my understanding is inaccurate.

    Someone correct me if my understanding is inaccurate.

    APC (or X-Cache) does what is called as PHP opcode caching. Normally, PHP reads the .php files and “compiles” them on the fly. Every time. That is obviously not super efficient. APC and X-Cache store that “compiled” opcode and hang on to it, which gives you a nice PHP speed boost.

    APC also provides a single-server in-memory object cache. Key/value store. That doesn’t automatically give you anything in WordPress. For that, you need an APC object cache backend, which is a drop-in file called object-cache.php that WordPress will use to interface with APC. Now WordPress just uses this for its object storage… not for HTML output caching. For that, you’d need something like Batcache, which can use the Memcached or APC object cache backends to do persistent HTML output caching. Batcache is another drop-in file called advanced-cache.php, which WordPress utilizes to do an early “hand off” (so the caching can happen before WordPress fully loads).

    But Batcache by itself does not tell posts to refresh when they’re changed. For that, you need the Batcache plugin, which tells Batcache (the advanced cache drop-in) to tell the APC object cache backend to tell the APC persistent cache to flush that page out.

    1. Opcode caching (APC or X-Cache) — speeds up PHP in general.
    2. Object cache backend drop-in (for APC or Memcached) — gives WordPress persistent storage for objects.
    3. Batcache (advanced caching drop-in) — caches HTML using the WordPress object cache (#2).
    4. Batcache helper plugin — helps Batcache (#3) tell the object cache backend (#2) to flush things when posts change.

    Thread Starter davegregg

    (@davegregg)

    Ahhhhh! So, so helpful Mark. Thanks for the clarification. Understanding that has been a long time coming. 😀

    Thank you Mark too, but for full picture – what about WP plugins: WP-Super-Cache (as I understand, its alternate of Batcache), APC Object Cache Backend, Memcached Object Cache? Is there any place for them in harness above? Or there exist substitutes?

    Thread Starter davegregg

    (@davegregg)

    So do I have an incomplete or redundant caching setup right now?
    I have…
    – WP Super Cache
    – Memcached + Memcached PECL extension for PHP + Ryan’s Memcached backend plugin for WordPress
    – APC
    – CloudFlare free

    Also, is the APC Object Cache backend plugin compatible with the Memcached one? And if you have APC installed (extending your PHP) for use with WP Super Cache, is there really any need to install Memcached, it’s PHP extension, and it’s WP backend plugin at all?

    davegregg, in some ways CloudFlare and WP-Supercache do something similar: caching static pages. That said, if you get hit by a lot of long tail traffic, it would be worth using database caching with APC (single server) or Memcached (multiple front-end servers) so that pages can be built faster before being offloaded to CloudFlare.

    Can you guys give me a dummied-down version of what I should be using for best performance on shared hosting (godaddy)? I’m currently using the Quick Cache plugin and enabling gzip with the following .htaccess code:

    <FilesMatch ".(js|css|html|htm|php|xml)$">
    SetOutputFilter DEFLATE
    </FilesMatch>

    I’m a novice at .htaccess mods but I got this code from dozens of searches – it seemed to be the most commonly used code. Results are really good; pages load much faster, which I can verify with Quick Cache (results at the bottom of html source output) and test tools like http://www.gidnetwork.com/tools/gzip-test.php and http://ismyblogworking.com/ show a 78% compression with gzip.

    Do I leave well enough alone or could I still have an issue if I get a spike in traffic?

    Thanks!

    ATDBlog, when using GZIP, you typically trade bandwidth for CPU. The bandwidth savings mainly goes towards a better experience (through faster page load) for your users, but it doesn’t really help you (on ther server side) that much in terms of performance. Actually GZIP can consume much more CPU on your server, and that could get you in trouble with a shared host.

    If you get enough traffic, and assuming that you are already using a cache like WP Supercache, Apache (or whichever web server) may not be able to serve the content (pages, images) fast enough, so requests will pile up and things will eventually grind to a halt.

    I believe that the lowest hanging fruit is to use a CDN, which basically outsources all the static requests (themes and uploads) to another server. That in turns frees Apache from serving those static files which can represent 50% to 90% of HTTP requests. “Origin-pull” is the simple way to setup a CDN, and all you need to do is refer to the static content through a new URL like cdn.mysite.com, which will pull the original content from http://www.mysite.com and cache it there for a while (I use 1 week for images).

    WP-SuperCache will help with the CDN support, in addition to caching pages as static files on your disk.

    If you get enough traffic so that even with Apache can’t serve just the static cached pages, you will need to turn to solutions like scaling up by using a bigger server, or scaling horizontally by adding more servers. This is much more complex.

    At the end of the day, shared hosting can only do so much, and if you have even a small VPS, you could have a more exotic solution like Varnish, that would take care of the traffic spikes to a limited number of pages. If you get organic traffic on thousands or tens of thousands of pages, caching can only help you so much.

    Also, if you site isn’t very dynamic, you may also consider caching the whole site (page + images) behind a CDN. It’s not always convenient, but it’s much easier than adding multiple servers. Keep in mind that if users press F5 in the browser (Refresh), the CDN will most likely go back to the origin server.

    Hope this helps.

    What are the best free options/plugins? I’m broke!

    I’m using the Quick Cache plugin (http://wordpress.org/extend/plugins/quick-cache/) because it was rated higher than W3 Super Cache. Is there a difference? There’s some dynamic content where I use rotating code to serve up new images on refresh. That’s basically disabled now for an hour, which is the default cache setting. Otherwise, Quick Cache updates the cache with each new blog post and doesn’t cache for members or new commenters.

    Btw: Sites like ismyblogworking.com downgraded my site because I wasn’t using gzip, but now its all happy green check marks. But its not a good thing because of cpu, eh?

    I wonder about traffic spikes because its a political site and when a story is picked-up by a high traffic site, I can get tens of thousands of visitors in an hour. But that’s not normal.

    I don’t have much experience with QuickCache but from the looks of it, it runs on a similar principle than WP-SuperCache. Both are free.

    As for GZIP, it’s just good to be aware that it can add stress to the CPU of the server, which may be a problem if you use shared hosting. This may not be a problem if you don’t have a lot of pages, so they may be generated only once and cached for a while (how many pages do you have?)

    Fortunately, traffic spikes tend to focus on a single page, so those static page caching plug-ins should very much help. If one of them can use mod_rewrite to serve the cached pages (WPSC does), PHP won’t even have to be invoked, and that saves more CPU.

    If you’re broke, and are using shared hosting, I’m not sure what else can be done.

    Finally, remember that most of the pageload performance look at your site from a user’s perspective, so sure, they’ll ask for GZIp etc… As the site administrator, you also have to make sure that the pages can be built and served. It’s better to have a page that goes from 7KB to 21KB without GZIP — than no page at all because you ran out of CPU

    Mind if I ask you one more question?

    What’s the difference between these two blocks of code? Both give me the same compression results according to those test sites I mentioned. Godaddy has mod_rewrite and recommends the second code block in their support pages.

    <FilesMatch ".(js|css|html|htm|php|xml)$">
    SetOutputFilter DEFLATE
    </FilesMatch>
    <IfModule mod_deflate.c>
     AddOutputFilterByType DEFLATE text/html text/xml text/css text/plain
     AddOutputFilterByType DEFLATE image/svg+xml application/xhtml+xml application/xml
     AddOutputFilterByType DEFLATE application/rdf+xml application/rss+xml application/atom+xml
     AddOutputFilterByType DEFLATE text/javascript application/javascript application/x-javascript
     AddOutputFilterByType DEFLATE application/x-font-ttf application/x-font-otf
     AddOutputFilterByType DEFLATE font/truetype font/opentype
    </IfModule>
Viewing 15 replies - 1 through 15 (of 17 total)
  • The topic ‘WP Super Cache and APC’ is closed to new replies.