Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

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
  • Things done:

  • 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:

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.

share|improve this question
    
Linux 2.6 tends to not like no swap, especially the older versions. I'd add a 16MB or so swapfile to see if that helps. –  Ignacio Vazquez-Abrams May 11 '11 at 7:57

1 Answer 1

  1. Apache ir pretty memory intensive, mainly because with mpm_worker each client request gets it's own process and with mod_php each client process gets its own embedded PHP VM. Try reducing or disabling KeepAlive interval, which frees client processes faster (2 secs are more than enough for most use cases).
  2. 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.

  3. Replace Apache more lightweight web server, for example Nginx to reduce your memory usage. nginx + php installation on CentOS
  4. Reduce MySQLs query cache buffer sizes if you find that you still are out of memory. You can add skip-innodb to my.cnf to reduce memory usage if you are not using InnoDB storage engine.
  5. Find out what is hogging your memory (watch htop/top, read logs).
share|improve this answer
    
Thanks a lot for these comments! I already managed to enable swap but that's more just a safety net as things will undoubtedly get too slow when available memory hits 0. I'll also try to reduce KeepAlive. Replacing Apache will most likely not be an option. I'm quite sure Wordpress is more or less LAMP only. I can look into this option, but I smell trouble in that direction. –  Tommi Forsström May 11 '11 at 9:19
2  
"I'm quite sure Wordpress is more or less LAMP only". Let me enlighten you: WordPress.com runs on nginx, hosting 20 million blogs. ;-) Look here for more information: wiki.nginx.org/Wordpress –  Henk May 11 '11 at 10:19
    
Consider me enlightened! I'll run a few tests and see if we can be #20,000,001! –  Tommi Forsström May 11 '11 at 10:27
    
You are already serving static content from another server, so switching to Nginx doesn't free memory. Apache+mod_php is faster and uses less memory to process PHP than Nginx+PHP-FPM. You can disable Keep-alive completely since visitors will only request one page and no static content. Disable all Apache modules you don't use and have a look at caching dynamic pages. –  i.amniels May 11 '11 at 10:46
    
The thing is, I'm not running all static content from the external server as all article images are served from the same Apache. The reason for this is that I generate (and cache) resized images in runtime, so moving these resources to an external server would be quite an error-prone task. So losing keep-alive would most likely be a bad idea. –  Tommi Forsström May 11 '11 at 11:00

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.