Como conseguir 500 mil pedidos por segundo no meu servidor web? [fechadas]

6

Eu recentemente ofereci a mim mesmo um novo servidor dedicado e estou tentando tirar o máximo proveito dele, por diversão e aprendizado.

Estou tentando atingir o máximo de solicitações por segundo que este servidor pode suportar e com o objetivo de 500 mil solicitações / seg., conforme mencionado aqui - link

Detalhes do servidor

Intel® Xeon® E3-1270 4 Cores (8 HT) x 3.4 GHz

RAM 24 GB DDR3 ECC

Hard-disk space 2,000 GB (2 x 2,000 SATA) RAID Software RAID 1

Lan 100mbps

OS Centos 6.3 64 bit

Nginx

Eu posso alcançar apenas 35 mil solicitações por segundo para um arquivo txt estático. Estou executando o benchmark na mesma máquina. Estou ciente dos limites da NIC e da sobrecarga da rede

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

Atualizar - 165 mil solicitações / seg

Eu tentei outra ferramenta de benchmarking chamada wrk e ela me deu 165 mil requisições / seg. Tão legal!

Atualização 2 - 250 mil solicitações / seg

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

}
    
por Arpit Tambi 17.07.2012 / 17:47

4 respostas

12

Antes de mais nada, você deve escrever uma nova ferramenta de benchmarking. Você está realmente comparando ab não nginx .

    
por 17.07.2012 / 23:03
27

Arpit, se você imaginar que a resposta da Web provavelmente menor, mesmo se for um arquivo de texto estático, é um pacote Ethernet (~ 1.500 bytes), então 500.000 deles funcionam em torno de 750.000.000 bytes, ou aproximadamente 7,5 gigabits. Então, a menos que seu servidor tenha facilmente descarregado NICs de 10Gb (e não, o que você tem é cem vezes mais lento) e tenha configurado os drivers e o kernel para permitir que você encha quase completamente um desses links, mais o latências de balanceadores de carga, firewalls, roteadores e conexões progressivas a essa taxa, então você nunca conseguirá atingir esse tipo de desempenho - mesmo com uma única resposta de pacote, o que é improvável. Então, finalmente, 35k soa não muito longe do seu limite.

    
por 17.07.2012 / 18:11
8

Vamos identificar o gargalo. Como você está na mesma máquina, podemos supor que seja uma atividade da CPU ou do disco. Para o arquivo de texto, não deve ser atividade de disco, mas em conexões de 35k, você pode estar gerando 35MB de registro a cada segundo também.

Os exemplos que você está mostrando não executam o log de acesso, apenas erros. Sua configuração, no entanto, tem muito mais acontecendo, o registro em particular:

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;

Comece desativando esse registro e depois descubra onde você está ficando preso no próximo. Considere também que a execução do cliente de teste na mesma máquina pode ter um impacto notável no daemon do servidor. Hipertensão também pode se tornar prejudicial às vezes, então explore se isso funciona melhor para a sua carga quando ligado ou desligado.

    
por 17.07.2012 / 18:38
1

se você estiver logo após os números [por exemplo, não há caso real de uso por trás deste teste] - faça o ab usar o recurso keep alive do número de solicitações http - execute sobre a conexão TCP já aberta.

    
por 17.07.2012 / 18:14