使用 Go 对 Nginx 进行性能测试

目前有很多提供Go语言HTTP应用服务的方法,但其中最好的选择取决于每个应用的实际情况。目前,Nginx看起来是每个新项目的标准Web服务器,即使在有其他许多不错Web服务器的情况下。然而,在Nginx上提供Go应用服务的开销是多少呢?我们需要一些nginx的特性参数(vhosts,负载均衡,缓存,等等)或者直接使用Go提供服务?如果你需要nginx,最快的连接机制是什么?这就是在这我试图回答的问题。该基准测试的目的不是要验证Go比nginx的快或慢。那将会很愚蠢。

下面是我们要比较不同的设置:

Go HTTP standalone (as the control group)

Nginx proxy to Go HTTP

Nginx fastcgi to Go TCP FastCGI

Nginx fastcgi to Go Unix Socket FastCGI

硬件

因为我们将在相同的硬件下比较所有设置,硬件选择的是廉价的一个。这不应该是一个大问题。

Samsung 笔记本 NP550P5C-AD1BR

Intel Core i7 3630QM @2.4GHz (quad core, 8 threads)

CPU caches: (L1: 256KiB, L2: 1MiB, L3: 6MiB)

RAM 8GiB DDR3 1600MHz

软件 设置 内核

只需很小的一点调整,将内核的limits调高。如果你对这一变量有更好的想法,请在写在下面评论处:

fs.file-max                    9999999
fs.nr_open                    9999999
net.core.netdev_max_backlog    4096
net.core.rmem_max              16777216
net.core.somaxconn            65535
net.core.wmem_max              16777216
net.ipv4.ip_forward            0
net.ipv4.ip_local_port_range  1025      65535
net.ipv4.tcp_fin_timeout      30
net.ipv4.tcp_keepalive_time    30
net.ipv4.tcp_max_syn_backlog  20480
net.ipv4.tcp_max_tw_buckets    400000
net.ipv4.tcp_no_metrics_save  1
net.ipv4.tcp_syn_retries      2
net.ipv4.tcp_synack_retries    2
net.ipv4.tcp_tw_recycle        1
net.ipv4.tcp_tw_reuse          1
vm.min_free_kbytes            65536
vm.overcommit_memory          1

Limits

供root和www-data打开的最大文件数限制被配置为200000。

Nginx

有几个必需得Nginx调整。有人跟我说过,我禁用了gzip以保证比较公平。下面是它的配置文件/etc/nginx/nginx.conf:

user www-data;
worker_processes auto;
worker_rlimit_nofile 200000;
pid /var/run/nginx.pid;

events {
    worker_connections 10000;
    use epoll;
    multi_accept on;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 300;
    keepalive_requests 10000;
    types_hash_max_size 2048;

open_file_cache max=200000 inactive=300s;
    open_file_cache_valid 300s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;

server_tokens off;
    dav_methods off;

include /etc/nginx/mime.types;
    default_type application/octet-stream;

access_log /var/log/nginx/access.log combined;
    error_log /var/log/nginx/error.log warn;

gzip off;
    gzip_vary off;

include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*.conf;
}

Nginx vhosts

upstream go_http {
    server 127.0.0.1:8080;
    keepalive 300;
}

server {
    listen 80;
    server_name go.http;
    access_log off;
    error_log /dev/null crit;

location / {
        proxy_pass ;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

upstream go_fcgi_tcp {
    server 127.0.0.1:9001;
    keepalive 300;
}

server {
    listen 80;
    server_name go.fcgi.tcp;
    access_log off;
    error_log /dev/null crit;

location / {
        include fastcgi_params;
        fastcgi_keep_conn on;
        fastcgi_pass go_fcgi_tcp;
    }
}

upstream go_fcgi_unix {
    server unix:/tmp/go.sock;
    keepalive 300;
}

server {
    listen 80;
    server_name go.fcgi.unix;
    access_log off;
    error_log /dev/null crit;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/e388619cb5f9e83d19dd66ab302f7c3f.html