tomcat内存溢出,性能优化配置讲解
tomcat的并發優化配置詳解
文件路徑:../tomcat/conf/server.xml
| ?<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" ???? redirectPort="8443" URIEncoding="UTF-8" ???? minSpareThreads="100" maxSpareThreads="5000" ???? enableLookups="false" disableUploadTimeout="true" ???? acceptCount="50000"? maxThreads="50000" ??????? ? maxProcessors="65534" minProcessors="100" ????????????????????????? UseURIValidationHack="false"/> |
其中各參數含義如下:
maxThreads? 客戶請求最大線程數
minSpareThreads??? Tomcat初始化時創建的socket線程數,默認值為4
maxSpareThreads?? Tomcat連接器的最大空閑socket線程數,默認值為50
minProcessors:最小空閑連接線程數,用于提高系統處理性能,默認值為10
maxProcessors:最大連接線程數,即:并發處理的最大請求數,默認值為75
acceptCount:允許的最大連接數,應大于等于 maxProcessors ,默認值為100
enableLookups:是否反查域名,取值為:true或false。為了提高處理能力,應設置為false
connectionTimeout:網絡連接超時,單位:毫秒。設置為0表示永不超時,這樣設置有隱患的。通常可設置為20000毫秒。
redirectPort??????? 在需要基于安全通道的場合,把客戶請求轉發到基于SSL的redirectPort端口
URIEncoding??? URL統一編碼
disableUploadTimeout??? 上傳時是否使用超時機制
2.JVM 調優
文件路徑:../tomcat/bin/catalina.sh
在TOMCAT_HOME/bin/catalina.sh 增加如下語句,具體數值視情況而定。
# OS specific support.? $var _must_ be set to either true or false.
export JAVA_OPTS=" -server -Xms1024M -Xmx4096M -Xss1024k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=16M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC? -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m? -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "
參數詳解
-Xms JVM初始化堆內存大小
-Xmx JVM堆的最大內存
-Xss 線程棧大小
-XX:PermSize JVM非堆區初始內存分配大小
-XX:MaxPermSize JVM非堆區最大內存
建議和注意事項:
-Xms和-Xmx選項設置為相同堆內存分配,以避免在每次GC 后調整堆的大小,堆內存建議占內存的60%~80%;非堆內存是不可回收內存,大小視項目而定;線程棧大小推薦256k.
32G內存配置如下:
JAVA_OPTS="-Xms20480m -Xmx20480m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=2048m"
3.LINUX句柄數優化
文件路徑:/etc/security/limits.d/90-nproc.conf
增加以下配置:
??????? *?????? soft nofile 65534
??????? *?????? hard nofile 65535
查看當前句柄數:ulimit -n
若修改未生效,退出當前遠程,重新連接查看
默認情況下,linux最大文件句柄數為1024個。當你的服務器在大并發達到極限時,就會報出“too many open files”。
將文件句柄限制統一改成軟32768,硬65536.配置文件最前面的是指domain,設置為星號代表全局,另外你也可以針對不同的用戶做出不同的限制
注意.這個當中的硬限制是實際的限制,而軟限制,是warnning限制,只會做出warning.其實ulimit命令本身就有分軟硬設置,加-H就是硬,加-S就是軟
默認顯示的是軟限制,如果運行ulimit命令修改的時候沒有加上的話,就是兩個參數一起改變.
文件路徑:/etc/my.cnf???
在[mysqld]節點下,添加:max_connections=1000
修改并保存后,重啟mysql生效: service mysql restart
MySQL的最大連接數,如果服務器的并發連接請求量比較大,建議調高此值,以增加并行連接數量,當然這建立在機器能支撐的情況下,因為如果連接數越多,介于MySQL會為每個連接提供連接緩沖區,就會開銷越多的內存,所以要適當調整該值,不能盲目提高設值。可以過'conn%'通配符查看當前狀態的連接數量,以定奪該值的大小。依照分配給mysql的內存大小,以及你的應用類型,是長連接還是短連接等多方面因素,一般8-16G內存,分配300-1000均可.
4.數據源優化
文件路徑:/data/trustsec/tomcat6/webapps/ROOT/WEB-INF/classes/applicationContext-datasource.xml
<!-- 配置DBCP數據源 -->
??????? <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
??????????????? <!-- <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> -->
??????????????? <property name="driverClassName" value="com.mysql.jdbc.Driver" />
??????? ??? <property name="url" value="jdbc:mysql://localhost:3306/trustsec?characterEncoding=utf8" />
??????????????? <property name="username" value="root" />
??????????????? <property name="password" value="sheca" />
??????????????? <!-- 最大連接數量? -->
??????? <property name="maxActive" value="1000" />
???? ???<!-- 最大空閑連接? -->
??????? <property name="maxIdle" value="250" />
????? ??<!-- 最小空閑連接? -->
??????? <property name="minIdle" value="10" />
5.TCP用盡問題:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
??????? at sun.reflect.GeneratedConstructorAccessor24.newInstance(Unknown Source)
??????? at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
??????? at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
??????? at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
??????? at com.mysql.jdbc.Util.getInstance(Util.java:381)
??????? at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
??????? at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
??????? at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
??????? at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2270)
??????? at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:723)
??????? at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
??????? at sun.reflect.GeneratedConstructorAccessor20.newInstance(Unknown Source)
??????? at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
??????? at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
??????? at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
??????? at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
??????? at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
??????? at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
??????? at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
??????? at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1148)
??????? at org.apache.commons.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:79)
??????? at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
??????? at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
??????? at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
??????? at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
??????? ... 12 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Last packet sent to the server was 0 ms ago.
??????? at sun.reflect.GeneratedConstructorAccessor22.newInstance(Unknown Source)
??????? at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
??????? at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
??????? at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
??????? at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
??????? at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:335)
??????? at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2194)
??????? ... 28 more
Caused by: java.net.NoRouteToHostException: Cannot assign requested address
??????? at java.net.PlainSocketImpl.socketConnect(Native Method)
??????? at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
??????? at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
??????? at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
??????? at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
??????? at java.net.Socket.connect(Socket.java:529)
??????? at java.net.Socket.connect(Socket.java:478)
??????? at java.net.Socket.<init>(Socket.java:375)
??????? at java.net.Socket.<init>(Socket.java:218)
??????? at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:253)
??????? at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:284)
解決方法:
vim /etc/sysctl.conf,編輯完成后 sysctl -p 使其生效
1、net.ipv4.tcp_tw_reuse = 1
表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認為0,表示關閉;修改為1,釋放TIME_WAIT端口給新連接使用
2、net.ipv4.tcp_fin_timeout = 15
表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。默認為60秒
3、net.ipv4.tcp_tw_recycle = 1
表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
總結
以上是生活随笔為你收集整理的tomcat内存溢出,性能优化配置讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tornado学习笔记day03-响应输
- 下一篇: 【Verilog 常见设计】(0)二进制