zoukankan      html  css  js  c++  java
  • jmeter测试,定制化内嵌tomcat调优

    目标:

      对tomcat线程扩容

      对应的线程池做变更

      keepAlive做优化

    1.修改主机的host,dns解析优先解析主机上hosts的地址:

    sudo vim //etc/hosts

    在hosts末尾加上一句:

    120.79.75.103:miaoshaserver

    2.在jmeter的高级中设置成java,并且将keepAlive的选项打勾,,这样可以将损耗降到最小

    3.在阿里云主机上:

      

    pstree -p 16644  //16644是程序的端口号

    pstree -p 16644 | wc -l. //可以查看默认tomcat总共起了几个端口

    top -H //可以查看端口信息

    4.在

    5.经验来说4核8g的虚拟机最合适的最大线程数为800,最小的100是为了解决突发问题,当有请求突发访问的时候可以解决。继续vim application.properties

    server.port=8090
    spring.tomcat.accept-count=1000 //队列等待长度
    spring.tomcat.max-threads=800   
    spring.tomcat.min-spare-threads=100

     重启:./deploy.sh &

    6.之后使用jmeter工具测试后发现(2000个线程,10秒,100次循环),用pstree -p 16644 | wc -l 后发现最大的tomcat线程数达到了472个,在之前只有40个。

    7.再次强调jmeter中keepAlive选项要打勾的原因:服务端与客户端链接的时候,客户端访问服务端建立一个keepAlive的链接,用处就是,当客户端请求服务端响应之后,服务端不要立马断开链接,而是等待着尝试着复用链接,解决了http响应的无状态的每次都要断开链接造成的耗时问题,最早的http1.0的时候是没有keepAlive的请求的,因为资源稀缺,你想,如果每次都客户端请求完都keepAlive不断开,那么服务端的链接数很快就会被用完了。长链接有个好处就是不用每次都断开又新建,减少时耗,尤其是现在很多手机移动端和复杂网络,用户需要不断访问服务端,这样就只要传输数据就可以了,但是这样也有两个问题:

      1.比如有的用户之后就没后续操作了,就把网页放在那里了,那这个长链接就是个废链接。

      2.ddos的攻击,一些恶意者发起的攻击,也就是发送很多无脑的包,成为攻击者开的后门。

      因此需要定制化tomcat的内嵌化开发,这些定制都是在服务端上的

    最后。

      创建config包,并创建WebServerConfiguration类:当spring容器加载完容器的最后还有一次可以修改,即利用http11NioProtocol定制化需求

    package com.imooc.miaoshaproject.config;
    
    import org.apache.catalina.connector.Connector;
    import org.apache.coyote.http11.Http11NioProtocol;
    import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
    import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
    import org.springframework.boot.web.server.ConfigurableWebServerFactory;
    import org.springframework.boot.web.server.WebServerFactoryCustomizer;
    import org.springframework.stereotype.Component;
    
    
    //当spring容器内没有TomcatEmbededServletContainerFactory这个bean时,会把此bean加载进来
    @Component //让springboot可以把它加载为一个bean
    public class WebServerConfiguration implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
        @Override
        public void customize(ConfigurableWebServerFactory factory) {
    //        使用对应工厂类提供给我们的接口定制化我们的tomcat connector
            ( (TomcatServletWebServerFactory)factory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
                @Override
                public void customize(Connector connector) {
                   Http11NioProtocol protocol= (Http11NioProtocol) connector.getProtocolHandler();
                   //定制化keepAliveTimeOut
                    protocol.setSelectorTimeout(30000);//30s,30s没有请求服务,自动断开
                    //当请求超过10000条就自动断开keepAlive链接
                    protocol.setMaxKeepAliveRequests(10000);
    
                }
            });
    
    
        }
    }

       最后在来说一关于单机4核8g的线程数的拐点,经过压力测试可以得出经验是在800,虽然说服务器的tps吞吐量会随着线程数的增多而增多,,但是如果线程数超过了配置的对应拐点后,反而不会增多,因为cup处理不过来这么多线程,忙于线程调度,吞吐量自然上不去。

      当线程超过800后会进入缓冲池,但是也不能太长,因为太消耗内存了,队列出队也消耗cpu,所以设置在1000-2000左右就可以了,超过的就拒绝链接

      这次压测主要是数据库mysqld的速度过慢,

    一般情况下主键查询和唯一索引查询是能接受的查询,一旦到非唯一索引查询,尤其对大企业而言,比如订单状态查询订单,这种几近于全表扫描对数据库的压力是很大的,企业不会接受这种情况。所以后期一般都会分库分表,扩容数据来解决。

  • 相关阅读:
    重载
    两数之和
    求二叉树层序遍历
    最小的K的个数
    二分查找
    实现二叉树先序,中序,后序
    判断 链表中是否有环
    设计LRU缓存结构
    排序
    反转链条
  • 原文地址:https://www.cnblogs.com/gaoqiaoliangjie/p/11047910.html
Copyright © 2011-2022 走看看