운영환경에서 원인을 알 수 없는 Delay 현상이 발견됐다.
할 수 있는 모든 것을 의심하며, 원인을 찾았다.
그중 하나가 Linux 위의 Java Program 이 DB connection 할때, 느려진다는 것이다.
이유는 Linux 위의 java Process 가 DB의 연결할때, 난수가 필요한대, 그 난수의 발생이 오래걸린다나 뭐라나
자세한 내용은
https://waspro.tistory.com/254
[Oracle] getConnection 지연 조치 방법
본 포스팅은 Oracle / Tibero 접속세션을 구분하는 방법에 대한 고찰입니다. 본 가이드는 /dev/random 으로 인한 지연에 대해 설명하고 있습니다. /dev/random 이란? random 의 의미가 "임의의", "일정치 않는"의..
waspro.tistory.com
linux (java application) -> oracle Connection delay 현상
신규로 세팅한 linux (redhat 2.6.32) 버전에서 내부망에 있는 oracle로 db커넥션이 이상하게 30~40 초나 걸리는 현상이 발생하였다. 네트워크 방화벽을 의심했으나 tcpdump를 떠보니 신규로 세팅한 linux 서버쪽에서 db서버로 P flag에 해당하는 ack를 20초 이상 지연하여 응답하고 있었다. jdk-1.7.80, jdk…
manli000.wordpress.com
위 글에 나와있다.
어째든 나는 해당 이슈가 원인인지 아닌지 알아내야 했다.
우선 우리가 사용했던 리눅스의 버전은
Linux version 2.6.32-642.el6.x86_64 이며
자바는 "1.7.0_99"을 사용하고 있었다.
우선 나는 Db Connection을 연속해서 100번 하는 Java Program을 만들었다.
소스는 아래와 같다.
package test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.Date; public class DBConnTest { public static void main(String[] args) { for(int i=0;i<100;i++){ Connection conn=null; try { SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date time = new Date(); Class.forName("oracle.jdbc.driver.OracleDriver"); System.out.println("Start Time " + format1.format(time)); long start = System.currentTimeMillis(); conn=DriverManager.getConnection("url", "id", "pw"); long stop = System.currentTimeMillis(); if((stop - start)>1000){ System.out.println("connected Time " + (stop - start) + " ms. this is Slow"); } else{ System.out.println("connected Time " + (stop - start) + " ms."); } time = new Date(); System.out.println("End Time " + format1.format(time)); conn.close(); } catch (ClassNotFoundException cnfe) { System.out.println("Not Found Class.."+cnfe.getMessage()); } catch(SQLException se){ System.out.println(se.getMessage()); } finally { if(conn != null) try {conn.close();} catch (SQLException e) { e.printStackTrace();} } } } }
이제 이 프로그램을 리눅스 위에서 쉘스크립트를 통해 20번 수행할 것이다.
( 1번 수행하고, 몇초 쉬고, 1번 수행하고 몇초 쉬고 .. )
각각의 java Program은 3가지 옵션을 적용해서 그래프로 만들 것이다.
옵션 1) -Djava.security.egd=file:/dev/./urandom
옵션 2) -Djava.security.egd=file:///dev/urandom
옵션 3) No Option
결과적으로
그래프는 아래와 같이 나왔다.

No Option 의 경우 짧게는 10초 길게는 50초까지 Delay가 있었으며,
옵션 1과 옵션 2는 Delay가 거의 없었다.
웃긴 점은 느려지는 규칙이 있다는 점이다.
내가 100번 연속 Db Connection 을 돌리게 만들었고, 쉘스크립트는 그 Program을 수행하고 쉬었다가 수행하고 이런식으로 수행됐다.
그러니까 아래의 사진처럼


100번을 주기로 느려진다는 점이다. 그렇다는 이야기는 DB Connection 을 할때마다 난수가 필요한 것은 아니란 것이다.
어째든 java Process 가 느려진 이유를 파악하기 위해 여러가지를 조사했고,
그 중 하나로 Linux 와 java Db Connection Delay를 분석 했다.
확실히 옵션을 주지 않을때, 느려지는 현상은 발견됐다. 그러나, 해당 이유 때문에 느려졌던 것인지는 아무도 모른다....
아래는 java Program 사용법이다.
1) 해당 소스 파일과 ojdbc6.jar 을 Linux 위에 업로드 합니다.

2) 컴파일 합니다.

3) 실행

'dev > trouble shooting' 카테고리의 다른 글
문제 찾는 방법 (1) | 2024.04.04 |
---|---|
파일이나 어셈블리 중 하나를 로드할 수 없습니다. 프로그램을 잘못된 형식으로 로드하려고 했습니다. (0) | 2020.11.07 |
기본 클래스 'system.object'을(를) 디자인할 수 없습니다 (0) | 2020.11.07 |
telnet : not found (0) | 2020.11.01 |
운영환경에서 원인을 알 수 없는 Delay 현상이 발견됐다.
할 수 있는 모든 것을 의심하며, 원인을 찾았다.
그중 하나가 Linux 위의 Java Program 이 DB connection 할때, 느려진다는 것이다.
이유는 Linux 위의 java Process 가 DB의 연결할때, 난수가 필요한대, 그 난수의 발생이 오래걸린다나 뭐라나
자세한 내용은
https://waspro.tistory.com/254
[Oracle] getConnection 지연 조치 방법
본 포스팅은 Oracle / Tibero 접속세션을 구분하는 방법에 대한 고찰입니다. 본 가이드는 /dev/random 으로 인한 지연에 대해 설명하고 있습니다. /dev/random 이란? random 의 의미가 "임의의", "일정치 않는"의..
waspro.tistory.com
linux (java application) -> oracle Connection delay 현상
신규로 세팅한 linux (redhat 2.6.32) 버전에서 내부망에 있는 oracle로 db커넥션이 이상하게 30~40 초나 걸리는 현상이 발생하였다. 네트워크 방화벽을 의심했으나 tcpdump를 떠보니 신규로 세팅한 linux 서버쪽에서 db서버로 P flag에 해당하는 ack를 20초 이상 지연하여 응답하고 있었다. jdk-1.7.80, jdk…
manli000.wordpress.com
위 글에 나와있다.
어째든 나는 해당 이슈가 원인인지 아닌지 알아내야 했다.
우선 우리가 사용했던 리눅스의 버전은
Linux version 2.6.32-642.el6.x86_64 이며
자바는 "1.7.0_99"을 사용하고 있었다.
우선 나는 Db Connection을 연속해서 100번 하는 Java Program을 만들었다.
소스는 아래와 같다.
package test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.Date; public class DBConnTest { public static void main(String[] args) { for(int i=0;i<100;i++){ Connection conn=null; try { SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date time = new Date(); Class.forName("oracle.jdbc.driver.OracleDriver"); System.out.println("Start Time " + format1.format(time)); long start = System.currentTimeMillis(); conn=DriverManager.getConnection("url", "id", "pw"); long stop = System.currentTimeMillis(); if((stop - start)>1000){ System.out.println("connected Time " + (stop - start) + " ms. this is Slow"); } else{ System.out.println("connected Time " + (stop - start) + " ms."); } time = new Date(); System.out.println("End Time " + format1.format(time)); conn.close(); } catch (ClassNotFoundException cnfe) { System.out.println("Not Found Class.."+cnfe.getMessage()); } catch(SQLException se){ System.out.println(se.getMessage()); } finally { if(conn != null) try {conn.close();} catch (SQLException e) { e.printStackTrace();} } } } }
이제 이 프로그램을 리눅스 위에서 쉘스크립트를 통해 20번 수행할 것이다.
( 1번 수행하고, 몇초 쉬고, 1번 수행하고 몇초 쉬고 .. )
각각의 java Program은 3가지 옵션을 적용해서 그래프로 만들 것이다.
옵션 1) -Djava.security.egd=file:/dev/./urandom
옵션 2) -Djava.security.egd=file:///dev/urandom
옵션 3) No Option
결과적으로
그래프는 아래와 같이 나왔다.

No Option 의 경우 짧게는 10초 길게는 50초까지 Delay가 있었으며,
옵션 1과 옵션 2는 Delay가 거의 없었다.
웃긴 점은 느려지는 규칙이 있다는 점이다.
내가 100번 연속 Db Connection 을 돌리게 만들었고, 쉘스크립트는 그 Program을 수행하고 쉬었다가 수행하고 이런식으로 수행됐다.
그러니까 아래의 사진처럼


100번을 주기로 느려진다는 점이다. 그렇다는 이야기는 DB Connection 을 할때마다 난수가 필요한 것은 아니란 것이다.
어째든 java Process 가 느려진 이유를 파악하기 위해 여러가지를 조사했고,
그 중 하나로 Linux 와 java Db Connection Delay를 분석 했다.
확실히 옵션을 주지 않을때, 느려지는 현상은 발견됐다. 그러나, 해당 이유 때문에 느려졌던 것인지는 아무도 모른다....
아래는 java Program 사용법이다.
1) 해당 소스 파일과 ojdbc6.jar 을 Linux 위에 업로드 합니다.

2) 컴파일 합니다.

3) 실행

'dev > trouble shooting' 카테고리의 다른 글
문제 찾는 방법 (1) | 2024.04.04 |
---|---|
파일이나 어셈블리 중 하나를 로드할 수 없습니다. 프로그램을 잘못된 형식으로 로드하려고 했습니다. (0) | 2020.11.07 |
기본 클래스 'system.object'을(를) 디자인할 수 없습니다 (0) | 2020.11.07 |
telnet : not found (0) | 2020.11.01 |