各项配置:
my.cnf
[client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock skip-external-locking key_buffer_size = 16M max_allowed_packet = 1M myisam_sort_buffer_size = 8M log-bin=mysql-bin binlog_format=mixed server-id = 1 #update start max_connections=1500 query_cache_size=16M default-storage-engine=INNODB #table_cache=256 tmp_table_size=8M thread_cache_size=8 read_buffer_size=64K read_rnd_buffer_size = 256K net_buffer_length = 8K table_open_cache = 32 sort_buffer_size = 256K innodb_additional_mem_pool_size=2M innodb_flush_log_at_trx_commit=0 innodb_log_buffer_size=4M innodb_buffer_pool_size=32M innodb_log_file_size=128M innodb_thread_concurrency=1 #update over [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout
Tomcat配置
catalina.sh头
JAVA_OPTS="-server -XX:PermSize=82M -XX:MaxPermSize=82M -Xss256k -Xms450m -Xmx450m -Xmn300m -XX:SurvivorRatio=6 -Xverify:none -XX:MaxTenuringThreshold=15 -XX:+UseFastAccessorMethods -XX:+UseAdaptiveSizePolicy -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.137.233"
server.xml连接器(因为瓶颈不在连接器,所以暂未使用apr连接器)
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="45000" redirectPort="8443" maxHttpHeaderSize="4096" disableUploadTimeout="true" enableLookups="false" bufferSize="4096" />
程序中的连接池配置
jdbc.driverClass=com.mysql.jdbc.Driver #jdbc.jdbcUrl=jdbc:mysql://192.168.137.200:3306/story?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&useServerPrepStmts=true&cachePrepStmts=true&prepStmtCacheSize=128&prepStmtCacheSqlLimit=512&autoReconnect=true jdbc.jdbcUrl=jdbc:mysql://localhost:3306/story?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&useServerPrepStmts=true&cachePrepStmts=true&prepStmtCacheSize=32&prepStmtCacheSqlLimit=256&autoReconnect=false&metadataCacheSize=16&maintainTimeStats=false&cacheResultSetMetadata=true&useNewIO=true&emptyStringsConvertToZero=false&maxRows=30 jdbc.user =root jdbc.password=111111 jdbc.miniPoolSize=300 jdbc.maxPoolSize=1500 jdbc.initialPoolSize=300 jdbc.maxIdleTime = 120000 jdbc.acquireIncrement=30 jdbc.acquireRetryAttempts = 40 jdbc.acquireRetryDelay=120000 jdbc.testConnectionOnCheckin = true jdbc.automaticTestTable = test jdbc.idleConnectionTestPeriod = 30000 jdbc.checkoutTimeout=65000
调整8-将热点数据news的数据集list缓存到HashMap中
这是最后的办法了,没有办法的办法,简单缓存数据集到本地内存。这里假设热点数据是news数据集,关键代码如下
String sqlString = sql.toString()+rowStartIdxAndCount[0]+rowStartIdxAndCount[1]; readLock.lock(); if(cache.containsKey(sqlString)){ readLock.unlock(); return cache.get(sqlString); }else{ readLock.unlock(); writeLock.lock(); List<NewsBean> list = (List<NewsBean>) quaryGridListPrepare(sql.toString(), NewsBean.class, rowStartIdxAndCount[0], rowStartIdxAndCount[1]); cache.put(sqlString, list); writeLock.unlock(); return list; } /* return (List<NewsBean>) quaryGridListPrepare(sql.toString(), NewsBean.class, rowStartIdxAndCount[0], rowStartIdxAndCount[1]); */ } private Map<String,List<NewsBean>> cache = new HashMap<String,List<NewsBean>>(); private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); private Lock readLock = rwl.readLock(); private Lock writeLock = rwl.writeLock();
之后再将mysql的配置修改,将资源调小一点(其实最大连接数也可以调小)
#update start max_connections=1500 query_cache_size=16M default-storage-engine=INNODB #table_cache=256 tmp_table_size=8M thread_cache_size=8 read_buffer_size=64K read_rnd_buffer_size = 256K net_buffer_length = 8K table_open_cache = 16 sort_buffer_size = 256K innodb_additional_mem_pool_size=2M innodb_flush_log_at_trx_commit=0 innodb_log_buffer_size=4M innodb_buffer_pool_size=16M innodb_log_file_size=128M innodb_thread_concurrency=1 #update over
给JVM再多一点点内存空间
JAVA_OPTS="-server -XX:PermSize=82M -XX:MaxPermSize=82M -Xss256k -Xms480m -Xmx480m -Xmn320m -XX:SurvivorRatio=4 -Xverify:none -XX:MaxTenuringThreshold=20 -XX:+UseFastAccessorMethods -XX:+UseAdaptiveSizePolicy -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.137.233"
1500并发,准备9s循环6次。
走势图
报告
平稳后,TPS上升到了267/S。平均在250~270之间
这里是一个理想的场景,实际情况是:根据日志,进行离线分析(hadoop)可以分析出哪些表是热点表,哪些sql是热点sql,哪些数据是热点数据。之后利用缓存策略,再将其缓存。再利用读写锁,进行缓存操作,TPS上升上去。此刻场景仅仅将news表作为热点表,其实不科学也不严谨,不过表明一点,此方案在内存十分有限的情况下,可行。只不过得权衡缓存数据的大小,以便让缓存的命中率(hit count)高一些,别浪费哪些内存资源。
JVM堆内存走势(因新生代空间比例较大,所以波浪较为明显)
到底哪些数据应该放入缓存,这是一个长期的监控数据分析后得出的结论。根据经验估算,此单点机器所有功能都用上后,缓存再稍微改造成普适性接口,基本TPS可以平均维持在100/s左右的数值。
调优顺序(根据场景,制定不同时期的2/8原则):http请求数>数据库连接>数据库优化>日志IO节省>Java业务代码优化>JVM优化>热点数据缓存>操作系统内核参数优化,之后在根据此顺序迭代进行(如果你是个吞吐量达人)。其中Mysql、Sql语句、缓存机制、操作系统内核参数还有进一步优化的余地。
(未完,待续)
标记:23页,阶段性总结之前
相关推荐
性能测试调优分析是软件开发过程中的重要环节,旨在确保应用程序在高负载和大量并发用户情况下仍能保持高效稳定的工作状态。在这个过程中,我们通常关注响应时间、吞吐量、并发用户数等关键指标,通过一系列测试手段...
12. 高可用性设计 通过冗余硬件、故障切换机制、健康检查等手段,确保系统的高可用性,防止单点故障影响整个系统。总的来说,大型Java Web项目的架构和部署调优需要综合考虑各个层面,包括应用架构、数据库设计、...
- **测试路径**:压力测试机→Web服务器→应用服务器→数据库→挡板。 - **测试环境**:详细说明了测试中使用的资源和工具。 - **测试内容**:针对登录交易和登录+理财交易,分别设置了50和200个虚拟用户进行压力...
- 调整系统架构,如采用负载均衡策略分散压力,避免单点过载。 - 代码优化,减少不必要的计算和内存占用,提高程序运行效率。 - 数据库优化,例如索引调整、查询优化,以提高数据处理速度。 7. **结论** - TWMP...
在Java开发过程中,性能测试与调优是提升系统效率的关键环节。这个主题涵盖了广泛的实践和技术,包括JDK优化和Tomcat服务器的优化。下面将详细阐述这些知识点。 首先,我们来探讨JDK优化。JDK(Java Development ...
针对Web应用,"Web Stress"是一种常用的系统测试工具,专门用于模拟大量并发用户访问,以测试Web服务器和应用程序的负载承受能力、性能瓶颈以及稳定性。这类工具通过模拟真实世界中的用户行为,对Web服务进行高强度...
- **JMeter**:开源性能测试工具,适合Web应用的压力测试。 - ** Gatling**:轻量级、高性能的负载测试框架,用于Web应用。 在实际测试过程中,还需要关注系统的稳定性、响应时间的分布、错误率等关键指标,以全面...
2. **测试环境**:在实际生产环境之前,在模拟真实负载的测试环境中进行充分的测试,确保各项调优措施的有效性。 3. **版本兼容性**:注意检查所使用的软件版本之间的兼容性问题,避免因版本不匹配而导致的问题。 #...
例如,使用Selenium进行Web界面的功能测试,JMeter进行性能压力测试,AppScan进行安全性扫描。 4. **持续集成与自动化测试**:CI/CD(持续集成/持续部署)流程强调频繁集成和自动化测试,以快速发现并修复问题。...
- 压力测试:模拟超过正常工作负载的情况,观察系统崩溃或性能显著下降的临界点。 - 负载测试:在预期的正常和高峰负载下测试系统性能,确定系统处理能力和稳定性。 - 耐久测试(长事务测试):长时间运行测试,...
- ASP.NET在构建Web应用程序中的作用。 - ADO.NET在数据访问层的应用。 - SOAP和XML Web服务在实现跨系统互操作性中的角色。 - Visual Studio.NET工具套件中的开发技巧。 ##### 4. 第三部分:构建.NET电子商务...
它可以用于Web应用、移动应用等多种类型的测试。 **选择理由**:在实际项目中,我们通常会根据项目的特定需求来选择合适的工具。例如,如果项目预算有限或者需要一个易于上手的工具,则可能倾向于使用JMeter;而...
性能测试涵盖的方面包括压力测试、负载测试、并发测试、容量测试、配置测试和基准测试。测试的目的是评估系统能力,识别系统弱点,进行系统调优,以及验证系统的可伸缩性和可靠性。 性能测试指标主要包括响应时间、...
为缩短测试时间,通常会使用二八原则,将预期一天的压力在短时间内集中加载,比如在2小时内完成一天的预期压力,以此来模拟系统运行5天的压力测试。 除了上述常见的性能测试类型外,还存在一些其他的性能测试方法,...
- 提供详细的性能测试方案,包括负载测试、压力测试等。 - 探讨如何优化应用性能,提高响应速度和并发处理能力。 - **第16章:结论——让J2EE为你工作** - 总结全书的核心观点,强调J2EE的价值和未来发展趋势。 ...
- 负载均衡:通过负载均衡设备或技术分散请求,避免单点过载。 - 异步处理:合理使用异步和消息队列技术,提升服务响应能力。 4. 数据库优化: - 选择合适的数据库类型:根据应用场景选择关系型数据库或非关系型...
从单一的线下测试到复杂的线上测试环境,从简单的单点评估到全方位的性能压测,这些变迁既展示了技术的进步,也代表了企业对性能测试的深入理解和重视。未来,随着技术的不断进步和业务场景的日益复杂,性能测试技术...
MVC (Model-View-Controller) 是一种常用的架构模式,在Web应用开发中尤为流行。这部分内容涉及: - MVC模式的基本原理及其在J2EE中的实现。 - 控制器组件的设计思路。 - 视图层的渲染技术和模板引擎的选择。 ####...