我使用 blitz.io 来给我的网站带来大量流量,看看我的“学习系统管理员”在负载下的表现如何。我意识到这和大锤一样有效或与现实世界相关,但我真的想看看当我更改设置时进行比较。
我的通信设置(全部在 Amazon EC2 上)、Amazon Linux AMI
- 1x Amazon 弹性负载均衡器
- 2x Nginx 服务器上游至...
- 1x Php-fpm 服务器(很快将变为 2x)。连接到...
- 1 个 RDS mysql 服务器
一切都在 VPC 后面
为了进行测试,我所服务的网站是带有 W3 Total Cache 的 Wordpress 安装。
最初,我有 1x Nginx + 1x Php-fpm(隐含 1x Rds),全部作为微服务器。我相信在我开始遇到大量超时(时间 > 1000ms)之前,我的请求速度为 850/秒。
在此期间,phpfpm 和 nginx 的 CPU 都达到了 100%。所以……
然后我添加了第二个 nginx 服务器。之后,我将两个 nginx 服务器都转换为“大”,并将 php-fpm 也转换为“大”。
我将 php-fpm 设置乘以 5,令我沮丧的是,测试结果几乎完全相同……这次唯一的区别是所有 3 台服务器上的 CPU 和内存都达到了最大值约 5%。就好像几乎没有使用任何资源。我查看了日志中的错误,但并没有发现太多错误……
我已经多次查看过我的设置并且我知道我遗漏了一些重要的东西......
wordpress 部分的网站内容可以完全缓存...如果我更新了其中的任何内容,我将清除缓存。我的网站还有后半部分,但都是静态内容,没有数据库查询。我确实使用了一个 php“加载器”脚本,它可以从包含文件中加载各种内容,但仅此而已...非常轻量级。
我听说过一些事情,ulimit
或者更确切地说......这可能是一个问题吗?
我试图在 1 分钟内处理 6000 个用户
我的配置
服务器1:Nginx
nginx.conf
user www www;
worker_processes auto;
events {
worker_connections 1024;
}
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
http {
server_tokens off;
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 /var/log/nginx/access.log main;
keepalive_timeout 65;
sendfile on;
tcp_nopush on;
tcp_nodelay off;
gzip on;
gzip_http_version 1.0;
gzip_disable "msie6";
gzip_comp_level 5;
gzip_buffers 16 8k;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
# text/html is always compressed by HttpGzipModule
text/css
text/plain
text/x-component
application/javascript
application/json
application/xml
application/xhtml+xml
application/x-font-ttf
application/x-font-opentype
application/vnd.ms-fontobject
image/svg+xml
image/x-icon;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
upstream php {
# ip_hash;
server 10.0.0.210:9001;
}
include sites-enabled/*;
}
相关的 nginx 设置..
/etc/nginx/conf/缓存描述符.conf
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
服务器2:php-fpm
php-fpm.conf
include=/etc/php-fpm.d/*.conf
[global]
pid = /var/run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/error.log
log_level = notice
emergency_restart_threshold = 5
emergency_restart_interval = 2
php.ini
In this file I honestly didnt change much in php.ini except for the CGI path setting for the nginx zero day exploit. Maybe one more setting or two but vanilla for the most part
/etc/php-fpm.d/www.conf
[www]
listen = 9001
; # nginx-master, nginx-2
listen.allowed_clients = 10.0.0.248,10.0.0.155
user = www
group = www
pm = dynamic
pm.max_children = 500
pm.start_servers = 150
pm.min_spare_servers = 50
pm.max_spare_servers = 250
pm.max_requests = 1200
request_terminate_timeout = 30
slowlog = /var/log/php-fpm/www-slow.log
security.limit_extensions = .php
php_flag[display_errors] = off
php_admin_value[error_reporting] = 0
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 128M
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
如果有人有任何想法,我将不胜感激。我肯定遇到了某种我没有看到的“隐形极限”。
谢谢!
PS:如果您有更好的基准测试方法,我会洗耳恭听。
RDS 的截图在下面的评论中(我把它保存在 micro 上)
以下是测试发生的情况
答案1
看起来您确实已经达到了极限,例如临时端口范围的数量、打开的最大文件描述符的数量、套接字的耗尽、内存交换到磁盘,或者甚至套接字内存不足。
查看 /var/log/messages、dmesg、/proc/net/sockstat 来寻找瓶颈所在的线索。
如果没有日志就很难提供帮助。