Wie erreiche ich 500.000 Anfragen pro Sekunde auf meinem Webserver? [geschlossen]

8

Ich habe mir kürzlich einen neuen dedizierten Server geschenkt und versuche, aus Spaß und zum Lernen die maximale Leistung herauszuholen.

Ich versuche, die maximal möglichen Anforderungen pro Sekunde zu erreichen, die dieser Server verarbeiten kann, und strebe 500.000 Anforderungen pro Sekunde an, wie hier erwähnt - http://lowlatencyweb.wordpress.com/2012/03/20/500000-requestssec-modern-http-servers -sind-schnell /

Serverdetails

Intel® Xeon® E3-1270 4 Kerne (8 HT) x 3,4 GHz

RAM 24 GB DDR3 ECC

Festplattenspeicher 2.000 GB (2 x 2.000 SATA) RAID-Software RAID 1

Lan 100 MBit / s

OS Centos 6.3 64 Bit

Nginx

Ich kann nur 35 KB Anfragen / Sek. Für eine statische TXT-Datei erreichen. Ich führe den Benchmark auf derselben Maschine aus. Ich kenne die NIC-Grenzwerte und den Netzwerk-Overhead

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

Update - 165K Anfragen / Sek

Ich habe ein anderes Benchmarking-Tool namens ausprobiert wrkund es gab mir 165.000 Anfragen / Sek. So cool!

Update 2 - 250K Anfragen / Sek

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;
}
}

}
Arpit Tambi
quelle
2
Klingt so, als ob Sie einen Hacking- oder Brute-Angriff auf einen anderen Webserver durchführen
3
Das Bereitstellen von mehr als 10-15 KB Anforderungen / Sekunde (zuverlässig / kontinuierlich) ist kein Job für EINEN Server, sondern ein Job für MEHRERE Server, die idealerweise über mehrere Netzwerkverbindungen verteilt sind (damit Sie Ihren Uplink nicht überlasten oder schlimmer noch den Zorn der Bandbreite auf sich ziehen Überkosten).
voretaq7
1
@ TimeToThine Haha, nicht wirklich. Ich versuche nur, neue Dinge zu lernen.
Arpit Tambi
2
REALISTISCHE Anfragen oder Bullhit-Anfragen? Ich meine im Ernst - ja, das ist machbar für kleine Dateien, aber nicht für "echte" Site-Anfragen.
TomTom
1
@ArpitTambi mit spärlicher Beschreibung seiner Testmethodik, keiner Ergebnistabelle / Nachweis der Reproduzierbarkeit usw.? Diese Ergebnisse sind weniger als wertlos . Ein theoretischer Maßstab für ein ideales System, das nur mit sich selbst (oder einem Zwilling über eine Back-to-Back-Kupferverbindung) in einem Vakuum spricht, hat praktisch NULL Beziehung zu praktischen Ergebnissen in der realen Welt mit Datenbanken, Switches, Routing, SSL (mehrere Protokolle) an mehrere Kunden).
voretaq7

Antworten:

13

Zunächst sollten Sie ein neues Benchmarking-Tool schreiben. Sie messen eigentlich abnicht nginx.

VBart
quelle
Ich denke, Sie haben Recht, da es keine Fehler in den Protokollen gibt und das Laden, die Festplattenaktivität und die Speichernutzung relativ gering bleiben.
Arpit Tambi
2
Richtig. Ich habe es versucht wrkund es gab mir 165K Anfragen / Sek.
Arpit Tambi
28

Arpit, wenn Sie sich vorstellen, dass die absolut kleinste wahrscheinliche Webantwort, selbst wenn es sich um eine statische Textdatei handelt, ein Ethernet-Paket (~ 1.500 Byte) ist, dann arbeiten 500.000 davon mit ungefähr 750.000.000 Bytes oder ungefähr 7,5 Gigabit. Es sei denn, Ihr Server hat 10-Gbit-NICs sehr einfach entladen (und dies ist nicht der Fall, und die Treiber, die Sie haben, sind hundertmal langsamer), und Sie haben die Treiber und den Kernel so eingerichtet, dass Sie einen dieser Links und die fast vollständig überfluten können Latenzen von Load-Balancern, Firewalls, Routern und Weiterleitungsverbindungen mit dieser Geschwindigkeit, dann werden Sie diese Leistung niemals erreichen können - selbst mit einer einzigen Paketantwort, was unwahrscheinlich ist. Letztendlich klingt 35k also nicht weit von Ihrem Limit entfernt.

Chopper3
quelle
2
? Ich mache solide 10 GB aus einzelnen ZXTM-NICs
Chopper3
3
"Portkollisionen" - 1 GbE und schneller können keine Kollisionen haben, es ist vollständig bidirektional.
Chris S
4
@ArpitTambi: Ich empfehle, Choppers Antwort zu lesen. Ihre Geduld wird belohnt.
Scott Pack
2
@ScottPack Diese Antwort ist perfekt für einen realen Anwendungsfall. Ich teste auf demselben Computer, sodass ein Engpass kein Netzwerk sein kann. Es ist entweder CPU, Speicher oder E / A.
Arpit Tambi
6
@ArpitTambi You should only ask practical, answerable questions based on actual problems that you face<- Ein Teil einer praktischen Frage ist, dass sie sich auf reale Anwendungsfälle bezieht. - Es gibt viele Möglichkeiten, einen Webserver so zu manipulieren, dass er zu schnell ist. Viele von ihnen brechen (oder werden sehr zerbrechlich) in der realen Welt, und Sie sind wahrscheinlich nahe an Ihrer praktischen Grenze. Abgesehen von der Jagd und dem Töten offensichtlicher Engpässe (siehe Jeff Ferlands Antwort) sagt Chopper3 , wie es ist - manchmal die Die richtige Antwort ist nicht das, was Sie hören möchten.
voretaq7
8

Lassen Sie uns den Engpass identifizieren. Da Sie sich auf demselben Computer befinden, können wir davon ausgehen, dass es sich entweder um CPU- oder Festplattenaktivität handelt. Bei der einen Textdatei sollte es sich nicht um Festplattenaktivität handeln, aber bei 35.000 Verbindungen können Sie auch pro Sekunde 35 MB Protokollierung generieren.

In den angezeigten Beispielen wird keine Zugriffsprotokollierung ausgeführt, sondern nur Fehler. In Ihrer Konfiguration ist jedoch noch viel mehr los, insbesondere die Protokollierung:

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;

Beginnen Sie mit dem Deaktivieren dieser Protokollierung und finden Sie dann heraus, wo Sie als nächstes aufgelegt werden. Beachten Sie auch, dass das Ausführen des Testclients auf demselben Computer erhebliche Auswirkungen auf den Server-Daemon haben kann. Hypertheading kann manchmal auch schädlich sein. Prüfen Sie daher, ob dies beim Ein- und Ausschalten besser für Ihre Last funktioniert.

Jeff Ferland
quelle
Danke, ich habe die Zugriffsprotokolle komplett deaktiviert. Aber das gleiche Ergebnis. Dieses Mal habe ich sorgfältig festgestellt, dass die Festplattenaktivität Null bleibt. 20 GB RAM sind kostenlos und die Serverlast beträgt weniger als 0,5. Es sieht so aus, als ob ein Engpass Serverkonfigurationen sind.
Arpit Tambi
1

Wenn Sie kurz hinter den Zahlen stehen [z. B. gibt es keinen wirklichen Anwendungsfall hinter diesem Test] - verwenden Sie die Funktion "Keep Alive" von http - führen Sie die Anzahl der Anforderungen über eine bereits offene TCP-Verbindung aus.

pQd
quelle
Ich teste auf demselben Computer. Geht localhost / test.txt über Netzwerkkarten? Ich werde Ihren Vorschlag versuchen und die Ergebnisse veröffentlichen.
Arpit Tambi
Sie testen nicht auf demselben Computer und der Zugriff über localhost erfolgt nicht über die Netzwerkkarten. Wenn Sie vom Host-System aus zugreifen, verschwenden Sie neben der Zustellung der Antwort auch Ressourcen für die Anforderung.
Zoredache
2
TCP Keepalive hat nichts mit Netzwerkkarten zu tun - Es ist eine Funktion der TCP / IP-Schicht (Transportschicht), nicht der physischen Schicht, und es wirkt sich localhostgenauso auf Verbindungen zu einem Remote-System aus. Für ein korrektes Benchmarking empfehle ich immer, Keepalive auszulassen (Benchmarks sollten pessimistisch sein und das Worst- Case-Szenario annehmen , in dem wir für jede Anfrage eine neue Verbindung eröffnen müssen), aber wenn alle Ihre Verbindungen Keepalive verwenden, können Ihre Benchmark-Zahlen sicherlich steigen.
voretaq7
1
@pQd ... was bedeutet, dass die ganze Frage Off Topic ist und ich bin nett, wenn ich sie nicht schließe, aber was noch wichtiger ist, wenn jemand mit einer begrenzten Menge an Hinweisen auf die Website kommt, müssen wir dieser Person genügend Hinweise geben Halten Sie sie davon ab, ihren eigenen Fuß abzuschießen. Arpit scheint den Punkt des Benchmarking nicht ganz zu verstehen, daher ist es meiner Meinung nach unverantwortlich, ihm zu sagen, wie man die Benchmark-Zahlen aufbläst, ohne Rücksicht darauf, wie dies in der realen Welt funktionieren wird.
voretaq7
1
@ voretaq7 - Es tut mir leid, aber ich stimme dir nicht zu und ich mag die Wut, die auf dem Vormarsch zu sein scheint, nicht. Ich denke, dass selbst der Versuch, solch ein seltsames Ziel zu erreichen, dazu führen kann, dass man etwas über das Innenleben des Betriebssystems / eines bestimmten Servers lernt.
pQd