• Nginx和Tomcat调优


    一、Nginx和Tomcat定义

      tomcat 是一个中间件,在B/S架构中,浏览器发出的http请求经过tomcat中间件,转发到最终的目的服务器上,响应消息再通过tomcat返回给浏览器。tomcat更多用来做一个应用容器,让java web跑在里面的东西。

      nginx 常用做静态内容服务和反向代理服务器,以及页面前端高并发服务器。适合做负载均衡,直面外来请求转发给后面的应用服务(tomcat什么的)。

      nginx+tomcat响应速度明显要低于直接请求tomcat,性能不如直接请求tomcat,但是nginx由于多了中间一层转发,使得请求压力不会一次性都集中在tomcat上,因此nginx+tomcat的CPU明显低于直接请求tomcat,也大大避免了因请求量过大导致tomcat服务不可用。

      单点tomcat在不使用nginx的情况下,能承载的最多也就是200-300的并发量,而加上了nginx之后,能大幅度提升服务器的并发承载量,不仅仅是因为nginx可以做负载均衡(load-banlance),更重要的是nginx可以让请求进行排队,而不是将压力赋予给tomcat,这样tomcat可以更加专注地完成业务操作,从而提高性能。

    二、Nginx调优

      这里只说nginx的简单优化,即让nginx处理html静态文件,图片,css,js等非动态文件,动态文件交给tomcat处理,这样的话可以减轻tomcat的压力,再说对于这些静态文件来说,不是tomcat的强项,而是nginx的强项。

     2.1 静态资源配置

     请在nginx.conf中添加如下配置

    location ~ .*.(gif|jpg|jpeg|png|bmp|ico)$ {
    root /www/; #即图片存在的根路径
    expires 30d;#缓存时间
    }
    
    location ~ .*.(js|css)?$ {
    root /www/;#即图文件存在的根路径
    expires 10h;#缓存时间
    }
    2.2 进程数的优化

    一般nginx中,进程数一般设置为服务器cpu核数的倍数,例如:CPU为双核,则设置进程数目为4或者8,每个nginx进程消耗的内存10兆的模样

    worker_processes 8;
    2.3 将进程分配给制定CPU

    假如是8核 cpu 分配如下:

    worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
    2.4 Nginx最大打开文件数

    当使用linux时,最大文件打开数是有限制的。在linux中可使用ulimit –n来查看最大文件打开数,一般设置值为系统最大文件打开数除以最大进程数,但是大多数都是除不尽,导致资源分配不均匀,所以最好与最大进程数一致

    worker_rlimit_nofile 655350;
    2.5 Nginx的事件模型

    使用epoll 的I/O 模型

    use epoll;

    补充说明:
    与apache相类,nginx针对不同的操作系统,有不同的事件模型

    A)标准事件模型
    Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll

    B)高效事件模型
    Kqueue:使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD2.0 和 MacOSX. 使用双处理器的MacOSX系统使用kqueue可能会造成内核崩溃。

    Epoll: 使用于Linux内核2.6版本及以后的系统。

    /dev/poll:使用于 Solaris 7 11/99+, HP/UX 11.22+(eventport), IRIX 6.5.15+ 和 Tru64UNIX 5.1A+。

    Eventport:使用于 Solaris 10. 为了防止出现内核崩溃的问题,有必要安装安全补丁。

    2.6 最大连接数

    每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。

    worker_connections 655350;
    2.7 超时时间

    设置超时时间,默认的是60s,Nginx会自动踢出超时的连接,保持可用性。

    keepalive_timeout 90;
    2.8 客户端请求头部缓冲区大小

      客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页小。

    在Linux中,使用getconf PAGESIZE 来获得,并设置给nginx

    client_header_buffer_size4k;

    打开文件缓存大小

    这个默认是没有开启的,此参数将为打开文件指定缓存大小

    open_file_cachemax=65535 inactive=60s;

    open_file_cachemax为最大缓存大小,inactive为缓存多久没使用就进行回收

    2.9 检查缓存有效信息时间
    open_file_cache_valid80s;
    open_file_cache_min_uses1;

    open_file_cache 指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。

    2.10 开启gzip
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript text/css
    application/xml;
    gzip_vary on;

    nginx的5种负载均衡算法请跟进自身业务需要选择,此处不做阐述。

    三、Tomcat调优

    3.1 基础参数设置

    在server.xml中配置
    maxThreads:Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。
    acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
    connnectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
    minSpareThreads:Tomcat初始化时创建的线程数。
    maxSpareThreads:一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程
    3.2 Tomat的4种连接方式对比

    tomcat默认的http请求处理模式是bio(即阻塞型,下面第二种),每次请求都新开一个线程处理。下面做一个介绍

    <Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol" 
      connectionTimeout="20000" redirectPort="8443"/>
    <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000"
      redirectPort="8443"/>
    <Connector executor="tomcatThreadPool"
      port="8081" protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443" />
    <Connector executor="tomcatThreadPool"
      port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"
      connectionTimeout="20000"
      redirectPort="8443" />

    我们姑且把上面四种Connector按照顺序命名为 NIO, HTTP, POOL, NIOP。测试性能对比,数值为每秒处理的请求数,越大效率越高

    NIO   HTTP   POOL  NIOP
    281   65     208    365
    666   66     110    398
    692   65     66     263
    256   63     94     459
    440   67     145    363

    得出结论:NIOP > NIO > POOL > HTTP 虽然Tomcat默认的HTTP效率最低,但是根据测试次数可以看出是最稳定的。且这只是一个简单页面测试,具体会根据复杂度有所波动。

    配置参考:Linux系统每个进程支持的最大线程数是1000,windos是2000。具体跟服务器的内存,Tomcat配置的数量有关联。

    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
                  maxThreads="500" minSpareThreads="25" maxSpareThreads="250"
                  enableLookups="false" redirectPort="8443" acceptCount="300" connectionTimeout="20000" disableUploadTimeout="true"/>  
    3.3  Tomcat的集群

    Tomcat的部署,是一台服务器部署一个Tomcat(上线多个项目),还是一台服务器部署多个tomact(每个tomcat部署1~n个项目)。多核必选配置多个Tomcat,微服务多线程的思想模式。

    3.4  Tomcat内存设置

    修改/bin/catalina.sh,增加如下设置:

    JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'

    需要把这个两个参数值调大,大小的可以根据服务器内存的大小进行调整。例如:

    JAVA_OPTS='-Xms1024m –Xmx2048m'

    服务器是8G 内存,跑了3个tomcat服务,给分配了2G的内存,因为还有其他进程。

    以8核16G的服务器为例,服务器单点原本没配置优化参数,服务器承载量为1000个并发量,配置成功后,服务器动态并发访问为3000,按照并发适度冗余的原则同时在线用户为(3000/0.15=20000)。因此证明参数的配置非常有用,可以提高服务器的稳定性和性能。

  • 相关阅读:
    IntellJ IDEA 使用技巧之组件窗口设置
    记springboot + MP +Hikari动态数据源配置
    manjaro升级后_sogou输入法异常
    python_mysql库安装问题
    通讯录制作(.csv文件转.vcf文件即vcard格式)
    win10_bat _运行python程序
    yield()返回参数函数使用
    python交换两个整型数据的数值
    Mongodb 4.0+安装
    C# winform 记住密码实现代码
  • 原文地址:https://www.cnblogs.com/zeussbook/p/12882743.html
Copyright © 2020-2023  润新知