123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- Performance
- ###########
- Make your site run as smoothly and responsively as possible.
- .. contents:: Contents
- :local:
- :depth: 2
- Can Elgg scale to X million users?
- ==================================
- People often ask whether Elgg can scale to large installations.
- First, we might stop and ask, "where are you planning to get all those users?"
- Seriously, though, this is a really interesting problem.
- Making Elgg scale is, if anything, an issue of technical engineering.
- It's interesting but more or less a solved problem.
- Computer science doesn't work differently for Elgg than for Google, for example.
- Getting millions of users? That's like the Holy Grail of the entire tech industry.
- Second, as with most things in life, the answer is "it depends":
- * How active are your users?
- * What hardware is Elgg running on?
- * Are your plugins behaving well?
- `Improving the efficiency of the Elgg engine`__ is an ongoing project,
- although there are limits to the amount that any script can do.
- __ https://github.com/elgg/elgg/issues?labels=performance&state=open
- If you are serious about scalability you will probably want to look at a number of things yourself.
- Measure first
- =============
- There is no point in throwing resources at a problem if you don't know:
- * what the problem is
- * what resources the problem needs
- * where those resources are needed
- Invest in some kind of profiling to tell you where your bottleneck is,
- especially if you're considering throwing significant money at a problem.
- Tune MySQL
- ==========
- Elgg makes extensive use of the back end database, making many trips on each pageload.
- This is perfectly normal and a well configured database server will be able to cope with thousands of requests per second.
- Here are some configuration tips that might help:
- * Make sure that MySQL is configured to use an appropriate my.cnf for the size of your website.
- * Increase the amount of memory available to PHP and MySQL
- (you will have to increase the amount of memory available to the php process in any case)
- Enable caching
- ==============
- Generally, if a program is slow, that is because it is repeatedly performing an expensive computation or operation.
- Caching allows the system to avoid doing that work over and over again
- by using memory to store the results so that you can skip all the work on subsequent requests.
- Below we discuss several generally-available caching solutions relevant to Elgg.
- Simplecache
- -----------
- By default, views are cached in the Elgg data directory for a given period of time.
- This removes the need for a view to be regenerated on every page load.
- This can be disabled by setting ``$CONFIG->simplecache_enabled = false;``
- For best performance, make sure this value is set to ``true``.
- This does lead to artifacts during development if you are editing themes in your plugin
- as the cached version will be used in preference to the one provided by your plugin.
- The simple cache can be disabled via the administration menu.
- It is recommended that you do this on your development platform if you are writing Elgg plugins.
- This cache is automatically flushed when a plugin is enabled, disabled or reordered,
- or when upgrade.php is executed.
- System cache
- ------------
- The location of views are cached so that they do not have to be
- discovered (profiling indicated that page load took a non-linear amount
- of time the more plugins were enabled due to view discovery).
- Elgg also caches information like the language mapping and class map.
- This can be disabled by setting ``$CONFIG->system_cache_enabled = false;``
- For best performance, make sure this value is set to ``true``.
- This is currently stored in files in your dataroot (although later
- versions of Elgg may use memcache). As with the simple cache it is
- flushed when a plugin is enabled, disabled or reordered, or when
- upgrade.php is executed.
- The system cache can be disabled via the administration menu, and it is
- recommended that you do this on your development platform if you are
- writing Elgg plugins.
- Database query cache
- --------------------
- For the lifetime of a given page's execution, a cache of all ``SELECT`` queries is kept.
- This means that for a given page load a given select query will only ever go out to the database once,
- even if it is executed multiple times. Any write to the database will flush this cache,
- so it is advised that on complicated pages you postpone database writes until
- the end of the page or use the ``execute_delayed_*`` functionality.
- This cache will be automatically cleared at the end of a page load.
- You may experience memory problems if you use the Elgg framework as a library in a PHP CLI script.
- This can be disabled by setting ``$CONFIG->db_disable_query_cache = true;``
- Etags and Expires headers
- -------------------------
- These technologies tell your users' browsers to cache static assets (CSS, JS, images) locally.
- Having these enabled greatly reduces server load and improves user-perceived performance.
- Use the `Firefox yslow plugin`__ or Chrome DevTools Audits
- to confirm which technologies are currently running on your site.
- If the static assets aren't being cached:
- * Verify that you have these extensions installed and enabled on your host
- * Update your .htaccess file, if you are upgrading from a previous version of Elgg
- * Enable Simplecache_, which turns select views into browser-cacheable assets
- __ https://addons.mozilla.org/en-us/firefox/addon/yslow/
- Memcache
- --------
- Memcache is a generic caching technology developed by Brad Fitzpatrick for LiveJournal.
- .. warning:: SUPPORT FOR MEMCACHE IS EXPERIMENTAL AND MAY BE CHANGED.
- Installation requirements:
- | `` * php5-memcache``
- | `` * memcached``
- Configuration:
- Uncomment and populate the following sections in settings.php
- .. code:: php
- $CONFIG->memcache = true;
-
- $CONFIG->memcache_servers = array (
- array('server1', 11211),
- array('server2', 11211)
- );
- Squid
- -----
- We have had good results by using `Squid`_ to cache images for us.
- .. _Squid: http://en.wikipedia.org/wiki/Squid_cache
- Bytecode caching
- ----------------
- There are numerous PHP code caches available on the market.
- These speed up your site by caching the compiled byte code from your
- script meaning that your server doesn't have to compile the PHP code
- each time it is executed.
- Hosting
- =======
- Don't expect to run a site catering for millions of users on a cheap shared host.
- You will need to have your own host hardware and access over the configuration,
- as well as lots of bandwidth and memory available.
- Memory, CPU and bandwidth
- -------------------------
- Due to the nature of caching, all caching solutions will require memory.
- It is a fairly cheap return to throw memory and CPU at the problem.
- On advanced hardware it is likely that bandwidth is going to be your bottleneck before the server itself.
- Ensure that your host can support the load you are suggesting.
- Configuration
- -------------
- Lastly, take a look at your configuration as there are a few gotchas that can catch people.
- For example, out of the box, Apache can handle quite a high load.
- However, most distros of Linux come with mysql configured for small sites.
- This can result in Apache processes getting stalled waiting to talk to one very overloaded MySQL process.
- Check for poorly-behaved plugins
- ================================
- Plugins can be programmed in a very naive way and this can cause your whole site to feel slow.
- Try disabling some plugins to see if that noticeably improves performance.
- Once you've found a likely offender, go to the original plugin author and report your findings.
- Use client-rendered HTML
- ========================
- We've found that at a certain point, much of the time spent on the server
- is simply building the HTML of the page with Elgg's views system.
- It's very difficult to cache the output of templates since they can generally take arbitrary inputs.
- Instead of trying to cache the HTML output of certain pages or views,
- the suggestion is to switch to an HTML-based templating system so that the user's browser can cache the templates themselves.
- Then have the user's computer do the work of generating the output by applying JSON data to those templates.
- This can be very effective, but has the downside of being significant extra development cost.
- The Elgg team is looking to integrate this strategy into Elgg directly,
- since it is so effective especially on pages with repeated or hidden content.
|