/
PERFORMANCE
231 lines (166 loc) · 9.33 KB
/
PERFORMANCE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
===================================
Horde Groupware Performance Guide
===================================
:Contact: horde@lists.horde.org
.. contents:: Contents
Some tips on performance tuning systems for Horde Groupware. This does not
cover hardware tuning or even low level system (network, filesystem, etc)
tuning.
Don't apply the following tuning hints blindly. Test your applications before
and after the changes under the conditions that are important for you. For
some people it's more important to make them as fast as possible for a small
user base, others require the applications to scale well under a high load.
Some of these hints might even make the applications slower under certain
conditions or using a certain hardware.
Linux Tuning
============
* Recompile RPMS for your architecture (e.g. i586, i686, athlon, etc).
This applies most to your Apache, PHP, IMAP, and POP3 packages.
Webserver/PHP tuning
====================
* Consider a PHP accelerator program. See for example `The Zend Performance
Suite`_, the `Alternative PHP Cache`_, eAccelerator_, or XCache_. These
accelerators speed up access by caching the compiled PHP code, eliminating
the need to recompile the code for every single page load. **This is probably
the easiest way to improve the performance of Horde Groupware**. See
Autoloading_ further down to get even more out of some of those accelerators.
* Enable PHP output compression in the Horde configuration. Do not enable
compression in the PHP configuration (i.e. in ``php.ini``), because certain
scripts don't work well with compression and Horde Groupware takes care of
disabling compression conditionally.
* Keep the include path defined in ``php.ini`` as short as possible, with the
most frequently used library paths first. You don't need to include the
local directory ``.`` because Horde Groupware always uses full paths instead
of relative paths.
* Use an optimized ``php.ini``: start with ``php.ini-recommended`` in your PHP
dsitribution.
* Don't run PHP session garbage collection too often if using a slow storage
medium (like SQL). (See ``session.gc_probability`` in ``php.ini``)
* If you have a large number of sessions and are using PHP's default file
based session handler, consider storing them in hashed directory levels.
(See ``session.save_path`` at http://www.php.net/session)
* Consider using a faster storage medium for sessions, such as a tmpfs
(if storing sessions locally) or memcache (for storing session information
that can be accessed by multiple servers).
* Only load as many Apache and PHP extensions as needed (to reduce memory
usage).
* Use statically compiled Apache modules, including the PHP module.
* Use compiler optimizations (--prefer-non-pic, -O3, -march -mcpu, -msse,
-mmmx, -mfpmath=sse, etc.)
* If using SSL with a large site, consider a hardware SSL accelerator.
* Use shared memory for the Apache SSL cache if possible.
* To improve caching of static content if accessing Apache SSL with Internet
Explorer, try setting longer expiration periods::
ExpiresActive On
ExpiresByType image/png "now plus 1 month"
ExpiresByType image/gif "now plus 1 month"
ExpiresByType text/javascript "now plus 1 month"
ExpiresByType application/x-javascript "now plus 1 month"
ExpiresByType text/css "now plus 1 month"
.. Note:: You must compile the ``mod_expires`` extension into Apache in
order to use these directives.
.. Warning:: This might cause problems if you upgrade Horde Groupware and the
users' browsers still use the old file versions.
* Disable DNS lookups in your Apache logging, or use a caching DNS server on
the web server host.
Horde itself will run DNS queries too, so make sure your DNS resolution works
correctly and fast.
* Enable Apache keepalives.
* You can configure Horde to serve all images, style sheets and/or static
javascript files from a different server. This could be a very lightweight
server without PHP (and other CGI modules) builtin. If using SSL to serve
all pages, the images/js server will also have to serve SSL content or else
browsers will complain about non-secure content in a secure page. Since this
server does not need to handle dynamic content, it would be wise to use a
high-performance server with low memory and/or system resource requirements
(this `IBM Article`_ can provide further information). You need to set
the ``themesuri`` and/or ``jsuri`` parameters in ``config/registry.php`` for
all applications and copy all ``themes`` and/or ``js`` directories in the
same directory layout to the other server.
* Your webserver should use Expires headers to make sure static content can
be cached on the user's browser. For example, to make lighttpd set an
expiration date on all graphics, javascript files, and stylesheets, add
the following to ``lighttpd.conf``::
$HTTP["url"] =~ "\.(jpg|gif|png|js|css)$" {
expire.url = ( "" => "access 1 months" )
}
* Enable caching in Horde Groupware. Several applications make heavy use of
caching and, if enabled, you will see a significant increase in performance.
* Enable caching/compression of javascript and CSS. See `Yahoo's Analysis`_
which concludes that "[r]educing the number of HTTP requests has the biggest
impact on reducing response time". Caching via filesystem is HIGHLY
RECOMMENDED: it is also the only way of caching that reliably works on all
browsers. Caching can also be done via horde caching, but the
cache-busters used to generate unique URLs when the cached content changes
do not work 100% reliably across all browsers.
* It is highly recommended to install the lzf PECL module to activate
compression for certain Horde data (especially in IMP). lzf is a tiny
module that does real-time compression. The lzf documentation states that on
modern CPUs, compression is as fast as an (unoptimized) memcpy action, making
the compression essentially 'free' when compared to uncompressed data.
lzf can be installed via PECL (see INSTALL).
.. _`The Zend Performance Suite`: http://www.zend.com/horde.php
.. _`Alternative PHP Cache`: http://www.php.net/apc
.. _eAccelerator: http://eaccelerator.net/
.. _XCache: http://xcache.lighttpd.net/
.. _`IBM Article`: http://www.ibm.com/developerworks/web/library/wa-ltwebserv/
.. _`Yahoo's Analysis`: http://yuiblog.com/blog/2006/11/28/performance-research-part-1/
Sending Mail
============
* Generally using a local sendmail command to send mail will result in better
peformance than using a SMTP connection.
* Some MTA servers may be faster or more efficient than others. Consider
switching to a faster format if needed.
PostgreSQL tuning
=================
* Do a ``VACUUM`` command periodically to tune your database.
* Increase ``shared_buffers`` and ``sort_mem`` memory settings.
* If web server and database is on the same unix host, use unix sockets
instead of network connections for database access.
MySQL tuning
============
* If web server and database is on the same unix host, use unix sockets
instead of network connections for database access.
* Enable mysql query cache if you have sufficient RAM. Edit your ``my.cnf``
file and add the following to the ``[mysqld]`` section (change the memory
size to meet your needs)::
set-variable = query_cache_size=128M
Horde tuning
============
Autoloading
-----------
* Horde Groupware automatically loads PHP source files on demand which relies
on the PHP autoloading feature introduced with PHP 5 and the Horde Autoloader
library. Both allow to limit the set of source code files pulled into the
system to the minimal amount required to answer the current request. This
saves memory and time but at the same time the Autoloader library has to map
each class name to the path of the corresponding PHP file that holds the
class definition. This procedure is expensive and can slow the system down.
Fortunately the mapping is fixed unless files are added or removed which
usually only happens during an upgrade.
Thus Autoloading is amenable to caching and an easy way to improve the
performance of the Horde Autoloader library, is to install the Autoloader
Cache extension::
pear install horde/horde_autoloader_cache
This library is not installed by default because it will unconditionally use
any of the following cache backends and does not allow for any further
configuration: `Alternative PHP Cache`_, XCache_, eAccelerator_, or the local
temporary filesystem.
It also doesn't detect the rare case when the file paths of any PHP class in
Horde changes. In this case you either need to use the provided script to
empty the cache::
horde-autoloader-cache-prune
or empty the cache manually, e.g. by restarting the web server or deleting
the cache file from the temporary directory.
VFS
---
* Try to avoid using a SQL backend for VFS. Many databases require binary data
to be heavily escaped, resulting in storage sizes that are many times
greater than the actual size of the data. File system VFS will normally
provide much improved performance.
Application tuning
==================
* Some applications contain advanced features that might have a certain impact
on the performance. These features can usually be turned off in the
application's configuration and are explicitly described as being a
performance hit in the configuration web frontend.