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

php-fpm с NGINX, время отклика экспоненциально увеличивается со временем

У меня есть приложение с балансировкой нагрузки на AWS, на двух серверах c4.2xlarge (8 виртуальных ЦП, 15 ГБ оперативной памяти), и они обслуживают очень упрощенный сайт, но с системным вызовом для ffmpeg, кодирующего MP4 <5 с. По отдельности выполнение сценария занимает <1 с, но в условиях стресса время отклика зашкаливает.

500 одновременных пользователей в течение 20 секунд

Тестирование с 1000 одновременных пользователей в течение 1 минуты становится намного хуже, независимо от настройки баланса нагрузки.

Я не могу понять, почему время ответа на запрос значительно увеличивается за время моих стресс-тестов.

конфигурация пула fpm

pm.max_children = 100
pm.start_servers = 25
pm.min_spare_servers = 25
pm.max_spare_servers = 50
;pm.process_idle_timeout = 10s;
pm.max_requests = 500

request_terminate_timeout = 180s

php_admin_value[memory_limit] = 128M
php_admin_value[upload_max_filesize] = 3M
php_admin_value[post_max_size] = 3M
php_admin_value[max_execution_time] = 180

конфигурация nginx

events {
    worker_connections 66536;
    use epoll;
    multi_accept on;
}

worker_rlimit_nofile 30000;

...

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
access_log off;
log_not_found off;

location ~ \.php$ {
    try_files $uri /index.php =404;

    include fastcgi_params;

    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_read_timeout 180; 
}

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

Итак, не могу не задаться вопросом, где я ошибаюсь в своем подходе и на что мне следует обратить внимание, чтобы решить проблему увеличения времени отклика?

Обновить

Теперь я изменил на io1 с 2000 iops для корневого блочного устройства 40 ГБ (на самом деле не нужен EBS)

Некоторая статистика сервера, с взглядами, когда я запускал тесты

CPU 1-минутный интервал

ЦП с интервалом 5 минут

Действительно странно, как он достигает 100% за 1 минуту

Обновление2

Команда и ее аргументы

ffmpeg -r 7 -s 470x264 -i upload/1494515054/%01d.jpg -vcodec libx264 -crf 25 -pix_fmt yuv420p -preset ultrafast test/`date +%s`.mp4

Время выполнения: от 0 мин. 0,148 до 0 мин. 0,163 с.

Однако команда выполняется через php shell_exec, и в этом сценарии округляется около 350 мс 500 мс

Похоже, это может быть просто дисковый ввод-вывод; 1000 одновременных пользователей в промежутке от 1 минуты до 16,7 в секунду, предположительно каждый из них обращается к другому файлу mp4, который вам нужно кодировать. Сколько времени вам нужно, чтобы кодировать 1000 различных файлов mp4 одновременно (или если вы можете запланировать это, порождая 17 новых задач кодирования каждую секунду), и каков дисковый ввод-вывод?