Назад | Перейти на главную страницу

Оптимизация 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 ядер и было бы неплохо их использовать ...

  • PHP, NGINX

С небольшим объемом оперативной памяти ваш VPS будет обмениваться местами задолго до того, как вы будете использовать все ядра - просто забудьте об этом: запустите 1 рабочий процесс nginx - он сможет обрабатывать НАМНОГО больше запросов, чем вам нужно.

Поскольку вы, скорее всего, запускаете PHP из дистрибутива Lenny, в него скомпилировано очень много всего. Перекомпиляция PHP сэкономит вам немного оперативной памяти. Таким образом, не будут загружаться ненужные вам расширения - проверьте в php.ini, что загружается.

PHP-FPM отправляет запросы из очереди рабочим (циклический перебор), поэтому вы можете уменьшить количество дочерних процессов до 3-4, если вам нужно - если будет больше запросов, они просто будут ждать своей очереди.

  • Остальные vps

Проверьте, какие службы вы используете и действительно ли они вам нужны. Установка по умолчанию включает в себя много чего

Если у вас запущен 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-битной версии.