我正在使用 php-fpm 运行 nginx 服务器。
我正在使用“ c5d.xlarge
”ec2 实例类型来托管我的网站。
c5d.xlarge = 4 vcpu 和 8GB RAM。
如果我的 ELB 上的活动连接数超过 10k,则我所有 15 台服务器的 CPU 利用率将超过 60-70%。
php-fpm 配置:
pm = dynamic
pm.max_children = 65
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 600
nginx配置:
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
events {
worker_connections 3072;
}
http {
##
# Basic Settings
##
charset utf-8;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
log_not_found off;
types_hash_max_size 2048;
client_max_body_size 16M;
keepalive_timeout 70;
client_header_timeout 3000;
client_body_timeout 3000;
fastcgi_read_timeout 3000;
fastcgi_buffers 8 128k;
fastcgi_buffer_size 128k;
# MIME
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /home/ubuntu/apps/log/default/access.log main buffer=32k;
error_log /home/ubuntu/apps/log/default/error.log;
gzip on;
gzip_disable "MSIE [1-6]\.";
# Only allow proxy request with these headers to be gzipped.
gzip_proxied expired no-cache no-store private auth;
# Default is 6 (1<n<9), but 2 -- even 1 -- is enough. The higher it is, the
# more CPU cycles will be wasted.
gzip_comp_level 7;
gzip_min_length 20; # Default 20
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
include /etc/nginx/conf.d/*.conf;
请建议这些配置是否合适。我不太确定这么多活动连接占用这么多 CPU 是否合适。如果有人能指导我设置 nginx 和 php-fpm 以获得最佳性能,我将不胜感激。
如果需要更多信息,请告诉我。
答案1
让我们开始吧php-fpm
pm = dynamic
动态进程模型让一群工作进程等待请求通过。同时,这些工作进程利用 CPU 周期和内存。ondemand
是 FPM 进程模型的最佳选择,因为它可以根据需要扩展。在您说“好吧,守护进程将要处理新的子进程”之前(fork()
这也是一项密集型任务),请记住,对于现代操作系统和硬件来说,这不是一项非常昂贵的操作。
pm.max_children = 65
这很可能是完全不可持续的,除非您的 phpmemory_limit
设置为 100MB,但这永远不足以运行任何类型的 PHP 进程。请注意,如果您要让 FPM 扩展到 65 个工作者,它们都可能使用高达memory_limit
。如果没有 RAM 来支持它,这个设置值就是锁定服务器的秘诀。
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
我不会对这些发表评论,因为它们足够合理。
pm.max_requests = 600
这个值在 PM 中毫无意义ondemand
,但我会谈论它。在 600 个请求之后终止工作进程有什么意义?如果您的应用程序泄漏了那么多内存,以至于您需要回收它,那么您需要评估应用程序本身。
转到nginx
worker_process = 4
工作进程数实际上应设置auto
为允许nginx
找到正确的平衡。不过,通常情况下,一个就足以满足大多数用例的需求。
worker_connections 3072;
这是另一个潜在的危险设置。您是否ulimit -n
查看过每个进程允许打开多少个文件?您的系统上有多少个可用核心(grep -c processor /proc/cpuinfo
)?一般来说,这个值应该是$CPU_CORES * ulimit
,在您的情况下,根据您选择的 EC2 实例,可能为2048
。
client_header_timeout 3000;
client_body_timeout 3000;
fastcgi_read_timeout 3000;
这是另一个可能让你吃不消的设置!你真的想让连接挂起近一个小时,等待超时吗?应用程序中过高的超时值可能会消耗大量服务器资源。超时值被设计为刚好高于特定事件发生所需的正常时间,不会高太多。否则,超时有什么意义呢?:)