Optimizing Apache/PHP/MySQL for low memory use
System-wide resources
* Run services under inetd/xinetd - Services such as SSH, SMTP servers, FTP servers, and almost any other service can be spawned by inetd/xinetd. In this case they only use memory when they are actually being used.
* Reduce the number of ttys started in your /etc/inittab:
#comment out lines like this
1:2345:respawn:/sbin/getty 38400 tty1
#2:2345:respawn:/sbin/getty 38400 tty2
#3:2345:respawn:/sbin/getty 38400 tty3
With Xen you can access only one real tty (tty1). Additional ttys like tty2, tty3 and so on are a waste of resources.
* Use ash or dash instead of bash. Be cautious! These alternative shells can break some scripts. Test all your scripts with the new shell before starting using it instead of bash.
[edit] MySQL
* Tune MySQL to use less memory for cache. The best is to use the my-small.cnf sample config as /etc/my.cnf. Below is an example of what to put in /etc/my.cnf.
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
skip-locking
set-variable = key_buffer=16K
set-variable = max_allowed_packet=1M
set-variable = thread_stack=64K
set-variable = table_cache=4
set-variable = sort_buffer=64K
set-variable = net_buffer_length=2K
* MySQL uses 10MBs of RAM for InnoDB tables. Remove support for InnoDB tables if you do not use them. To remove support for InnoDB, put the following lines in /etc/my.cnf
[mysqld]
skip-innodb
[edit] Apache/PHP
* Tune Apache to only have a small number of spare children running. An example of the Apache configuration section:
StartServers 1
MinSpareServers 1
MaxSpareServers 5
ServerLimit 64
MaxClients 64
MaxRequestsPerChild 4000
Also, only load the modules you require. If you do do not use PHP, mod_perl, etc then do not install them.
* Install a PHP Cache such as Alternative PHP Cache. The PHP cache will store compiled PHP scripts so that they can be reused without the overhead of compiling and processing them for each request.