First of all, I have to say I am not an expert in server administration. I have done web programming for 10+ years on several platforms, but have most of the time come to a readymade situation where there's IT professionals or a good web hosting company involved.
Now I'm finally in a spot where I was required to build a LAMP-setup from scratch (with just a vanilla CentOS install) to serve a pretty intense Wordpress setup.
Everything kinda went smoothly as I have been around the block with Linux-based server administration to get things running, but I'm getting really weird system freezes a few times per week and since I'm the only one who can access the server and boot up services, this is REALLY annoying.
Here's some key data:
Server
- 384MB memory
- CentOS 5.6
- PHP 5.2.10
- MySQL 5.0.77
- Apache 2.2.3
Usage
- ca. 300 articles in Wordpress
- ca. 10k weekly unique users
- ca. 100k monthly pageviews
- All static stuff (jquery, styles, layout images) are server from an external webserver.
- Wordpress cached as heavily as possible (W3 Total Cache)
Things done:
I've narrowed the problem down to memory management - or the lack thereof. For some reason swapping is disabled on the server and once the memory consumption reaches 100% the server simply goes into thrashing and all hope is lost. The amount of memory (384MB) should still be more than enough to host a site with these stats, so something is done wrong. I'm just running out of ideas what it could be.
I've obviously tried tweaking the settings in my.cnf, php.ini and httpd.conf but to no avail. Here's my key settings at the moment:
my.cnf
skip-innodb
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip-locking
skip-ndbcluster
skip-bdb
skip-networking
safe-show-database
query_cache_limit=8M
query_cache_size=48M
query_cache_type=1
max_user_connections=200
max_connections=32
interactive_timeout=60
wait_timeout=60
connect_timeout=50
thread_cache_size=4
key_buffer= 96M
join_buffer=1M
max_connect_errors=20
max_allowed_packet=32M
table_cache=1024
record_buffer=1M
sort_buffer_size=6M
read_buffer_size=6M
read_rnd_buffer_size=6M
thread_concurrency=4
myisam_sort_buffer_size=32M
server-id=1
user=mysql
tmp_table_size=64M
max_heap_table_size=48M
php.ini
memory_limit = 128M
httpd.conf
StartServers 2
MinSpareServers 3
MaxSpareServers 5
ServerLimit 16
MaxClients 16
MaxRequestsPerChild 1000
This is the part where it might be very self evident I'm flying by the seat of my pants here. Are these settings even remotely sensible for a 384MB server setup? What else can be done to reduce the number of crashes where the only solution is me logging in to restart mysqld and httpd?
I know all this is more or less been discussed a million times before and trust me, I've gone through all the threads I've found from Server Fault, tried all the tips and pointers, but to no avail.
The silly thing is that we moved from a pretty reliable web hosting setup to this way more costly virtual server setup to cut down on worries on server stability and scaling, but it has in fact made things even worse and no doubt 99% due to my own shortcomings as an admin!
So please, gurus, help me out a bit. I promise I'll never bitch to an IT guy about anything and will write only code that's easy to deploy, won't crash in the middle of the night and generally remember you in a positive way on other days in addition to Sysadmin Day.
If you have no swap partition you can still setup swap file like this
dd if=/dev/zero of=/swapfile1 bs=1024 count=524288
mkswap /swapfile1
swapon /swapfile1
echo "/swapfile1 swap swap defaults 0 0" >> /etc/fstab
Web server swapping will still have degraded perfomance, but It will not grind to halt.