2017-11-08 1 views
1

MySQL (최대 절전 모드)을 데이터베이스로 사용하는 Java (Tomcat) 응용 프로그램이 있습니다.Apache Tomcat 8 + MySQL 성능 문제

아주 간단한 Java Jsf 응용 프로그램이며 3 명의 사용자 만 시스템을 동시에 사용합니다 (두 가지 종류의 큰 테이블이 있으며 20k 라인이 있으며 일반적으로 정지 할 때 사용합니다).

시스템이 계속 울리며 다시 작동하려면 Tomcat 및 MySQL을 다시 시작해야합니다. 로그에서

내가 가진 : 또한

[WARN] 2017-11-08 16:53:02,438 com.zaxxer.hikari.pool.PoolBase isConnectionAlive - HikariPool-1 - Failed to validate connection [email protected] 

:

[WARN] 2017-11-08 17:04:32,200 com.zaxxer.hikari.pool.HikariPool run - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=1m22s40ms97µs73ns). 

그리고 (90X) : 또한

[WARN] 2017-11-08 17:04:35,438 com.zaxxer.hikari.pool.PoolBase isConnectionAlive - HikariPool-1 - Failed to validate connection [email protected] (No operations allowed after connection closed.) 

:

java.lang.OutOfMemoryError: GC overhead limit exceeded 

또한 나중에 나는 java.lang.OutOfMemoryError: Java heap space을 얻었지만 760Mb 만 시스템에서 사용하고있었습니다.

모든 팁 (YES,하는 오류 많은 이것은 IT가 ME에 고정하는 방법도! 어려운 이유는, 거기)? 내가 사용중인 메모리를 확인하면

export CATALINA_OPTS="$CATALINA_OPTS -Xms512m" 
export CATALINA_OPTS="$CATALINA_OPTS -Xmx512m" 
export CATALINA_OPTS="$CATALINA_OPTS -server" 

보여줍니다 :

mysqld = 165.3 MiB 
java = 662.0 MiB 

을 나는 다음과 같은 설정 히카리 연결 풀을 사용하고

은 내가 setenv.sh에서 설정 한 :

<property name="hibernate.hikari.maximumPoolSize" value="200" /> 
<property name="hibernate.hikari.idleTimeout" value="30000" /> 
<property name="hibernate.hikari.maxLifetime" value="600000" /> 
<property name="hibernate.hikari.dataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" /> 
<property name="hibernate.connection.provider_class" value="org.hibernate.hikaricp.internal.HikariCPConnectionProvider" /> 

서버 1GB의 램과 vCPU 1 개를 가진 디지털 오션 물방울에서 실행되는

wait_timeout = 360 
interactive_timeout = 420 

: 도끼 연결은 152

MySQL로 의 my.cnf 설정을 설정합니다. 이 서버에 대해 가장 좋은 tomcat + mysql + hiraki 구성은 무엇입니까?

감사합니다.

[EDITED]

은 내가 Xms512m 및 Xmx512m PARAMS을 제거하고 20에 maximumPoolSize를 감소하고 서버의 몇 시간 후 실행 확인 내가 가지고 : 인 문제의

ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - HikariPool-1 - Connection is not available, request timed out after 30004ms. 
javax.persistence.PersistenceException: 

org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection 

Caused by: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection 
+0

또한 스왑 메모리 1Gb – jNewbie

답변

1

하나 명확하게 표시 :

java.lang.OutOfMemoryError: GC overhead limit exceeded 

힙 메모리가 부족하고 JVM이 가비지 수집에 많은 시간을 소비한다고 표시합니다.

export CATALINA_OPTS="$CATALINA_OPTS -Xms512m" 
export CATALINA_OPTS="$CATALINA_OPTS -Xmx512m" 

톰캣과 모든 응용 프로그램이 처음에 512MB의 메모리를 예약해야 runnig되는 JVM을 지시하고는 최대 512MB의 메모리를 할당 할 수 있습니다.

위의 오류로 인해 512Mb로 앱이 충분하지 않음이 분명합니다. 당신이 고려하는

옵션 :

  • 무엇 maxThreads 값이 톰캣 Connector에 정의되어 있습니다. 기본값은 200입니다. 각 스레드는 메모리를 차지합니다. 단 3 명의 사용자 만 있으면 메모리를 절약하기 위해이 값을 5로 줄일 수 있습니다.
  • hibernate.hikari.maximumPoolSize도 너무 커 보인다. 다시 5이면 충분합니다.
  • Hibernate에 의해로드 된 각 @Entity는 first level cache에 저장됩니다. 이렇게하면 Hibernate가 느려지고 메모리가 소모됩니다. 가능한 경우 stateless session을 사용하여 세션 크기를 줄이는 것이 좋습니다.
  • VisualVM 또는 다른 프로파일 러를 사용하여 메모리 덤프를 사용하여 메모리가 어디로가는 지 분석하십시오.
+0

을 사용합니다. 작동하지 않았습니다. = (바람둥이는 메모리를 적게 사용하기 시작하지만 몇 시간이 지나면 다시 작동하지 않습니다.) – jNewbie

+0

메모리 덤프를 가져 와서 분석하십시오. 여기에 은색 글 머리 기호가 없습니다. –