How to optimize the php process memory usage?
I'll summarize what Lisa did to find the problem:
- Check the memory layout of a single PHP process with
pmap -d <pid>
. The output showed that there's a huge amount of shared memory used by the process:
00002b3772850000 2097152 rw-s- 0000000000000000 000:00009 [ shmid=0x2d1b803a ]
- Examine the shared memory regions with
ipcs -m
. It showed that there are a lot of shared memory regions created by user nobody (the web server), here are just a few of them:
0x00000000 117964807 nobody 600 2147483648 1 dest 0x00000000 117997576 nobody 600 2147483648 1 dest 0x00000000 118030345 nobody 600 2147483648 1 dest0x00000000 118063114 nobody 600 2147483648 1 dest
- Disable eAccelerator in php.ini and remove the created shared memory regions:
for i in `ipcs -m | cut -d' ' -f2 | grep '^[0-9]'`; do ipcrm -m $i; done
Rasmus Lerdorf did a conference about PHP performance at Confoo in 2010 and he used a Wordpress blog as an example, this should give you great tools to answer your question:
http://talks.php.net/show/confoo10/1
To sum up:
- Run a
phpinfo()
and disable PHP extensions that you don't use. They can take a lot of memory (imagick, curl, ...) - Generate a graph of your includes using the inclued.so extension. You might load useless functions in your wordpress setup.
- Run benchmarks with
siege
. Sometimes, tiny optimisations have great impact on performance, so make sure you have metrics, to help you make your decisions. - Use callgrind to show where you're loosing performance. In one of my project I was using
md5()
to hash my SQL queries and cache them. Themd5()
calls where using 20% of the CPU time.
I would definitely start by disabling PHP extensions if possible.