我在 AWS 上有一个负载平衡应用程序,位于两台 c4.2xlarge(8 个 vCPU,15GB 内存)服务器上,它们为一个非常简单的网站提供服务,但有一个系统调用来对 ffmpeg 编码一个 <5s 的 mp4。单独来看,脚本执行时间不到 1 秒,但在压力之下,响应时间会超出预期。
20 秒内有 500 个并发用户
无论如何设置负载平衡,在 1 分钟内对 1000 个并发用户进行测试的情况都会变得更糟。
我无法弄清楚为什么在我的压力测试期间请求的响应时间会显著增加。
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秒即可。
所以,不禁想知道,我的方法哪里出了问题,我应该研究什么,才能解决这个增加的响应时间?
更新
我现在已经将 40gb 根块设备的 io1 改为 2000 iops(实际上不需要 EBS)
一些服务器统计数据,包括我运行测试时的一些信息
真奇怪,它在 1 分钟的间隔内达到 100%
更新2
命令及其参数
ffmpeg -r 7 -s 470x264 -i upload/1494515054/%01d.jpg -vcodec libx264 -crf 25 -pix_fmt yuv420p -preset ultrafast test/`date +%s`.mp4
执行时间:范围从0m0.148s到0m0.163s
然而,该命令是通过 php 执行的shell_exec
,并且在该脚本中它大约需要 350ms 到 500ms
答案1
听起来这可能只是磁盘 I/O;1000 个并发用户在 1 分钟内 ~ 16.7/秒,大概每个用户都在访问您必须编码的不同 mp4 文件。您需要多长时间才能同时编码 1000 个不同的 mp4 文件(或者如果您可以安排它,每秒产生 17 个新的编码任务),磁盘 I/O 是什么样的?