Thursday, October 29, 2015

mysql - LAMP memory management (CentOS)

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, 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.

No comments:

Post a Comment

linux - How to SSH to ec2 instance in VPC private subnet via NAT server

I have created a VPC in aws with a public subnet and a private subnet. The private subnet does not have direct access to external network. S...