web-dev-qa-db-fra.com

Comment réaliser des demandes 500K par seconde sur mon serveur Web?

Je me suis récemment offert un nouveau serveur dédié et j'essaie de tirer des performances maximales, pour le plaisir et l'apprentissage.

J'essaie d'obtenir des demandes maximales possibles par seconde que ce serveur peut gérer et visant 500k demandes/s comme mentionné ici - http://lowlatencyweb.wordpress.com/2012/03/20/500000-RequestSec-Modern -HTTP-SERVERS-SONT-FAST /

Détails du serveur

Intel® Xeon® E3-1270 4 cœurs (8 HT) x 3,4 GHz

RAM 24 Go DDR3 ECC

Espace disque de 2 000 Go (2 x 2 000 SATA) logiciel RAID RAID 1

LAN 100 MBPS

OS Centos 6.3 64 Bit

Nginx

Je suis capable d'atteindre seulement des demandes 35K/SEC pour un fichier TXT statique. J'exécute la référence sur la même machine. Je suis au courant de NIC LIMITES ET TRANSPORT DE NETTOBÉRÉ

ab -n100000 -c200 http://localhost/test.txt

Mise à jour - Demandes 165K/SEC

J'ai essayé un autre outil d'analyse comparative appelé wrk et cela m'a donné des demandes de 165k/sec. Trop cool!

Mise à jour 2 - Demandes de 250K/SEC

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

Tout d'abord, vous devriez écrire un nouvel outil d'analyse comparative. Vous êtes en fait comparatif ab non nginx.

13
VBart

ARPIT, si vous imaginez que la réponse Web probable absolument la plus petite, même si c'est un fichier texte statique, un paquet Ethernet (~ 1 500 octets), puis 500 000 d'entre eux agissent à environ 750 000 000 octets, ou environ 7,5 gigabits. Donc, à moins que votre serveur ait très facilement déchargé de 10 Go Nics (et ce que vous avez, celui que vous avez est cent fois plus lent) et avez-vous configuré les pilotes et le noyau pour vous permettre d'inonder presque complètement l'un de ces liens, ainsi que le Latences d'équilibreurs de charge, de pare-feu, de routeurs et de connexions ultérieures à ce débit, vous ne serez plus jamais en mesure de frapper ce type de performance - même avec une seule réponse de paquets, qui est peu probable. Donc, finalement 35K sonne pas loin de votre limite.

28
Chopper3

Identifions le goulot d'étranglement. Étant donné que vous êtes sur la même machine, nous pouvons supposer que c'est la CPU ou l'activité de disque. Pour le fichier texte, il ne doit pas être une activité de disque, mais à 35k connexions, vous pouvez générer 35 Mo de journalisation chaque seconde.

Les exemples que vous affichez ne gèrent pas la journalisation d'accès, uniquement des erreurs. Votre configuration, cependant, a beaucoup plus de travail, la journalisation notamment:

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;

Commencez par la désactivation de cette journalisation, puis déterminez où vous vous entraînez à la suite. Considérez également que l'exécution du client de test sur la même machine peut avoir un impact notable sur le démon de serveur. L'hypertheading peut également éventuellement être nocifs parfois, alors explorez si cela fonctionne mieux pour votre charge lorsque vous allumez ou éteint.

8
Jeff Ferland

si vous êtes juste après les chiffres [ par exemple, il n'y a pas de cas d'utilisation réelle derrière ce test] - Faites utiliser AB Utilisez la fonction Garder en vie de HTTP - Exécutez le nombre de demandes sur déjà ouvert TCP Connection.

1
pQd