性能测试的监控范围包括服务器(如操作系统-内核参数/进程/文件句柄、cpu、磁盘、内存)、中间件(如tomcat、nginx)、数据库(如mysql连接数/缓存命中率/锁)、 应用程序(如数据库设计不合理)。系统性能指标包括响应时间、并发用户数、错误率、TPS。 -----------------服务器-------------- >>CPU cpu资源利用率很高的话,需要看cpu消耗user、sys、wait哪种状态。cpu的要低于业界警戒值范围之内,即user%小于或者等于75%、sys%小于或者等于30%、wait%小于或者等于 5%。如果user%非常高,需要查看消耗在哪个进程,可以用top命令看出,接着用top -H -p <pid> 看哪个线程消耗资源高。如果java应用,就可以用jstack看出此线程正在执行的 堆栈,看资源消耗在哪个方法上,查看源代码就知道问题所在。如果sys%非常高,可以用strace看系统调用的资源消耗及时间。如果wait%非常高,考虑磁盘读写,可以通过 减少日志输出、异步或者换速度快的硬盘。 >>Memory 操作系统为了最大化利用内存,一般都设置大量的cache,因此,内存利用率高达99%并不是问题,内存的问题主要看某个进程占用的内存是否非常大以及是否有大量的swap(虚拟内存交换)。 >>磁盘I/O 磁盘I/O一个最显著的指标是繁忙率,可以通过减少日志输出、异步或换速度快的硬盘来降低繁忙率。 >>网络I/O 网络I/O主要考虑传输内容大小,不能超过硬件网络传输的最大值70%,可以通过压缩减少内容大小、在本地设置缓存以及分多次传输等操作提高网络I/O性能。 内核参数 内核参数一般都有默认值,这些内核参数默认值对于一般系统没有问题,但是对于压力测试来说,可能运行的参数将会超过内核参数,导致系统出现问题,可以用sysctl来查看及修改。 -----------------中间件-------------- 1.tomcat tomcat性能调优包括内存大小/回收策略、连接数、运营模式。查看服务器的状态,有JDK自带的jconsole工具工具可以方便的查看线程信息(此外还可以查看cpu、内存、类、jvm基本信息), 推荐使用Tomcat自带的manager工具,可以为tomcat服务器添加后台监控、VisualVM监控、GC监控。 >>内存大小/回收策略 JVM性能调优主要是内存调优、垃圾回收策略调优。设置tomcat/bin/catalina.sh文件中的JAVA_OPTS变量即可。JVM堆的大小应为物理内存的80%,-Xms和-Xmx分别设置 jvm的堆内存的初始大小和最大大小,-Xmn设置年轻代内存大小,sun官方推荐配置为整个堆的3/8.GC机制是需要组合使用的,新生代没有并发一说。 吞吐量优先的并行收集器(并行标识Parallel,经典配置如年轻代并行+年老代并行),-XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC,配置并行收集器 的线程数,此值最好配置与处理器数目相等。 响应时间优先的并发收集器(并发标识CMS,经典配置如年轻代并行+年老代并发),-XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection,最后一个参数设置运行多少次GC后对内存空间进行压缩、整理;打开对年老代的压缩。 >>连接数 主要关注acceptCount、maxConnections、maxThreads运行模式。 >>运行模式 Apr是在Tomcat上运行高并发应用的首选模式,但是需要安装apr、apr-utils、tomcat-native等包。 >>其他 compression=“on” 开启压缩功能。 compressionMinSize:2kb 启用压缩的输出内容大小。默认2kb。 compressableMimeType:text/html,text/javascript,text/css 压缩文件类型 2.nginx 对于nginx的调优,可以大致从如下指令入手: work_processes 表示工作进程的数量,一般情况设置成cpu核心的数量即可。 work_connections 单个工作进程可允许同时建立外部连接的数量,根据系统的最大打开文件数来调整。 Gzip 开启Gzip,gzip可以帮助Nginx减少大量的网络传输工作。 sendfile on 不但能减少切换次数而且还能减少拷贝次数 tcp_nopush on 与sendfile on搭配使用 ---------------数据库------------ >>连接数 关注数据库最大连接数max_connection和历史使用最高连接数max_used_connection,如何判断数据库连接池被占满呢?查看线程占用的连接数(Threads_connected)和 数据库本身连接池max_connections的配置。同时关注应用程序中配置的最大连接数jdbc.master.maxActive >>慢查询/死锁/索引 开启日志,记录慢查询long_query_time。 开启记录死锁innodb_print_all_deadlocks=1。 开启未使用索引sql过滤log_queries_not_using_indexes=1。 >>缓存命中率 缓存分为两个维度,查询缓存Query cache和存储引擎InnoDB_Buffer_Pool,qcache是sql语句对应的结果集,buffer pool中的缓存是表中的索引、数据、插入数据时的缓存。 Query Cache 查看缓存结果show status like '%Qcache%',主要看Qcache_hits,表示有多少次命中缓存,该值越大越好; Query Cache命中率=(Qcache_hits/(Qcache_hits+Qcache_inserts))*100%。 在mysql配置文件中添加查询缓存参数,如下 query_cache_type=1 开启查询缓存 query_cache_size=128M 分配给查询缓存的总内存,一般建议不超过256M query_cache_min_res_unit=4096 分配内存块时的最小单位大小 query_cache_wlock_invalidate=OFF 如果某个数据表被锁住,是否仍然从缓存中返回数据,默认是OFF,表示仍然返回 InnoDB_Buffer_Pool Buffer pool是设置的越大越好,一般设置为服务器物理内存的70%。在mysql配置文件中设置pool缓存参数,如下 innodb_buffer_pool_size=512M