Раньше у меня был VPS (512 МБ) от Linode, и я работал nginx + php5-fpm
(который поставляется с php5.3.3) в Debian Lenny (i686). Общее использование памяти было около 90–100 МБ.
Теперь у меня есть другой VPS (другая хостинговая компания), и я тоже запускаю nginx + php5-fpm
в Debian Lenny (x86_64). Система 64-битная, поэтому использование памяти теперь выше, примерно 210-230 МБ, что я считаю слишком большим.
Вот мой php5-fpm.conf:
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 300
Это то что top
команда говорит мне:
top - 15:36:58 up 3 days, 16:05, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 209 total, 1 running, 208 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 99.9%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 532288k total, 469628k used, 62660k free, 28760k buffers
Swap: 1048568k total, 408k used, 1048160k free, 210060k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
22806 www-data 20 0 178m 67m 31m S 1 13.1 0:05.02 php5-fpm
8980 mysql 20 0 241m 55m 7384 S 0 10.6 2:42.42 mysqld
22807 www-data 20 0 162m 43m 22m S 0 8.3 0:04.84 php5-fpm
22808 www-data 20 0 160m 41m 23m S 0 8.0 0:04.68 php5-fpm
25102 www-data 20 0 151m 30m 21m S 0 5.9 0:00.80 php5-fpm
10849 root 20 0 44100 8352 1808 S 0 1.6 0:03.16 munin-node
22805 root 20 0 145m 4712 1472 S 0 0.9 0:00.16 php5-fpm
21859 root 20 0 66168 3248 2540 S 1 0.6 0:00.02 sshd
21863 root 20 0 66028 3188 2548 S 0 0.6 0:00.06 sshd
3956 www-data 20 0 31756 3052 928 S 0 0.6 0:06.42 nginx
3954 www-data 20 0 31712 3036 928 S 0 0.6 0:06.74 nginx
3951 www-data 20 0 31712 3008 928 S 0 0.6 0:06.42 nginx
3957 www-data 20 0 31688 2992 928 S 0 0.6 0:06.56 nginx
3950 www-data 20 0 31676 2980 928 S 0 0.6 0:06.72 nginx
3955 www-data 20 0 31552 2896 928 S 0 0.5 0:06.56 nginx
3953 www-data 20 0 31552 2888 928 S 0 0.5 0:06.42 nginx
3952 www-data 20 0 31544 2880 928 S 0 0.5 0:06.60 nginx
Итак, вопрос, есть ли способ использовать Меньше объем памяти? Кстати, у меня 16 ядер и было бы неплохо их использовать ...
С небольшим объемом оперативной памяти ваш VPS будет обмениваться местами задолго до того, как вы будете использовать все ядра - просто забудьте об этом: запустите 1 рабочий процесс nginx - он сможет обрабатывать НАМНОГО больше запросов, чем вам нужно.
Поскольку вы, скорее всего, запускаете PHP из дистрибутива Lenny, в него скомпилировано очень много всего. Перекомпиляция PHP сэкономит вам немного оперативной памяти. Таким образом, не будут загружаться ненужные вам расширения - проверьте в php.ini, что загружается.
PHP-FPM отправляет запросы из очереди рабочим (циклический перебор), поэтому вы можете уменьшить количество дочерних процессов до 3-4, если вам нужно - если будет больше запросов, они просто будут ждать своей очереди.
Проверьте, какие службы вы используете и действительно ли они вам нужны. Установка по умолчанию включает в себя много чего
Если у вас запущен saslauthd, и вы хотите, чтобы он работал, обязательно добавьте задание cron, которое будет перезапускать его ежедневно - у него уже много лет происходит неприятная утечка памяти, и я видел, как он раздувается до 1,5 ГБ примерно за два недель на одном из моих ящиков.
Вы можете уменьшить количество серверов php-fpm или уменьшить объем памяти, который может использовать php.
"x" - это объем памяти, который вы можете разрешить использовать php / fpm, затем разделите x на объем памяти, который может когда-либо понадобиться каждому скрипту php (memory_limit), и у вас будет количество "серверов" php-fpm (не включая любой кеш-код операции или накладные расходы от php-fpm).
Например: если вы можете позволить ему использовать максимум 256 МБ, а каждый скрипт ограничен 64 МБ, тогда «256/64 = 4» сервера php-fpm.
Я предполагаю, что потратить несколько дополнительных долларов на дополнительную память стоит каждого пенни.
Ссылки: http://www.php.net/manual/en/ini.core.php#ini.memory-limit
Я не уверен на 100% по поводу уменьшения использования памяти для php5-fpm, однако, если вы хотите использовать все 16 ядер с nginx, измените worker_processes на 16 в nginx.conf.
Это нормально, что 64-битная система использует больше памяти, чем 32-битная, так как почти для каждого числа или указателя в коде потребуется в два раза больше. Вам действительно нужна 64 битная?
64-разрядные программы, строго привязанные к процессору, могут быть быстрее 32-разрядных на том же компьютере, но в вашей ситуации (очень мало оперативной памяти), чем меньше программ оперативной памяти используют, тем лучше, поскольку ее можно использовать для кеширования.
Я бы рекомендовал вернуться к 32-битной версии.