LINUX.ORG.RU
ФорумAdmin

php-fpm медленнее mod_php ?


0

3

приветствую,

uname -a
2.6.38-13-server #55-Ubuntu 11.04
nginx
apache+mod_php
php-fpm

делаю тесты:
ab -n 100000 -c 2000 http://some.url/

результаты apache:
Time taken for tests: 511.236 seconds
Complete requests: 1000000
Failed requests: 2000
средняя нагрузка CPU 50%

результаты php-fpm:
Time taken for tests: 197.140 seconds
Complete requests: 1000000
Failed requests: 791303 <------------ WTF?
средняя нагрузка CPU 100% <------------ WTF?


из существенных изменений конфига fpm:
listen.backlog = 2000
pm = static
pm.max_children = 2100

вопросы:
почему так много ошибок при fpm?
почему чрезмернао высокая наргузка на CPU?, (хотя по идее
fpm должен быть легче чем apache)


Ответ на: комментарий от Shtsh

чтобы не спамить привожу существенные части конфигов, вырезав комментарии и явно не относящиеся к обсуждению вещи

nginx:
------------------------------------------------
worker_rlimit_nofile 99999;

events {
worker_connections 10240;
}

upstream backend {
server unix:/tmp/fcgi.sock;
}
location ~ .php$ {
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass backend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/someurlwashere/www$fastcgi_script_name;
include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
---------------------------------------------------------------------------
php.ini не модифицировался - стандартный из дистрибутива
----------------------------------------------------------------------------
/etc/php5/fpm/pool.d/www.conf:

[www]
listen.backlog = 2000
user = www-data
group = www-data
pm = static
pm.max_children = 2100
pm.start_servers = 500
pm.min_spare_servers = 500
pm.max_spare_servers = 2000
pm.max_requests = 500
request_terminate_timeout = 1m
request_slowlog_timeout = 60
slowlog = /var/log/php.log.slow
rlimit_files = 65535
chdir = /
catch_workers_output = yes

neomag
() автор топика
Ответ на: комментарий от neomag
pm = static
pm.max_children = 2100
pm.start_servers = 500
pm.min_spare_servers = 500
pm.max_spare_servers = 2000

Твой конфиг — говно.

power
()
Ответ на: комментарий от neomag

Слишком МНОГО врокеров, чайлдов и серверов. Сделай значения поближе к дефолту, тогда процент фейлов сойдет на 0.

anonymous
()
Ответ на: комментарий от neomag

Давай по-порядку. Показывай ulimit -a
Зачем тебе столько соединений?
Воркер только 1?
Сколько процессоров?

Shtsh ★★★★
()
Ответ на: комментарий от Shtsh

ulimit -a

core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 20 file size (blocks, -f) unlimited pending signals (-i) 16382 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 512000 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited ------------------------------------------------------ т.е. как бы в дескрипторы не упирается

worker_processes 5; виртуальная машина с 24 ядрами 2x 6Core Xeon, + hyperthreading

Коллеги, вы уверены, что дело в nginx? ведь с теми же самыми параметрами, только с proxy_pass -> apache вместо fastcgi_pass -> php-fpm все работает значительно лучше, неужели на fpm так сказываются настройки nginx?

neomag
() автор топика
Ответ на: комментарий от neomag

прошу прощения, вот, с нормальными переносами:
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 512000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
------------------------------------------------------
т.е. как бы в дескрипторы не упирается

worker_processes 5;
виртуальная машина с 24 ядрами
2x 6Core Xeon, + hyperthreading


Коллеги, вы уверены, что дело в nginx?
ведь с теми же самыми параметрами, только
с proxy_pass -> apache
вместо fastcgi_pass -> php-fpm
все работает значительно лучше, неужели на fpm так сказываются настройки nginx?

anonymous
()

php-fpm медленнее mod_php ?

Жесть какая. А ещё недавно php-fpm имел такую же скорость, как и php-fcgi и как mod_php.

Сейчас картина такая (вызов <?php echo 2*2; ?>), 10000 запросов в 100 потоков:

lighttpd/php-fcgi = 18мс/запрос, 5,5 тыс. запросов в секунду

apache2/mod_php = 28мс, 3,6 тыс./с

nginx/php-fpm = 65мс, 1,5 тыс./с.

Походу, мне придётся пересмотреть некоторые схемы своих сайтов :)

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

Да, очень сильно.
Уменьшай количество соединений. У тебя всё слишком похоже на превышение лимита файлов/соединений.

Проверь ещё длину очереди нетфильтра. http://shtsh.blogspot.com/2012/01/blog-post.html
Правда, эта проблема должна была быть в логах.

Shtsh ★★★★
()
Ответ на: комментарий от KRoN73

nginx/php-fpm = 65мс, 1,5 тыс./с.

Впрочем, после оптимизации параметров, удалось вытянуть 30мс и 3,3 тыс./с. Уже уровень Apache выходит, хотя и проигрывает lighttpd/fcgi.

KRoN73 ★★★★★
()
Ответ на: комментарий от power

вы или пишите по делу,
или покиньте обсуждение

что не понравилось в конфиге?
увидели одновременно и static и dynamic опции,
мозгов не хватило понять что игрался с параметрами и забыл вырезать?

neomag
() автор топика
Ответ на: комментарий от KRoN73

KRON73
указанный эталонный php с «<? echo 2*2; ?>

у меня выдал на fpm
Concurrency Level: 100
Requests per second: 10679.35 [#/sec]

и тоже естественно без ошибок,
вопрос именно в том, чтобы держать 2000 именно параллельных клиентов

было бы здорово если вы поделились информацией о том, в чем заключалась ваша оптимизация

neomag
() автор топика
Ответ на: комментарий от neomag

держать 2000 именно параллельных клиентов

Ололо. С такой задачей пхп справляется крайне говено. Вам необходимо пересмотреть архитектуру.

anonymous
()
Ответ на: комментарий от neomag

было бы здорово если вы поделились информацией о том, в чем заключалась ваша оптимизация

Ну, оказалось, что число воркеров 4 оказалось заметно лучше, чем 3, которые стояли до этого (да, ядра 4, но nginx там играет маловажную роль).

Также заметно ускорило работу увеличение pm.max_children до 100 (было 50) (и, да, у меня pm = dynamic). От числа серверов зависит мало.

Однако, общее число php-cgi детей у lighttpd — 40 и он справляется с теми же запросами много лучше.

В общем, будет время, пройдусь в несколько итераций по всем параметрам, точнее подбирая оптимальные значения, пока не горит.

KRoN73 ★★★★★
()
Ответ на: комментарий от Shtsh

Проверь ещё длину очереди нетфильтра

net.ipv4.netfilter.ip_conntrack_max=1000000
во время теста:
net.ipv4.netfilter.ip_conntrack_count = 28243
т.е. эта оптимизация -пройденный этап -не упирается

протестил различные значения
worker_processes
worker_connections

существенных изменений по нагрузке не обнаружил.
оставил в соответствии с официальными рекомендуемыми

neomag
() автор топика
Ответ на: комментарий от ventilator
pm.max_children = 2100
pm.max_requests = 500

это просто бред.

Сделайте max_requests в районе 5000, pm.max_children 2100 - у вас что воркеры блокируеются на секунду чтобы запрос выполнить? Сделайте разумное число какое то.

ventilator ★★★
()
Ответ на: комментарий от ventilator

вопрос именно в том, чтобы держать 2000 именно параллельных клиентов

2000 параллельных клиентов это никак не значит 2000 параллельных php процессов. Если вы конечно не гигабайты ответа генерите php скриптом для каждого клиента.

ventilator ★★★
()
21 декабря 2012 г.
Ответ на: комментарий от KRoN73

зомби топик

cast KRoN73, на чем все-таки закончились опыты с производительностью?

Сам сейчас на php-fpm+lighttpd сижу, думаю может свалить на php-fcgi

anonymous
()
Ответ на: зомби топик от anonymous

cast KRoN73, на чем все-таки закончились опыты с производительностью?

Я потом к этой теме больше не возвращался. А php-fpm избегаю, где можно, по другой причине — оно с некоторых пор и в Gentoo, и в Ubuntu, стало падать. При чём встроенный менеджер (т.е. суть FPM) процессы не поднимает. Так и висит nginx с гейтвей-эррором.

А вот lighttpd сам прекрасно поднимает упавшие fcgi. Так что всё ответственное — на нём.

При чём, в Ubuntu под fpm сейчас вообще муть какая-то. Висит сайт. Стоит тупой watchdog, который wget'ом раз в N минут проверяет доступность страниц и при их отваливании рестартует fpm-демон. Через какое-то время оказывается, что часть страниц, в т.ч. контролируемая, работает, остальные — нет. Добавляешь новую страницу, через какое-то время все контролируемые работают, часть неконтролируемых — нет. Т.е., судя по всему, отваливается часть процессов, но только часть. И возникает ситуация, когда процессы контролируемых страниц доступны, остальные — упали.

Поковырялся с параметрами самоконтроля, рестарта — вроде, пока особо не помогает. Надо дальше копать.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

спасибо, что ответил :)

А насчет падений php-fpm, не замечал такого в gentoo ~x86

ясно, тогда переползаю на fcgi, опять таки меньше конфигов крутить

anonymous
()
Ответ на: спасибо, что ответил :) от anonymous

Вообще, при наличии lighttpd, php-fpm нужен только если требуется многопользовательская система или индивидуальные настройки для разных хостов. Менеджер процессов в lighttpd при работе с fastcgi много лучше, чем менеджер в php-fpm.

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.