2014년 12월 11일 목요일

Performance Problem with Java to Connect Oracle /dev/urandom

1. 환경
  - Redhat OS, Oracle 11g, Resin, JAVA, 솔루션

2. 증상
  - Java로 개발된 Solution Parallel 20개 실행시 DB Connect 및
    증상적인 접속과 Query가 아주 느림 (약 6분 이상 소요)

  - PC에 CentOS설치시 테스트시에는 정상

  - 전용 x86 Server의 위 환경에서는 계속 Delay 발생

  - Oracle listener.log에는 정상적으로 20개 Session 접속이 되는 것으로
    logging이 되나 실질적으로 사용하는 솔루션 log는 하나씩 하나씩
    생성이 되고 있음.

3. 원인
   리눅스에서 난수 생성시 속도가 떨어지는 이유는
   /dev/random 을 사용하는데, /dev/random은 Blocking Mode로 작동합니다. (/dev/urandom 은       NonBlocking)

  결론은 리눅스의 난수 발생 로직이 좀 느리다는 겁니다.

  JDK는 urandom 보다는 random을 사용하고 있습니다.

  lsof {해당프로세스 ID} 치면 현재 프로세스가 어떤 자원을 사용하고 있는지 나옵니다.

  리눅스에서도 /dev/random, /dev/urandom 둘다 쓰고 있는 것 같은데, random을 더 우선시 하는   것으로 보입니다.


  리눅스에서 랜던값 생성하는데, 시간이 오래 걸리는 문제에 대한 개선방안입니다.

  ${JAVA_HOME}/jre/lib/security/java.security 파일을 열어보면 다음과 같은 라인이 있습니다.

  AS-IS
  securerandom.source=file:/dev/urandom

  이것을 다음과 같이 수정해 주시면 됩니다.

  TO-BE (// 두 개 추가, /dev/random 이 아니라 /dev/urandom을 사용함)
  securerandom.source=file:///dev/urandom

  또는 해당 WAS 실행 옵션에 다음과 같이 추가해 주어도 되나, 위의 방법을 권장해 드립니다.
  -Djava.security.egd=file:///dev/urandom
   
4. References
  - http://demo.initech.com/index.php?document_srl=11395&mid=INISAFE_Crypto

댓글 없음:

댓글 쓰기