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