web-dev-qa-db-ja.com

Webサーバーで毎秒500Kリクエストを達成するにはどうすればよいですか?

私は最近、新しい専用サーバーをプレゼントしました。楽しみながら学習できるように、サーバーから最大限のパフォーマンスを引き出そうとしています。

このサーバーが処理できる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;
}
}

}
8
Arpit Tambi

まず、新しいベンチマークツールを作成する必要があります。実際にはabではなくnginxをベンチマークしています。

13
VBart

Arpit、静的テキストファイルが1つのイーサネットパケット(約1,500バイト)であっても、Web応答が絶対的に最小であると想像すると、そのうちの500,000は約750,000,000バイト、つまり約7.5ギガビットで動作します。したがって、サーバーに10Gb NICが非常に簡単にオフロードされていない場合(そうでない場合は、100倍遅くなります)、それらのリンクのいずれかをほぼ完全にフラッディングできるようにドライバーとカーネルをセットアップします。ロードバランサー、ファイアウォール、ルーター、およびその後の接続のレイテンシがそのレートである場合、単一のパケット応答でさえ、そのようなパフォーマンスを達成することはできません。したがって、最終的には35kはあなたの限界をはるかに超えていません。

28
Chopper3

ボトルネックを特定しましょう。同じマシン上にいるので、それは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を有害なものにする場合もあります。そのため、オンまたはオフのときに負荷に適しているかどうかを調べてください。

8
Jeff Ferland

数値の直後にある場合(たとえば、このテストの背後に実際の使用例はありません)-abにhttpのキープアライブ機能を使用させます-すでに開いている接続で要求の数を実行しますTCP接続。

1
pQd