一.Tomcat内存优化 T omcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 JAVA_OPTS参数。 1.JAVA_OPTS参数说明 -server 启用jdk 的 server 版; -Xms java虚拟机初始化时的最小内存; -Xmx java虚拟机可使用的最大内存; -XX:PermSize 内存永久保留区域 -XX:MaxPermSize 内存最大永久保留区域 服务器参数配置
现公司服务器内存一般都可以加到最大2G ,所以可以采取以下配置: JAVA_OPTS='-Xms1024m -Xmx2048m -XX:PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m' 配置完成后可重启Tomcat ,通过以下命令进行查看配置是否生效: 1. 首先查看Tomcat 进程号:
我们可以看到Tomcat 进程号是 12145 。 jmap – heap 12145
我们可以看到MaxHeapSize 等参数已经生效。、 二.Tomcat并发优化 1.Tomcat连接相关参数 在Tomcat 配置文件 server.xml 中的 <Connector ... /> 配置中 1.参数说明 minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为 10 maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为 75 acceptCount:允许的最大连接数,应大于等于 maxProcessors ,默认值为 100 enableLookups:是否反查域名,取值为: true 或 false 。为了提高处理能力,应设置为 false connectionTimeout:网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为30000 毫秒。 其中和最大连接数相关的参数为maxProcessors 和 acceptCount 。如果要加大并发连接数,应同时加大这两个参数。 web server允许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个左右, Linux 是1000 个左右。 2.Tomcat中的配置示例 1. <Connector port="9027" 2. 3. protocol="HTTP/1.1" 4. 5. maxHttpHeaderSize="8192" 6. 7. minProcessors="100" 8. 9. maxProcessors="1000" 10. 11. acceptCount="1000" 12. 13. redirectPort="8443" 14. 15. disableUploadTimeout="true"/>
2.调整连接器connector的并发处理能力 1.参数说明 maxThreads 客户请求最大线程数 minSpareThreads Tomcat初始化时创建的 socket 线程数 maxSpareThreads Tomcat连接器的最大空闲 socket 线程数 enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名 redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口 acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads ) connectionTimeout 连接超时 minProcessors 服务器创建时的最小处理线程数 maxProcessors 服务器同时最大处理线程数 URIEncoding URL统一编码
2.Tomcat中的配置示例 1. <Connector port="9027" 2. 3. protocol="HTTP/1.1" 4. 5. maxHttpHeaderSize="8192" 6. 7. maxThreads="1000" 8. 9. minSpareThreads="100" 10. 11. maxSpareThreads="1000" 12. 13. minProcessors="100" 14. 15. maxProcessors="1000" 16. 17. enableLookups="false" 18. 19. URIEncoding="utf-8" 20. 21. acceptCount="1000" 22. 23. redirectPort="8443" 24. 25. disableUploadTimeout="true"/>
3.Tomcat缓存优化 1.参数说明 compression 打开压缩功能 compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB compressableMimeType 压缩类型 connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间 2.Tomcat中的配置示例 1. <Connector port="9027" 2. 3. protocol="HTTP/1.1" 4. 5. maxHttpHeaderSize="8192" 6. 7. maxThreads="1000" 8. 9. minSpareThreads="100" 10. 11. maxSpareThreads="1000" 12. 13. minProcessors="100" 14. 15. maxProcessors="1000" 16. 17. enableLookups="false" 18. 19. compression="on" 20. 21. compressionMinSize="2048" 22. 23. compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 24. 25. connectionTimeout="20000" 26. 27. URIEncoding="utf-8" 28. 29. acceptCount="1000" 30. 31. redirectPort="8443" 32. 33. disableUploadTimeout="true"/>
4.参考配置 1.旧有的配置 参考网络对服务器做过如下配置,拿出来分享下:
1. <Connector port="9027" 2. 3. protocol="HTTP/1.1" 4. 5. maxHttpHeaderSize="8192" 6. 7. maxThreads="1000" 8. 9. minSpareThreads="25" 10. 11. maxSpareThreads="75" 12. 13. enableLookups="false" 14. 15. compression="on" 16. 17. compressionMinSize="2048" 18. 19. compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 20. 21. connectionTimeout="20000" 22. 23. URIEncoding="utf-8" 24. 25. acceptCount="200" 26. 27. redirectPort="8443" 28. 29. disableUploadTimeout="true" />
后来发现在访问量达到3 百万多的时候出现性能瓶颈。 2.更改后的配置 1. <Connector port="9027" 2. 3. protocol="HTTP/1.1" 4. 5. maxHttpHeaderSize="8192" 6. 7. maxThreads="1000" 8. 9. minSpareThreads="100" 10. 11. maxSpareThreads="1000" 12. 13. minProcessors="100" 14. 15. maxProcessors="1000" 16. 17. enableLookups="false" 18. 19. compression="on" 20. 21. compressionMinSize="2048" 22. 23. compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 24. 25. connectionTimeout="20000" 26. 27. URIEncoding="utf-8" 28. 29. acceptCount="1000" 30. 31. redirectPort="8443" 32. 33. disableUploadTimeout="true"/>
性能有待观察中 …… 5.tomcat数据库连接池的参考配置 1.平台的配置
1. <!--name:DataSource的名称--> 2. <!--type:数据源对应的java类型,一般设计为javax.sql.DataSource--> 3. <!--username:数据库登陆名--> 4. <!--password:数据库登陆密码--> 5. <!--driverClassName:指定数据库JDBC驱动程序--> 6. <!--url:指定数据库的URL--> 7. <!--maxIdle:连接池处于空闲状态的数据库连接的最大数目,取0表示不受限制--> 8. <!--maxWait:连接池中数据库连接处于空闲状态的最长时间(以毫秒为单位),取0表示无限制等待时间--> 9. <!--maxActive:连接池处于活动状态的数据库连接的最大数目,去0表示不受限制--> <Resource name="jdbc/books"
auth="Container"type="javax.sql.DataSource" maxActive="100"
maxIdle="30" maxWait="10000" username="sa" password="120010"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433;DatabaseName=news"/> 参数含义: JNDI (java naming and directory interface): Java 命名和目录接口 maxActive="100" 表示并发情况下最大可从连接池中获取的连接数。如果数据库不是单独,供一个应用使用,通过设置maxActive参数可以避免某个应用无限制的获取连接对其他应用造成影响,如果一个数据库只是用来支持一个应用那么maxActive理论上可以设置成该数据库可以支撑的最大连接数。maxActive只是表示通过连接池可以并发的获取的最大连接数。连接的获取与释放是双向,当应用程序并发请求连接池时,连接池就需要从数据库获取连接,那么但应用程序使用完连接并将连接归还给连接池时,连接池是否也同时将连接归还给数据库呢?很显然答案是否定的,如果那样的话连接池就变得多此一举,不但不能提高性能,反而会降低性能,那么但应用成归还连接后,连接池如何处理呢? maxIdle="30" 如果在并发时达到了maxActive=100,那么连接池就必须从数据库中获取100个连接来供应用程序使用,当应用程序关闭连接后,由于maxIdle=30,因此并不是所有的连接都会归还给数据库,将会有30个连接保持在连接池种中,状态为空闲。 minIdle=”2” 最小默认情况下并不生效,它的含义是当连接池中的连接少有minIdle,系统监控线程将启动补充功能,一般情况下我们并不启动补充线程。 问题:如何设置maxActive和maxIdle? 理论上讲maxActive应该设置成应用的最大并发数,这样一来即便是在最大并发的情况下,应用依然能够从连接池中获取连接,但是困难时的是我们很难准确估计到最大并发数,设置成最大并发数是一种最优的服务质量保证,事实上,如果某个用户登录提示系统繁忙,那么在他再次登录时,可能系统资源已经充足,对于拜特资金管理系统我们建议将maxActive设置为系统注册人数的十分之一到二十分之一之间。例如系统的注册人数为1000,那么设置成50-100靠近100的数字,例如85或90。 maxIdle对应的连接,实际上是连接池保持的长连接,这也是连接池发挥优势的部分,理论上讲保持较多的长连接,在应用请求时可以更快的响应,但是过多的连接保持,反而会消耗数据库大量的资源,因此maxIdle也并不是越大越好,同上例我们建议将 maxIdle设置成 50-100中靠近50的数字,例如55。这样就能在兼顾最大并发同时,保持较少的数据库连接,而且在绝大多情况,能够为应用程序提供最快的相应速度。 removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true" 有时粗心的程序编写者在从连接池中获取连接使用后忘记了连接的关闭,这样连池的连接就会逐渐达到maxActive直至连接池无法提供服务。现代连接池一般提供一种“智能”的检查,但设置了removeAbandoned="true"时,当连接池连接数到达(getNumIdle() < 2) and (getNumActive() >getMaxActive() - 3)时便会启动连接回收,那种活动时间超过removeAbandonedTimeout="60"的连接将会被回收,同时如果logAbandoned="true"设置为true,程序在回收连接的同时会打印日志。removeAbandoned是连接池的高级功能,理论上这中配置不应该出现在实际的生产环境,因为有时应用程序执行长事务,可能这种情况下,会被连接池误回收,该种配置一般在程序测试阶段,为了定位连接泄漏的具体代码位置,被开启,生产环境中连接的关闭应该靠程序自己保证。
|