一、 性能测试指标
响应时间:执行一个操作需要的时间
操作 | 响应时间 |
打开网站 | 几秒:秒级 |
数据库查询 | 十几毫秒 |
机械磁盘读取数据 | 2毫秒 |
SSD读取数据 | 0.3毫秒 |
Redis读取数据 | 0.5毫秒 |
内存读取数据 | 十几微妙 |
网络传输2KB数据 | 1微妙 |
并发数:系统能同时处理请求的数目
吞吐量:单位时间内系统处理的请求数,TPS(T:事务)、HPS(H:HTTP)、QPS(Q:Query)
性能计数器:描述服务器、操作系统的一些数据指标:SystemLoad、内存使用、CPU使用、磁盘IO、网络IO
并发与吞吐量关系:
随着并发数由小到大,系统吞吐量逐步增加;
继续增大,吞吐量增加幅度变缓;
继续增大,吞吐量达到极限和拐点;
继续增大,吞吐量反而开始降低;
继续增大,达到系统崩溃点,系统资源耗尽,吞吐量为0;
SystemLoad:系统负载 = 当前正在被CPU调度进程数目 + 等待被CPU调度进程数目;
SystemLoad理想值 = 系统CPU核数,表示没有进程等待被CPU调度。
Top查看SystemLoad,三个浮点数,分别表示:1分钟、5分钟、15分钟的系统负载。
二、性能优化策略
性能测试结果不满足,则需要找到系统瓶颈、分而治之、逐步优化。
第一步:性能分析
1. 检查系统处理各个环节日志;
2. 分析各个处理环节耗时,各自耗时是否合理、符合预期;
3. 检查监控数据,分析影响性能的主要因素:内存、磁盘、网络、CPU中的哪一项;
4. 得出结论,性能问题到底是:代码自身问题,还是系统资源不足引起。
第二步:性能针对性优化
1. Web前端性能优化
a)减少http请求,合并css、js、合并图片;
b)使用缓存;
c)服务器和浏览器端对文件做压缩;
d)减少Cookie传输,哪些数据需要写入Cookie需要慎重考虑;
e)使用CDN、反向代理优化;
2. 应用服务器性能优化
a)使用分布式缓存(需要更新同步的JBoss Cache、互不通信的Memcached);
b)异步操作(很好的消峰作用);
c)使用服务集群,增加吞吐能力;
d)代码优化:多线程、资源复用(数据库连接池、socket连接池、线程池)、优化数据结构
最佳线程数 = [ 请求耗时/ (请求耗时 - IO等待时间)] * CPU内核数;
最佳线程数和CPU内核数量成正比,与IO时间成正比;
CPU计算型模块:线程数不能超过CPU内核数;
资源复用两种模式:单例、对象池
数据库连接对象创建好以后,将连接对象放入对象池中,应用程序要连接时候,直接从对象池中获取一个空闲的连接对象使用,使用完毕再将该对象归还到对象池中即可。
3. 存储服务器性能优化
a)使用SSD固态硬盘,而不是机械硬盘;
b)使用NoSQL数据库,而不是传统关系型数据库;
c)使用分布式文件系统HDFS,而不是传统RAID磁盘阵列;
HDFS:应用系统在整个存储集群的多台服务器上可以做数据并发读写和备份。
HDFS文件写入和管理:以Block为单位管理文件内容,一个文件被分割为若干个Block。
HDFS文件并发写入:当模块写文件时候,写完一个Block,HDFS就会自动将其复制到另外两台机器上,做到并发写入。保证每个Block都有三个副本,做到三副本互为冗余。
HDFS文件并发读取:通过MapReduce并行计算,同时读取文件的多个Block,并发读取和计算。
HDFS组成:NameNode + DataNode。NameNode:整个HDFS只部署一个实例,管理整个分布式文件系统的目录树;DataNode:部署在HDFS集群所有服务器上,提供真正的数据存储服务,存储内容数据。
应用程序调用HDFS Client写入HDFS文件时,首先访问NameNode,请求分配数据块。NameNode根据管理的DataNode的服务器的磁盘空间,按照一定负载均衡策略,分配若干个数据块,返回给HDFS Client。