私は最近、新しい専用サーバーをプレゼントしました。楽しみながら学習できるように、サーバーから最大限のパフォーマンスを引き出そうとしています。
このサーバーが処理できる1秒あたりの可能な最大リクエストを達成しようとしていますが、ここで述べたように500Kリクエスト/秒を目指しています http://lowlatencyweb.wordpress.com/2012/03/20/500000-requestssec-modern -http-servers-are-fast /
サーバーの詳細
インテル®Xeon®E3-1270 4コア(8 HT)x 3.4 GHz
RAM 24 GB DDR3 ECC
ハードディスク容量2,000 GB(2 x 2,000 SATA)RAIDソフトウェアRAID 1
LAN 100mbps
OS Centos 6.3 64ビット
Nginx
静的txtファイルの場合、1秒あたり35Kリクエストしか到達できません。 同じマシンでベンチマークを実行しています。私はNIC制限とネットワークオーバーヘッドを知っています
ab -n100000 -c200 http://localhost/test.txt
更新-165,000リクエスト/秒
wrk
と呼ばれる別のベンチマークツールを試したところ、1秒あたり165Kのリクエストがありました。とてもクール!
更新2-250Kリクエスト/秒
nginx.conf
#######################################################################
#
# This is the main Nginx configuration file.
#
# More information about the configuration options is available on
# * the English wiki - http://wiki.nginx.org/Main
# * the Russian documentation - http://sysoev.ru/nginx/
#
#######################################################################
#----------------------------------------------------------------------
# Main Module - directives that cover basic functionality
#
# http://wiki.nginx.org/NginxHttpMainModule
#
#----------------------------------------------------------------------
user nginx;
worker_processes 8;
worker_rlimit_nofile 262144;
error_log /var/log/nginx/error.log;
#error_log /var/log/nginx/error.log notice;
#error_log /var/log/nginx/error.log info;
pid /var/run/nginx.pid;
#----------------------------------------------------------------------
# Events Module
#
# http://wiki.nginx.org/NginxHttpEventsModule
#
#----------------------------------------------------------------------
events {
worker_connections 16384;
multi_accept on;
use epoll;
}
#----------------------------------------------------------------------
# HTTP Core Module
#
# http://wiki.nginx.org/NginxHttpCoreModule
#
#----------------------------------------------------------------------
http {
include /etc/nginx/mime.types;
index index.php index.html index.htm;
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;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
client_max_body_size 24m;
client_body_buffer_size 128k;
#keepalive_timeout 0;
keepalive_timeout 65;
open_file_cache max=1000;
open_file_cache_min_uses 10;
open_file_cache_errors on;
gzip on;
gzip_static on;
gzip_comp_level 3;
gzip_disable "MSIE [1-6]\.";
gzip_http_version 1.1;
gzip_vary on;
gzip_proxied any;
gzip_types text/plain text/css text/xml text/javascript text/x-component text/cache-manifest application/json application/javascript application/x-javascript application/xml application/rss+xml application/xml+rss application/xhtml+xml application/atom+xml application/wlwmanifest+xml application/x-font-ttf image/svg+xml image/x-icon font/opentype app/vnd.ms-fontobject;
gzip_min_length 1000;
fastcgi_cache_path /tmp levels=1:2
keys_zone=NAME:10m
inactive=5m;
fastcgi_cache_key "$scheme$request_method$Host$request_uri";
server {
listen 80;
server_name _;
root /var/www/html;
#charset koi8-r;
#access_log logs/Host.access.log main;
location / {
try_files $uri $uri/ /index.php?$args;
}
error_page 404 /404.html;
location = /404.html {
root /var/www/error;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/error;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# checks to see if the visitor is logged in, a commenter,
# or some other user who should bypass cache
set $nocache "";
if ($http_cookie ~ (comment_author_.*|wordpress_logged_in.*|wp-postpass_.*)) {
set $nocache "Y";
}
# bypass cache if logged in.
# Be sure that this is above all other fastcgi_cache directives
fastcgi_no_cache $nocache;
fastcgi_cache_bypass $nocache;
fastcgi_cache NAME;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 10;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_buffers 256 16k;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# Deny access to any files with a .php extension in the uploads directory
location ~* ^/wp-content/uploads/.*.php$ {
deny all;
access_log off;
log_not_found off;
}
location ~* \.(jpg|jpeg|gif|png|flv|mp3|mpg|mpeg|js|css|ico)$ {
expires max;
log_not_found off;
}
}
}
まず、新しいベンチマークツールを作成する必要があります。実際にはab
ではなくnginx
をベンチマークしています。
Arpit、静的テキストファイルが1つのイーサネットパケット(約1,500バイト)であっても、Web応答が絶対的に最小であると想像すると、そのうちの500,000は約750,000,000バイト、つまり約7.5ギガビットで動作します。したがって、サーバーに10Gb NICが非常に簡単にオフロードされていない場合(そうでない場合は、100倍遅くなります)、それらのリンクのいずれかをほぼ完全にフラッディングできるようにドライバーとカーネルをセットアップします。ロードバランサー、ファイアウォール、ルーター、およびその後の接続のレイテンシがそのレートである場合、単一のパケット応答でさえ、そのようなパフォーマンスを達成することはできません。したがって、最終的には35kはあなたの限界をはるかに超えていません。
ボトルネックを特定しましょう。同じマシン上にいるので、それはCPUまたはディスクアクティビティのいずれかであると想定できます。 1つのテキストファイルの場合、それはディスクアクティビティではありませんが、35k接続では毎秒35MBのログを生成している可能性があります。
表示されている例では、アクセスロギングは実行されず、エラーのみが実行されます。しかし、あなたの設定はもっと多くのこと、特にロギングを行っています:
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;
そのロギングを無効にすることから始めて、次にどこでハングアップするのかを理解します。また、同じマシンでテストクライアントを実行すると、サーバーデーモンに大きな影響を与える可能性があることも考慮してください。 Hypertheadingはouを有害なものにする場合もあります。そのため、オンまたはオフのときに負荷に適しているかどうかを調べてください。
数値の直後にある場合(たとえば、このテストの背後に実際の使用例はありません)-abにhttpのキープアライブ機能を使用させます-すでに開いている接続で要求の数を実行しますTCP接続。