数据库连接池
maxWait
表示从池里获取连接的等待时间
可以设置一个比较短的时间,否则会因为长时间等待获取连接,在高并发场景下,导致连接池瞬间<br>耗尽,大量的请求卡死在这里等待获取连接,进而导致tomcat里没有可用的线程(造成服务的假死)
connectionTimeout和socketTimeout
高并发场景下,万一遇到网络问题,可能导致你跟数据库的socket连接异常无法通信,<br>此时socket可能一直卡死等待某个请求的响应,然后其他请求无法获取连接,只能重启系统重新获取
设置超时时间后,可用让网络异常之后,连接自动超时断开
两个参数分别代表建立tcp连接的超时时间,以及发送请求后等待响应的超时时间
maxActive
最大连接池数量,一般设置20就够了,如果有高并发场景,可用适当增加3-5倍,太多的话会导致cpu负载很难高,<br>导致性能降低
更应该优化每个请求的性能,别让一个请求占用连接太长的时间
tomcat
尽量不要在一个tomcat下创建多个虚拟主机,而是每个站点一个实例(即启动多个tomcat)<br>因为tomcat是多线程,共享内存,任何一个虚拟主机中的应用出现崩溃,都会影响所有应用程序
压缩会增加tomcat负担,最好采用nginx + tomcat,将压缩交给nginx
参数设置
acceptCount
当客户端接收请求,进行三次握手创建连接后把连接放入accept队列
maxConnections
acceptor线程读取accept队列中的连接,交给线程池处理请求,当处理的连接数超过<br>maxConnections,读取accept队列的线程会阻塞
maxThreads
处理连接请求的最大线程数
不能设置过大,因为jvm每个线程会占用1M空间,应结合虚拟机配置设置该值,<br>并发数量过大,可以设置tomcat集群,通过nginx分发请求
数据库
sql调优
mysql为例
查看慢查询日志,然后用explain、profile等逐步调优,最后经过测试<br>达到效果后上线
架构层面调优
定期跟踪一些指标数据是否达到瓶颈,达到时就要考虑做如下优化
读写分离
多从库负载均衡
水平和垂直分库分表
连接池优化
结合当前使用连接池的原理,具体的连接池监控数据和当前业务量<br>作一个综合的判断,通过反复的几次调试得到最终的调优参数
异步
使用场景
针对某些客户端请求,在服务端可能需要针对这些请求做一些附属的事情,<br>这些事情其实用户并不关系或者不需要立即拿到这些事情的处理结果
作用
缩短接口响应时间
避免线程长时间处于运行状态,会引起服务线程池的可用线程长时间不够用
线程长时间处于运行状态,可能会引起系统性能下降
常见方法
额外开辟线程,在IO线程(处理请求响应)之外的线程来处理相应的任务,<br>如果任务设计的数据量非常大,可用引入阻塞队列作进一步优化
使用消息队列
NoSQL
使用场景
如果业务数据不需要和其他数据作关联,不需要事务或者外键之类的支持,<br>而且有可能写入会异常频繁
比如记录异常日志,如果应用系统发生严重故障的时候,可能<br>会短时间产生大量exception数据,如果选择关系型数据库,会造成<br>数据库的瞬间写压力