I have a load balanced application on AWS, on two c4.2xlarge (8 vCPUs, 15GB ram) servers and they serve a very simplistic site but with a system call to ffmpeg encode a <5s mp4. Individually, the script takes < 1s to execute, but under stress, the response time goes over the roof.
500 concurrent users over a period of 20s
Testing with 1000 concurrent users over the span of 1 minute gets a lot worse, regardless of the load balance setup.
I cannot figure out why the response time of the request increases quite significantly over the duration of my stress tests.
fpm pool configuration
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 configuration
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;
}
The duration of the request to be completed is not a particular issue in my case, as long as is more or less consistent and < 15s.
So, can't help but wonder, where am I going wrong about my approach and what should I look into, in order to solve this increasing response time?
Update
I have now, changed to io1 with 2000 iops for a 40gb root block device (don't really need EBS)
Some server stats, with peeks of when I ran the tests
Really strange how it peeks to 100% in the 1 minute interval
Update2
Command and its arguments
ffmpeg -r 7 -s 470x264 -i upload/1494515054/%01d.jpg -vcodec libx264 -crf 25 -pix_fmt yuv420p -preset ultrafast test/`date +%s`.mp4
Execution times: ranging from 0m0.148s to 0m0.163s
Howeve, the command is executed via php's shell_exec
, and in that script it rounds around 350ms 500ms