Задать вопрос

Nginx + php-fpm ест слишком много памяти?

Добрый день, Хабр!



Сервер: облачный 16 ядер х 2,66 ГГЦ / 512 RAM / 10Gb HDD.



Показания Вебмина.

Физической памяти: всего 519.81 MB / свободно 347.23 MB Виртуальной памяти: всего 1023.99 MB / свободно 1023.92 MB




Показания скрипта PhpSysInfo.

Физическая память: занято 81%, свободно 98.93 MiB, занято 420.89 MiB, всего 519.81 MiB.




Результат исполнения команды free совпадает с показаниями PhpSysInfo.



Сервер — Debian 6, установлены nginx и php5-fpm с php-apc и memcached. Больше ничего там не крутится, даже почта — через ssmtp.



nginx.conf:

worker_processes 2;<br/>
worker_priority -5;<br/>
pid /var/run/nginx.pid;<br/>
<br/>
events {<br/>
 worker_connections 1024;<br/>
 multi_accept on;<br/>
 }<br/>




php-fpm.conf:

pm = dynamic<br/>
pm.max_children = 3<br/>
pm.start_servers = 2<br/>
pm.min_spare_servers = 1<br/>
pm.max_spare_servers = 3<br/>
pm.max_requests = 1024




Запущены процессы:

1680 www-data 200364 kB php-fpm: pool www<br/>
21709 www-data 191180 kB php-fpm: pool www<br/>
21681 www-data 187788 kB php-fpm: pool www<br/>
21679 root 184312 kB php-fpm: master process (/etc/php5/fpm/php5-fpm.conf)<br/>
1502 mysql 171952 kB /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306<br/>
21687 nobody 128072 kB /usr/bin/memcached -m 64 -p 11211 -u nobody -l 127.0.0.1<br/>
22775 root 74784 kB /usr/share/webmin/proc/index_size.cgi<br/>
1507 root 71896 kB /usr/bin/python /usr/bin/fail2ban-server -b -s /var/run/fail2ban/fail2ban.sock<br/>
21769 root 71732 kB /usr/bin/perl /usr/share/webmin/miniserv.pl /etc/webmin/miniserv.conf<br/>
22380 root 70452 kB sshd: root@pts/0<br/>
21670 www-data 55452 kB nginx: worker process<br/>
21672 www-data 55404 kB nginx: worker process<br/>
21669 root 54668 kB nginx: master process /usr/sbin/nginx<br/>
1249 root 54548 kB /usr/sbin/rsyslogd -c4<br/>
1372 root 49164 kB /usr/sbin/sshd<br/>
22610 root 42392 kB mc<br/>
1321 root 23556 kB /usr/sbin/cron<br/>
22396 root 20400 kB -bash<br/>
22612 root 20396 kB bash -rcfile .bashrc<br/>
711 root 16744 kB udevd --daemon<br/>
811 root 16740 kB udevd --daemon<br/>
812 root 16740 kB udevd --daemon<br/>
22782 root 14808 kB ps --cols 2048 -eo user:80,ruser:80,group:80,rgroup:80,pid,ppid,pgid,pcpu,vsz,nice,etime,time,stime,tty,args<br/>
22685 root 12552 kB editor /etc/php5/fpm/php5-fpm.conf<br/>
1 root 8348 kB init [2]<br/>
1118 root 6744 kB dhclient -v -pf /var/run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases eth0<br/>
1163 root 6744 kB dhclient -v -pf /var/run/dhclient.eth1.pid -lf /var/lib/dhcp/dhclient.eth1.leases eth1<br/>
1750 root 5924 kB /sbin/getty 38400 tty1<br/>
1751 root 5924 kB /sbin/getty 38400 tty2<br/>
1752 root 5924 kB /sbin/getty 38400 tty3<br/>
1753 root 5924 kB /sbin/getty 38400 tty4<br/>
1754 root 5924 kB /sbin/getty 38400 tty5<br/>
1755 root 5924 kB /sbin/getty 38400 tty6<br/>
1390 root 3948 kB /bin/sh /usr/bin/mysqld_safe<br/>
22684 root 3948 kB /bin/sh /usr/bin/sensible-editor /etc/php5/fpm/php5-fpm.conf<br/>
22781 root 3948 kB sh -c ps --cols 2048 -eo user:80,ruser:80,group:80,rgroup:80,pid,ppid,pgid,pcpu,vsz,nice,etime,time,stime,tty,args 2&gt;/dev/null<br/>
1503 root 3848 kB logger -t mysqld -p daemon.error<br/>




Вопрос: это нормально? Что делать? Куда копать? Как уменьшить потребление памяти?
  • Вопрос задан
  • 11938 просмотров
Подписаться 5 Оценить Комментировать
Решения вопроса 1
taliban
@taliban
php программист
А для чего Вам свободная память? Жалко что ли? Поделится если что, не волнуйтесь. У меня на 190 метрах памяти все забил, и ниче, и с мускулом делится и остальные не страдают. Волноваться стоит не когда память забита и все работает, а когда что-то не работает _потому что_ память забита.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@cadmi
free memory = wasted memory :D

Пока не начало тормозить или свопиться, заранее беспокоиться не о чем.

Solaris, например, вообще бы забрала всю RAM под дисковый кэш ZFS. Вернув при нужде, по первому требованию, когда кому-то понадобится.
Ответ написан
AlexeyK
@AlexeyK
Могу предположить, что каждый воркер имеет в себе весь php-apc кеш, поэтому кушается столько памяти.
Единственная проблема, которая может быть — php-fpm memory leak, но если после рестарта php-fpm он кушает примерно столько же памяти, сколько и до рестарта, значит утечек скорее всего нет
Ну и как вам уже сказали, волноваться надо, когда используется своп
Ответ написан
Nepofigist
@Nepofigist Автор вопроса
Разобрался, в чем было дело: слишком сильно был раздут кэш при малом количестве рабочих процессов nginx и php-fpm, плюс была включена функция масштабирования нагрузки в свойствах сервера. Масштабирование отключил, количество рабочих процессов nginx и php-fpm значительно увеличил, кэш незначительно уменьшил — память освободилась до 150-200 мегабайт в зависимости от нагрузки, из них около 100 мегабайт кэша.

Меньше — не значит лучше, %юзернейм%.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы