关于性能需要熟悉的三个指标为:并发用户、响应时间、TPS(每秒事务处理个数)。
比如:单台服务器配置为32核CPU,64G内存, JVM内存6G,性能测试结果:平均响应时间为200ms,并发用户为300个,TPS为1500。为了满足未来发展的需要,系统的生产环境需要配备多台服务器,如:4台。
我发表一下对性能调优的一些看法,我觉得需要从以下几个方面着手做:
- 通讯
- 应用集群部署
- 缓存
- 资源动静分离
- 数据库集群(Orace Rac)
- SOA服务优化
1.1首先说一下通讯,通讯层面需要采取异步线程通讯模式,比如socket nio(Netty)异步线程通讯模式,此模式有负责接收消息的线程,有负责处理消息的线程,流水线模式分工协作。常使用的Tomcat6.0版本以后对8080端口的通讯监听就是采用的socket nio(Netty)异步模式。
1.2 说到通讯还需要提一下另外一种使用场景,在通讯层面采用队列(比如activemq)或者缓存(redis)。例如处理秒杀场景,并发量大,先将所有请求接收放入队列或者缓存,然后从队列或者缓存中获取部分请求处理,处理完一部分再获取一部分处理,直到秒杀结束(即库存不足)。如果秒杀结束,队列中还有消息未处理,那么将这些消息全部返回客户端,返回商品已售完。
2应用的集群部署,我们项目是采用ngnix做反向代理,将用户请求分发到集群环境中的不同服务器,降低了单个服务器的压力,起到负载均衡的作用,
(保持应用服务器【tomcat】的稳定)
同时,它带来了很多其他好处,比如:
增加系统的并发处理能力,可以处理更多的用户请求;
防止出现因某台服务器宕机而导致业务中断的单点故障,因为某台服务器出现故障时,ngnix反向代理会做到自动隔离该服务器,不再将请求转发到宕机的服务器;
可做到热部署,在上线过程中选择部分服务器重启,保证业务不间断运行。
3 缓存,我们项目采用redis做缓存服务器,将查询多修改少的数据放入缓存(比如:产品列表啊),页面显示产品列表时直接从缓存中获取,无需通过数据查询,减少IO操作,大大提高的查询的速度,同时也减轻了对数据库的压力。(保持数据库的稳定)
4 资源动静分离,项目里面如果存在大量的js、css、html、图片等静态资源,需要将这些静态资源单独部署到服务器(比如:阿里的CDN),然后通过远程连接地址(比如:http://192.168.2.1:8080/picture/dog.jpg)访问,可提高页面加载速度,同时减轻应用服务器的压力。
5 数据库集群部署,可防止数据库访问应用的单点故障,减轻数据库访问压力,我们公司dba工程师会将oracle部署为集群的rac模式(mysql为mycat模式),用到两台服务器安装数据库,两台服务器的数据库数据存储在同一块共享磁盘。
6 Soa服务优化,公司采用了dubbo分布式框架(基于SpringCloud、阿里巴巴的微服务架构),系统直接的接口调用通过dubbo,比如我们项目调用财务系统的支付接口,该接口就是由财务系统将地址发布到dubbo,然后我们写http客户端去调用dubbo,由dubbo将请求转发财务系统。