Server Tuning & Performance Tips

There are a number of options to tune the ownCloud installation and enable a higher level of performance. This chapter gives a few hands-on tips on configuring your database, and LAMP stack to improve performance. This chapter is community-maintained and unsupported; test these tips carefully before deploying them on production servers.

If you wish to add tips to this page, please put them in the relevant section. If there isn’t an appropriate section then start a new one.

PHP Version and Information

You will need to know your PHP version and configurations. To do this, create a plain-text file named phpinfo.php and place it in your Web root, for example /var/www/html/phpinfo.php. (Your Web root may be in a different location; your Linux distribution documentation will tell you where.) This file contains just this line:

<?php phpinfo(); ?>

Open this file in a Web browser by pointing your browser to localhost/phpinfo.php:

../_images/phpinfo.png

Your PHP version is at the top, and the rest of the page contains abundant system information such as active modules, active .ini files, and much more. When you are finished reviewing your information you must delete phpinfo.php, or move it outside of your Web directory, because it is a security risk to expose such sensitive data.

ownCloud Server Tuning

Serving static files via web server

See Serving Static Files for Better Performance for a description and the benefits.

Using cron to perform background jobs

See Defining Background Jobs for a description and the benefits.

Enable JavaScript and CSS Asset Management

See JavaScript and CSS Asset Management for a description and the benefits.

Webserver Tips

PHP safe mode

PHP safe mode has to be turned off. It is deprecated and has been removed in newer PHP versions. Verify its status with phpinfo, and look for safe_mode on/off. If it is on, then add this line to php.ini to turn it off:

safe_mode = Off

Raise max_file_uploads of PHP

The PHP setting max_file_uploads within the php.ini defaults to 20 on most environments which allows that number of simultaneous uploads. Currently the ownCloud sync client is doing 3 parallel uploads which means that at least 6 clients can upload files simultaneously. Depending on your server usage it is recommended to raise this number to a higher value.

Enable the SPDY / http_v2 protocol

Your webserver can be configured to use the SPDY / http_v2 protocol which could improve the overall performance of ownCloud. Please have a look at the documentation of your webservers module for more information:

Webserver Module Name / Link
Apache mod-spdy
nginx (<1.9.5) ngx_http_spdy_module
nginx (+1.9.5) ngx_http_http2_module

Note

If you want to enable SPDY for Apache please note the Known Issues of this module to avoid problems after enabling it.

Note

If you want to use http_v2 for nginx you have to check two things:

1.) be aware that this module is not built in by default due to a dependency to the openssl version used on your system. It will be enabled with the --with-http_v2_module configuration parameter during compilation. The dependency should be checked automatically. You can check the presence of http_v2 with nginx -V 2>&1 | grep http_v2 -o. An example how to compile nginx can be found in section “Configure Nginx with the nginx-cache-purge module” below.

2.) When you have used SPDY before, the nginx config has to be changed from listen 443 ssl spdy; to listen 443 ssl http2;

Apache Tuning

Maximum number of Apache processes

An Apache process uses around 12MB of RAM. Apache should be configured so that the maximum number of HTTPD processes times 12MB is lower than the amount of RAM. Otherwise the system begins to swap and the performance goes down.

KeepAlive should be configured with sensible defaults

The KeepAlive directive enables persistent HTTP connections, allowing multiple requests to be sent over the same TCP connection. This reduces latency by as much as 50%. Especially in combination with the periodic checks of the sync client the following settings are recommended:

KeepAlive On
KeepAliveTimeout 100
MaxKeepAliveRequests 200

mod_gzip

mod_gzip should be used because it speeds up the transfer of data and helps to free server memory, and HTTP connections are closed faster.

MPM

Apache prefork has to be used. Don’t use threaded mpm with mod_php because PHP is currently not thread safe.

Hostname Lookups

# cat /etc/httpd/conf/httpd.conf
...
HostnameLookups off

Log files

Log files should be switched off for maximum performance.

Comment out the CustomLog directive. Keep ErrorLog to be able to track down errors.

Other performance improvements

See http://wiki.postgresql.org/wiki/Performance_Optimization

Oracle Database

Usage scenario: Existing enterprise installations. Only core apps are supported and tested. Not recommended because it involves compiling the oci8

Other performance improvements

http://de.slideshare.net/cjorcl/best-practices-php-and-the-oracle-database and ask your DBA.

Problems

When ORA-56600 occurs (Oracle Bug 8467564) set this php.ini setting: oci8.statement_cache_size=1000, see oracle forum discussion

SSL / Encryption App

SSL (HTTPS) and file encryption/decryption can be offloaded to a processor’s AES-NI extension. This can both speed up these operations while lowering processing overhead. This requires a processor with the AES-NI instruction set.

Here are some examples how to check if your CPU / environment supports the AES-NI extension:

  • For each CPU core present: grep flags /proc/cpuinfo or as a summary for all cores: grep -m 1 ^flags /proc/cpuinfo If the result contains any aes, the extension is present.
  • Search eg. on the Intel web if the processor used supports the extension Intel Processor Feature Filter You may set a filter by "AES New Instructions" to get a reduced result set.
  • For versions of openssl >= 1.0.1, AES-NI does not work via an engine and will not show up in the openssl engine command. It is active by default on the supported hardware. You can check the openssl version via openssl version -a
  • If your processor supports AES-NI but it does not show up eg via grep or coreinfo, it is maybe disabled in the BIOS.
  • If your environment runs virtualized, check the virtualization vendor for support.