jmeter测试,定制化内嵌tomcat调优

目标:java

  对tomcat线程扩容mysql

  对应的线程池作变动web

  keepAlive作优化spring

 

 

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

sudo vim //etc/hosts

在hosts末尾加上一句:数据库

120.79.75.103:miaoshaserver

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

3.在阿里云主机上:vim

  

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

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

top -H //能够查看端口信息

4.在tomcat

 

 

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

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的速度过慢,

 

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

相关文章
相关标签/搜索