nginx+2tomcat负载问题,快疯了

maput912 发布于 2016/10/12 10:38
阅读 1K+
收藏 2

需求5000人同时在线考试,考虑有可能出现5000并发的情况,做nginx+tomcat负载遇到一些疑问

1、对单个tomcat做压力测试

2、nginx+2个tomcat,在一台电脑上测试,

3、nginx+2个tomcat,nginx在一台电脑上,2个tomcat分别在不同的电脑上

以上数据库都是和nginx服务在一台电脑,测试工具jmeter

疑问:

1、第二种情况测试时效果和第一种差不多,没有明显的并发提升

2、第三种情况的效果还不如第二种测试结果

nginx配置:


#user  nobody;
worker_processes 4;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

worker_rlimit_nofile 65535;

events {
      #Linux下打开提高性能  
    #use epoll;  
    worker_connections  65535;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

        client_header_timeout       3m;
    client_body_timeout         3m;
    send_timeout                3m;
    client_header_buffer_size           16k;
    large_client_header_buffers         4 32k;
    server_names_hash_max_size          512;
    server_names_hash_bucket_size       64;
    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    limit_req_zone $binary_remote_addr zone=http:10m rate=10r/s;
    limit_req_zone $http_user_agent zone=useragenttrack:10m rate=10r/s;


    log_format  main  ' $remote_user [$time_local]  $http_x_Forwarded_for $remote_addr  $request '  
                                             '$http_x_forwarded_for '                       
                                             '$upstream_addr '                        
                                             'ups_resp_time: $upstream_response_time '                        
                                             'request_time: $request_time';

    access_log  logs/access.log  main;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    include  gzip.conf;
    include  proxy.conf;
    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 128k;
    
    
        upstream  127.0.0.1{
                 ip_hash;
         server 127.0.0.1:18006 max_fails=2 fail_timeout=10s;
         server 127.0.0.1:18011 max_fails=2 fail_timeout=10s;
         keepalive 128;
    }
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

                #location ~ \.(js|css|ico|png|jpg)$ {  
        #     root G:\tomcat1\webapps\ucanmax;
        #     expires 30d; #缓存30天
           #}

                location / {
            proxy_redirect          off;    
            proxy_set_header        Host            $host;    
            proxy_set_header        X-Real-IP       $remote_addr;    
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;    
            client_max_body_size    10m;    
            client_body_buffer_size 128k;    
            proxy_buffers           32 4k;  
            proxy_connect_timeout   3;    
            proxy_send_timeout      30;    
            proxy_read_timeout      30;   
            proxy_pass http://127.0.0.1;
            proxy_http_version 1.1;
                    proxy_set_header Connection "";
        }
        
           
           #设定查看Nginx状态的地址
                location /ns {
                    stub_status on;
                    access_log on;
                    auth_basic "ns";
                    
                    #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
                }
        #location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
        #    root r/cms/ ;
        #    expires 30d; #缓存30天
        #}
        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        #error_page   500 502 503 504  /50x.html;
        #location = /50x.html {
        #    root   html;
        #}

        # 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$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

测试nginx也做了分发,分别把请求发到两个tomcat上了,但就是并发提高不上去,实在想不明白了,盼有缘人能帮下


加载中
2
光石头
光石头
注释掉  ip_hash;
maput912
maput912
用jmeter发起的请求都是同一IP??
maput912
maput912
好的
1
公孙二狗
公孙二狗
upstream  127.0.0.1{
                 ip_hash;
         server 127.0.0.1:18006 max_fails=2 fail_timeout=10s;
         server 127.0.0.1:18011 max_fails=2 fail_timeout=10s;
         keepalive 128;

    }

  1. ip_hash 用 jmeter 访问的都是同一台服务器
  2. 你这个负载都是同一台机器上的 2 个不同 tomcat 啊

maput912
maput912
测过放到两个不同IP上,效果也不好
maput912
maput912
哦,如果都是同一IP的话确实,我试试
0
nubo
nubo
tomcat没做业务处理么?做了的话有关联系统吗?建议直接拿个空白tomcat先做测试。
看看nginx的log,才好定位问题。
maput912
maput912
tomcat没有做业务,只是显示了个页面
0
zn123
zn123
    #Linux下打开提高性能  

    #use epoll;  

为啥不开, 别告诉我你用windows

linux 也要优化系统, tomcat本来 负载就差

maput912
maput912
windows测得话问题在哪?
eechen
eechen
回复 @maput912 : 在Windows上测试个蛋Nginx呀,统一开发和生产环境,还是用Ubuntu桌面和Ubuntu服务器吧,免得在Windows上做无谓的折腾.
maput912
maput912
是win7,测试
0
沧海_Sea
沧海_Sea
tomcat的配置呢
0
jobell
jobell
访问ip没变,最终都是分发到同一台tomcat上了。
maput912
maput912
我试试不用ip_hash分发
0
小木头的冬天
小木头的冬天

访问ip没变,最终都是分发到同一台tomcat上了。


maput912
maput912
我试试去掉ip_hash
0
eechen
eechen
首先要提醒楼主,在Windows上拿Nginx来测试,意义不大,因为Windows版本Nginx仅供开发使用,Nginx的主场是Unix like的Linux和BSD.

假设在一台电脑上同时部署Nginx和Tomcat,压测一个纯Java处理的请求(没有其他静态资源的请求),性能可以说是不如直接压测Tomcat的.为什么?因为Nginx和Tomcat之间多了一层TCP通信,高并发的时候这开销可不小呀.

生产环境使用Nginx+Tomcat的好处在于Nginx能全部负责处理静态请求,Tomcat就能专注于处理Java请求了.而且Nginx还能很轻松实现扩展,可以在upstream部署多套Tomcat实现集群和容灾.Nginx还有一些Tomcat没有的专业的HTTP服务器特性.

所以,你测试应该有针对性,定下基调采用Nginx+Tomcat准没错,而且应该在Linux上测.
maput912
maput912
另外,我下午已经布到linux系统,nginx+3个tomcat,都在一个电脑上,给这个做压力和给一个tomcat(不加nginx)效果差不多
maput912
maput912
谢谢指教
0
车开源
车开源
请问Tomcat是否使用APR呢?而且强烈建议在Linux上跑
maput912
maput912
回复 @车开源 : 我一直奇怪的是我压单个tomcat 和 nginx+2个tomcat,后者的效果和前者并发基本没啥区别,甚至还不如前者?甚至我把2个tomcat分别放到两台电脑上也没啥提高
车开源
车开源
回复 @maput912 : 如果20M的话,我知道你测压为什么一直上不去了。可能500左右的并发就耗尽了你的带宽,无论怎么优化配置也是没用。就好像一道门口只能同时通过1个人,尽管门后边的广场可以容纳1000人,但是单位时间内能进入广场的人数是由门口的大小控制的。
maput912
maput912
回复 @车开源 : 是网络带宽,我试试
车开源
车开源
回复 @maput912 : 20M指带宽吗?如果是也太小了吧。可以用个简单办法一一排查瓶颈在哪。1、先去掉数据库,直接放一个简单jsp面(至于页面内做什么具体操作自己定,反正就是不要有数据连接),这时测压。要是测压上去了,问题有可能在数据库那边。如果问题依旧就单独试前端的Nginx(直接用Nginx跑静态页,看看并发能上多少,不要连接后端Tomcat)。
maput912
maput912
回复 @车开源 : 另外,用redis做session缓存,单台tomcat压力能到500,但是用两个tomcat测压,和一个tomcat的效果差不多,没有明显的提高,环境还是windows,这正常吗?后台我把两个tomcat分别放到两个不同的电脑,nginx放到一台电脑,效果还不如我放到一台电脑上的效果,我就有点奇怪??
下一页
0
高山流水情
高山流水情

以前做过300人在线考试的,单个tomcat无压力。

主要修改了tomcat最大线程数,数据库连接池,mysql最大连接数三个配置。

maput912
maput912
单个tomcat目前也没啥问题,现在客户要求5000,测负载的时候有些测试结果把我搞蒙了
返回顶部
顶部