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:
- 384MB memory
- CentOS 5.6
- PHP 5.2.10
- MySQL 5.0.77
- Apache 2.2.3
- 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)
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:
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
memory_limit = 128M
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.