Оптимизация Debian x86_64 + Nginx + PHP5-FPM
Раньше у меня был 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 ядер, и было бы неплохо использовать их...
4 ответа
- PHP, NGINX
Если у вас мало оперативной памяти, ваш VPS будет меняться задолго до того, как вы начнете использовать все ядра - просто забудьте об этом: запустите 1 рабочий процесс nginx - с сможет обработать на WAY больше запросов, чем вам нужно.
Поскольку вы, скорее всего, работаете с PHP из дистрибутива Lenny, в нем собрано очень много вещей. Перекомпиляция PHP сэкономит вам немного оперативной памяти. Поэтому не будем загружать ненужные вам расширения - проверьте, что загружается в php.ini.
PHP-FPM отправляет запросы из очереди рабочим (циклический перебор), так что вы можете уменьшить число дочерних процессов до 3-4, если вам нужно - если будет больше запросов, они просто будут ждать своей очереди.
- Остальная часть VPS
Проверьте, какие сервисы вы используете, и действительно ли они вам нужны. Установка по умолчанию включает в себя много вещей
Если у вас запущен saslauthd, и вы хотите, чтобы он работал, обязательно добавьте задание cron, которое будет перезапускать его ежедневно - у него была неприятная утечка памяти целую вечность, и я видел, как она раздувалась до 1,5 ГБ примерно за два недели на одной из моих коробок.
Я не уверен на 100% в сокращении использования памяти для php5-fpm, однако, если вы хотите использовать все 16 ядер с nginx, измените worker_processes на 16 в nginx.conf
Вы можете уменьшить количество серверов php-fpm или уменьшить объем памяти, который может использовать php.
"x" - это объем памяти, который вы можете разрешить использовать php / fpm, затем разделите x на объем памяти, который может понадобиться каждому php-скрипту (memory_limit), и у вас есть количество "серверов" php-fpm (не включая любой кэш опкодов или накладные расходы по php-fpm).
Например: если вы можете позволить ему использовать максимум 256 МБ, а каждый сценарий ограничен 64 МБ, тогда серверы "256 / 64 = 4" php-fpm.
Я полагаю, что потратить несколько лишних долларов на память стоит каждый пенни.
Это нормально, что 64-битная система использует больше памяти, чем 32-битная, поскольку почти каждому числу или указателю в коде потребуется в два раза больше. Вам действительно нужно 64 бит?
64-разрядные программы с жесткой привязкой к процессору могут работать быстрее, чем 32-разрядные на одном компьютере, но в вашей ситуации (очень мало ОЗУ), чем меньше программ ОЗУ использует, тем лучше, так как больше их можно использовать для кэширования.
Я бы рекомендовал вернуться к 32 бит.