달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
2015. 1. 7. 22:15

Wireshark pcap 파일 분할 I.lib()/I.lib(etc)2015. 1. 7. 22:15

.. .. ..

 

 

[펌] : http://apollo89.com/wordpress/?p=6900

 

감사합니다 ㅜㅡ

.
:
Posted by .07274.
.. .. ..

 

 

[펌] : http://ideacoop.tistory.com/615

 


오렌지에서 실행할때..

우선 Schema Browser 에서 해당 프로시저를 찾아서 더블클릭해주고
디버그모드로 컴파일 하고
Debug>Start 를 하면 창이 하나 뜨는데
다음과 같은 문자을 넣어주고 해당 창의 Start 버튼을 누른다.

DECLARE
v_OutArg1 varchar2(100);
v_OutArg2 varchar2(100);
v_OutArg3 varchar2(100);
BEGIN
유저.패키지.프로시저(v_OutArg1,v_OutArg2,v_OutArg3);
END;

이때 보고자 하는 변수명은 드래그 드랍하여 Watch... 쪽에 끌어놓으면 볼수 있다.

만일 서버 Output 이 가능하다면
dbms_output.put_line(v_OutArg1);
를 추가로 기술할 경우 그 내용을 실행이 끝난뒤 보여 준다.


 

Ref. Contents : 1 Writing Time : 2006.02.09 15:46 from 202.133.27.224

 

Title

Count

Date

Writer

 

  [ORACLE] 프로시저 SQLPlus 에서 실행

403

2006.02.09

hasspark

=>

  [ORACLE] 프로시저 오렌지에서 실행

591

2006.02.09

hasspark

 

 

.
:
Posted by .07274.
.. .. ..

 

B3 자바기반 Vert.x로 Socket.io 서버 만들기

http://devon.daum.net/2012/session/b3

'I.lib() > I.lib(Java)' 카테고리의 다른 글

strftime(3) format 정보 (apache log format에 사용)  (0) 2014.08.13
[펌] JAVA 의 ENUM 정리.  (0) 2014.08.01
[펌] 필터란 무엇인가!  (0) 2014.07.01
Java Servlet 이란? ( 개념 및 예제 )  (0) 2014.01.09
jstat 사용법  (0) 2014.01.03
.
:
Posted by .07274.
.. .. ..

.

 

[펌] : http://kkd927.tistory.com/68

.
:
Posted by .07274.
.. .. ..

.

 

Soap UI 를 사용하다 갑자기 아래와 같은 ERROR 발생

 

The JVM could not be started. The maximum heap size (-Xmx) might be too large or an antivirus or firmware tool could block the execution.

 

원인은 메모리 문제인듯 하지만 일단 지금은 바쁘니 아래와 같이 수정.

 

SoapUI 설치된 Dir\bin\SoapUI-X.X.X.vmoptions 파일 열기

 

-Xmx1000m 이부분을 -Xmx512m 로 수정하기

 

끝~!


.
:
Posted by .07274.
.. .. ..

.

Sql Developer 에서 조회 결과를 파일로 저장하고 싶은데

 

도대체가 내 검색실력은 얼마나 엉망인 것인지 찾을수가 없었다.

 

삽질끝에 간편 정리~!

 

1. sql 창에 쿼리를 쓴다 . (ex. select sysdate from dual)

 

2. sql 문을 실행시킨다. (컨트롤 + 엔터 )

 

3. 조회 결과가 나왔을테고 그 창에서 마우스 우클릭

 

4. 가장 밑에 Export Data 라고 있다. 한글버젼은 뭐라 나오는지 몰라도 단축키는 (X) 이다.

 

5. 원하는 파일형식 선택 (ex. TEXT)

 

6. 파일명과 저장할 위치 선택하고 다른 항목 아무것도 건드리지 않는다. (사실 건드려도 상관없음;)

 

7. 적용(A)

 

끝~!

 

원하는 결과가 나오셨으면 박수박수~!~! ㅋㅋ

 

광고 클릭 유도는 금지니 댓글이나 하나 남겨주고 가십쇼~ 기운내서 또쓰게 ㅋㅋ

.
:
Posted by .07274.
.. .. ..

.

 

%A 각국의 표현으로 완전한 요일명으로 옮겨놓을 수 있습니다.
%a 각국의 표현으로 생략 한 요일명으로 옮겨놓을 수 있습니다. 여기서, 약칭은 최초의 3 캐릭터입니다.
%B 각국의 표현으로 완전한 월명으로 옮겨놓을 수 있습니다.
%b 각국의 표현으로 생략 한 월명으로 옮겨놓을 수 있습니다. 여기서, 약칭은 최초의 3 캐릭터입니다.
%C (서기연 / 100)의 10 진수로 옮겨놓을 수 있습니다. 1 자리수의 숫자의 전에는 0 이 붙습니다.
%c 각국의 표현으로 시각과 일자로 옮겨놓을 수 있습니다 서식은 ctime(3) 하지만 생성하는 것과 같고,"%a %Ef %T %Y" 과 등가입니다. 이것은 또,"3+1+6+1+8+1+4" 의 출력 포맷을 의미합니다.
%D "%m/%d/%y" (와)과 동등합니다.
%d 날을 나타내는 10 진수 (01-31)로 옮겨놓을 수 있습니다.
%E* %O* POSIX 의 지역 확장입니다. %Ec %EC %Ex %EX %Ey %EY %Od %Oe %OH %OI %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy 그렇다고 하는 순차 순서는, 대체적인 표현을 주는 것이라고 보여집니다.

더욱, %Ef 는 단축형의 달의 이름과 날을 나타내, 또 %EF 는 긴 형식의 달과 날을 나타내, 또 %OB 는 다른 형식의 달의 이름을 나타냅니다 (단독으로 사용해 일자는 지정하지 않습니다).

%e 날을 나타내는 10 진수 (1-31)로 옮겨놓을 수 있습니다. 1 자리수의 숫자의 전에는 공백이 붙습니다.
%G 백년기첨부의 해의 10 진수로 옮겨놓을 수 있습니다. 이 해는, 주의 대부분을 포함한 것이 됩니다 (월요일을 주의 최초일로서).
%g "" (와)과 같은 나이입니다만, 백년기없음의 10 진수 (00-99)로 옮겨놓을 수 있습니다.
%H (24 시간 시계로) 시간을 나타내는 10 진수 (00-23)로 옮겨놓을 수 있습니다.
%h %b 과 같습니다.
%I (12 시간 시계로) 시간을 나타내는 10 진수 (01-12)로 옮겨놓을 수 있습니다.
%j 1 년일을 나타내는 10 진수 (001-366)로 옮겨놓을 수 있습니다.
%k (24 시간 시계로) 시간을 나타내는 10 진수 (0-23)로 옮겨놓을 수 있습니다. 1 자리수의 숫자의 전에는 공백이 붙습니다.
%l (12 시간 시계로) 시간을 나타내는 10 진수 (1-12)로 옮겨놓을 수 있습니다. 1 자리수의 숫자의 전에는 공백이 붙습니다.
%M 분을 나타내는 10 진수 (00-59)로 옮겨놓을 수 있습니다.
%m 달을 나타내는 10 진수 (01-12)로 옮겨놓을 수 있습니다.
%n 개행으로 옮겨놓을 수 있습니다.
%O* %E* 과 같습니다.
%p 각국의 표현으로 "오전" 또는 "오후" 의 어느쪽이든 해당하는 표시로 옮겨놓을 수 있습니다.
%R "%H:%M" (와)과 동등합니다.
%r "%I:%M:%S %p" (와)과 동등합니다.
%S 초를 나타내는 10 진수 (00-60)로 옮겨놓을 수 있습니다.
%s 세계 표준시 기준 시점으로부터의 초수로 옮겨놓을 수 있습니다 (mktime(3) 참조).
%T "%H:%M:%S" (와)과 동등합니다.
%t 탭으로 옮겨놓을 수 있습니다.
%U 1 년 중 주수 (일요일을 주의 최초일로서)를 나타낸다 10 진수 (00-53)로 옮겨놓을 수 있습니다.
%u 1 주 중 일 (월요일을 주의 최초일로서)을 나타낸다 10 진수 (1-7)로 옮겨놓을 수 있습니다.
%V 1 년 중 주수 (월요일을 주의 최초일로서)를 나타낸다 10 진수 (01-53)로 옮겨놓을 수 있습니다. 신년의 1 월 1 일을 포함한 주에 4 일 이상일이 있는 경우는, 그 주가 제 1 주가 됩니다. 그 이외의 경우는, 그 주는 전년의 마지막 주가 되어, 그 다음의 주가 제 1 주가 됩니다.
%v "%e-%b-%Y" (와)과 동등합니다.
%W 1 년 중 주수 (월요일을 주의 최초일로서)를 나타낸다 10 진수 (00-53)로 옮겨놓을 수 있습니다.
%w 1 주 중 일 (일요일을 주의 최초일로서)을 나타낸다 10 진수 (0-6)로 옮겨놓을 수 있습니다.
%X 각국의 표현으로 시각에 옮겨놓을 수 있습니다.
%x 각국의 표현으로 일자로 옮겨놓을 수 있습니다.
%Y 백년기첨부의 해를 나타내는 10 진수로 옮겨놓을 수 있습니다.
%y 백년기없음의 해를 나타내는 10 진수 (00-99)로 옮겨놓을 수 있습니다.
%Z 시간대명으로 옮겨놓을 수 있습니다.
%z (은)는 UTC 로부터의 시간대의 차이로 두어 바꿀 수 있습니다. 선두의 플러스 기호는 UTC 로부터 동쪽을 의미해, 마이너스 기호는 UTC 로부터 서쪽을 의미합니다. 계속되는 시간과 분은, 각각 2 자리수이며, 사이에 단락지어 캐릭터는 없습니다 (RFC 822 시각 헤더에 공통입니다).
%+ 각국의 표현으로 일자와 시각을 나타내는 것으로 옮겨놓을 수 있습니다 (포맷은 date(1) 에 의해 작성되는 것 것과 같습니다).
%% `%' 그리고 옮겨놓을 수 있습니다.

'I.lib() > I.lib(Java)' 카테고리의 다른 글

[펌] B3 자바기반 Vert.x로 Socket.io 서버 만들기  (0) 2014.11.19
[펌] JAVA 의 ENUM 정리.  (0) 2014.08.01
[펌] 필터란 무엇인가!  (0) 2014.07.01
Java Servlet 이란? ( 개념 및 예제 )  (0) 2014.01.09
jstat 사용법  (0) 2014.01.03
.
:
Posted by .07274.
2014. 8. 11. 11:24

[펌] Tomcat 튜닝 이야기. I.lib()/I.lib(Tomcat)2014. 8. 11. 11:24

.. .. ..

 

[펌] : http://bcho.tistory.com/788

 

이번에는 톰캣 서버에 대한 튜닝 옵션에 대해서 한번 알아보자.

애플리케이션 관점에서의 튜닝도 중요하지만, 각 솔루션에 대한 특성을 업무 시나리오에 맞춰서 튜닝하는 것도 못지 않게 중요하다. 여기서 톰캣 튜닝을 설명하는 것은 톰캣 자체에 대한 튜닝 옵션을 소개하는 것도 목적이 있지만, 그보다 업무형태에 따라서 어떠한 접근을 해서 톰캣을 튜닝하는지를 소개하기 위함이다.

 

가정

여기서 튜닝 하는 톰캣은 HTTP/JSON형태의 REST 형태로 서비스를 제공하는 API 서버의 형태이다. 여러대의 톰캣을 이용하여 REST 서비스를 제공하며, 앞단에는 L4 스위치를 둬서 부하를 분산하며, 서비스는 stateless 서비스로 공유되는 상태 정보가 없다. 

server.xml 튜닝

톰캣의 대부분 튜닝 패러미터는 ${Tomcat_HOME}/conf/server.xml 파일에 정의된다.

몇몇 parameter를 살펴보도록 하자.

 

Listener 설정

 <Listener className="org.apache.catalina.security.SecurityListener" checkedOsUsers="root" /> 

이 옵션은 tomcat이 기동할 때, root 사용자이면 기동을 하지 못하게 하는 옵션이다. 서버를 운영해본 사람이라면 종종 겪었을 실수중의 하나가 application server root 권한으로 띄웠다가 다음번에 다시 실행하려고 하면 permission 에러가 나는 시나리오 이다. root 권한으로 서버가 실행되었기 때문에, 각종 config 파일이나 log 파일들의 permission이 모두 root로 바뀌어 버리기 때문에, 일반 계정으로 다시 재 기동하려고 시도하면, config 파일이나 log file들의 permission 이 바뀌어서 파일을 읽어나 쓰는데 실패하게 되고 결국 서버 기동이 불가능한 경우가 있다. 이 옵션은 이러한 실수를 막아 줄 수 있다.

 

Connector 설정

 

protocol="org.apache.coyote.http11.Http11Protocol"

먼저 protocol setting인데, Tomcat은 네트워크 통신하는 부분에 대해서 3가지 정도의 옵션을 제공한다. BIO,NIO,APR 3 가지이다. NIO Java NIO 라이브러리를 사용하는 모듈이고, APR Apache Web Server io module을 사용한다. 그래서 C라이브러리를 JNI 인터페이스를 통해서 로딩해서 사용하는데, 속도는 APR이 가장 빠른것으로 알려져 있지만, JNI를 사용하는 특성상, JNI 코드 쪽에서 문제가 생기면, 자바 프로세스 자체가 core dump를 내면서 죽어 버리기 때문에 안정성 측면에서는 BIO NIO보다 낮다. BIO는 일반적인 Java Socket IO 모듈을 사용하는데, 이론적으로 보면 APR > NIO > BIO 순으로 성능이 빠르지만, 실제 테스트 해보면 OS 설정이나 자바 버전에 따라서 차이가 있다. Default BIO이다.

 

acceptCount="10"

이 옵션은 request Queue의 길이를 정의한다. HTTP request가 들어왔을때, idle thread가 없으면 queue에서 idle thread가 생길때 까지 요청을 대기하는 queue의 길이이다. 보통 queue에 메세지가 쌓였다는 것은 해당 톰캣 인스턴스에 처리할 수 있는 쓰레드가 없다는 이야기이고, 모든 쓰레드를 사용해도 요청을 처리를 못한다는 것은 이미 장애 상태일 가능성이 높다.

그래서 큐의 길이를 길게 주는 것 보다는, 짧게 줘서, 요청을 처리할 수 없는 상황이면 빨리 에러 코드를 클라이언트에게 보내서 에러처리를 하도록 하는 것이 좋다. Queue의 길이가 길면, 대기 하는 시간이 길어지기 때문에 장애 상황에서도 계속 응답을 대기를 하다가 다른 장애로 전파 되는 경우가 있다.

순간적인 과부하 상황에 대비 하기 위해서 큐의 길이를 0 보다는 10내외 정도로 짧게 주는 것이 좋다.

 

enableLookups="false"

톰캣에서 실행되는 Servlet/JSP 코드 중에서 들어오는 http request에 대한 ip를 조회 하는 명령등이 있을 경우, 톰캣은 yahoo.com과 같은 DNS 이름을 IP주소로 바뀌기 위해서 DNS 서버에 look up 요청을 보낸다. 이것이 http request 처리 중에 일어나는데, 다른 서버로 DNS 쿼리를 보낸다는 소리이다. 그만큼의 서버간의 round trip 시간이 발생하는데, 이 옵션을 false로 해놓으면 dns lookup 없이 그냥 dns 명을 리턴하기 때문에, round trip 발생을 막을 수 있다.

 

compression="off"

HTTP message body gzip 형태로 압축해서 리턴한다. 업무 시나리오가 이미지나 파일을 response 하는 경우에는  compression을 적용함으로써 네트워크 대역폭을 절약하는 효과가 있겠지만, 이 업무 시스템의 가정은, JSON 기반의 REST 통신이기 때문에, 굳이 compression을 사용할 필요가 없으며, compression에 사용되는 CPU를 차라리 비지니스 로직 처리에 사용하는 것이 더 효율적이다.

 

maxConnection="8192"

하나의 톰캣인스턴스가 유지할 수 있는 Connection의 수를 정의 한다.

이 때 주의해야 할 점은 이 수는 현재 연결되어 있는 실제 Connection의 수가 아니라 현재 사용중인 socket fd (file descriptor)의 수 이다. 무슨 말인가 하면 TCP Connection은 특성상 Connection 이 끊난 후에도 바로 socket close 되는 것이 아니라 FIN 신호를 보내고, TIME_WAIT 시간을 거쳐서 connection을 정리한다. 실제 톰캣 인스턴스가 100개의 Connection 으로 부터 들어오는 요청을 동시 처리할 수 있다하더라도, 요청을 처리하고 socket close 되면 TIME_WAIT에 머물러 있는 Connection 수가 많기 때문에, 단시간내에 많은 요청을 처리하게 되면 이 TIME_WAIT가 사용하는 fd 수 때문에, maxConnection이 모자를 수 있다. 그래서 maxConnection은 넉넉하게 주는 것이 좋다.

이외에도 HTTP 1.1 Keep Alive를 사용하게 되면 요청을 처리 하지 않는 Connection도 계속 유지 되기 때문에, 요청 처리 수 보다, 실제 연결되어 있는 Connection 수가 높게 된다.

그리고, process당 열 수 있는 fd수는 ulimit -f 를 통해서 설정이 된다. maxConnection 8192로 주더라도, ulimit -f에서 fd 수를 적게 해놓으면 소용이 없기 때문에 반드시 ulimit -f 로 최대 물리 Connection 수를 설정해놔야 한다.

 

maxKeepAliveRequest="1"

HTTP 1.1 Keep Alive Connection을 사용할 때, 최대 유지할 Connection 수를 결정하는 옵션이다. 본 시나리오에서는 REST 방식으로 Connectionless 형태로 서비스를 진행할 예정이기 때문에, Kepp Alive를 사용하지 않기 위해서 값을 1로 준다.

만약에 KeepAlive를 사용할 예정이면, maxConnection과 같이 ulimit에서 fd수를 충분히 지정해줘야 하낟.

 

maxThread="100"

사실상 이 옵션이 가장 중요한 옵션이 아닌가 싶다. 톰캣내의 쓰레드 수를 결정 하는 옵션이다. 쓰레드수는 실제 Active User 수를 뜻한다. 즉 순간 처리 가능한 Transaction 수를 의미한다.

일반적으로 100 내외가 가장 적절하고, 트렌젝션의 무게에 따라 50~500 개 정도로 설정하는 게 일반적이다. 이 값은 성능 테스트를 통해서 튜닝을 하면서 조정해 나가는 것이 좋다.

 

tcpNoDelay="true"

TCP 프로토콜은 기본적으로 패킷을 보낼때 바로 보내지 않는다. 작은 패킷들을 모아서 버퍼 사이즈가 다 차면 모아서 보내는 로직을 사용한다. 그래서 버퍼가 4K라고 가정할때, 보내고자 하는 패킷이 1K이면 3K가 찰 때 까지 기다리기 때문에, 바로바로 전송이 되지 않고 대기가 발생한다.

tcpNoDelay 옵션을 사용하면, 버퍼가 차기전에라도 바로 전송이 되기 때문에, 전송 속도가 빨라진다. 반대로, 작은 패킷을 여러번 보내기 때문에 전체적인 네트워크 트래픽은 증가한다. (예전에야 대역폭이 낮아서 한꺼번에 보내는 방식이 선호되었지만 요즘은 망 속도가 워낙 좋아서 tcpNoDelay를 사용해도 대역폭에 대한 문제가 그리 크지 않다.)

 

Tomcat Lib 세팅

다음으로 자바 애플리케이션에서 사용하는 라이브러리에 대한 메모리 사용률을 줄이는 방법인데, 일반적으로 배포를 할때 사용되는 라이브러리(jar) *.war 패키지 내의 WEB-INF/jar 디렉토리에 넣어서 배포 하는 것이 일반적이다. 보통 하나의 war를 하나의 톰캣에 배포할 때는 큰 문제가 없는데, 하나의 톰캣에 여러개의 war 파일을 동시 배포 하게 되면, 같은 라이브러리가 각각 다른 클래스 로더로 배포가 되기 때문에, 메모리 효율성이 떨어진다.

그래서 이런 경우는 ${TOMCAT_HOME}/lib 디렉토리에 배포를 하고 war 파일에서 빼면 모든 war가 공통 적으로 같은 라이브러리를 사용하기 때문에 메모리 사용이 효율적이고, 또한 시스템 운영 관점에서도 개발팀이 잘못된 jar 버전을 패키징해서 배포하였다 하더라도, lib 디렉토리의 라이브러리가 우선 적용되기 때문에, 관리가 편하다.

반대로 war의 경우, war만 운영중에 재배포를 하면 반영이 가능하지만, lib 디렉토리의 jar 파일들은 반드시 톰캣 인스턴스를 재기동해야 반영되기 때문에, 이 부분은 주의해야 한다.

 

JVM Tuning

Java Virtual Machine 튜닝은 java 기반 애플리케이션에서는 거의 필수 요소이다.

-server

제일 먼저 해야할일은 JVM 모드를 server 모드로 전환하는 것이다. JVM 내의 hotspot 컴파일러도 클라이언트 애플리케이션이나 서버 애플리케이션이냐 에 따라서 최적화 되는 방법이 다르다.

그리고 메모리 배치 역시 클라이언트 애플리케이션(MS 워드와같은)의 경우 버튼이나 메뉴는 한번 메모리에 로드 되면, 애플리케이션이 끝날 때 까지 메모리에 잔존하기 때문에 Old 영역이 커야 하지만, 서버의 경우 request를 받아서 처리하고 응답을 주고 빠져서 소멸되는 객체들이 대부분이기 때문에, New 영역이 커야 한다.

이런 서버나 클라이언트냐에 대한 최적화 옵션이 이 옵션 하나로 상당 부분 자동으로 적용되기 때문에, 반드시 적용하기를 바란다.

 

메모리 옵션

앞에서도 설명하였듯이 JVM 튜닝의 대부분의 메모리 튜닝이고 그중에서도 JVM 메모리 튜닝은 매우 중요하다. 결국 Full GC 시간을 줄이는 것이 관건인데, 큰 요구 사항만 없다면, 전체 Heap Size 1G 정도가 적당하다. 그리고 New Old의 비율은 서버 애플리케이션의 경우 1:2 비율이 가장 적절하다. 그리고 PermSize class가 로딩되는 공간인데, 배포하고자 하는 애플리케이션이 아주 크지 않다면 128m 정도면 적당하다. (보통 256m를 넘지 않는다. 256m가 넘는다면 몬가 애플린케이션 배포나 패키징에 문제가 있다고 봐야 한다.)

그리고 heap size JVM에서 자동으로 늘리거나 줄일 수 가 있다. 그래서 -Xms -Xmx로 최소,최대 heap size를 정할 수 있는데, Server 시스템의 경우 항상 최대 사용 메모리로 잡아 놓는 것이 좋다. 메모리가 늘어난다는 것은 부하가 늘어난다는 것이고, 부하가 늘어날때 메모리를 늘리는 작업 자체가 새로운 부하가 될 수 있기 때문에, 같은 값을 사용하는 것이 좋다.

이렇게 JVM 메모리를 튜닝하면 다음과 같은 옵션이 된다.

-Xmx1024m Xms1024m -XX:MaxNewSize=384m -XX:MaxPermSize=128m

이렇게 하면 전체 메모리 사용량은 heap 1024m (이중에서 new 384m) 그리고 perm 128m 가 되고, JVM 자체가 사용하는 메모리가 보통 300~500m 내외가 되서 java process가 사용하는 메모리 량은 대략 1024+128+300~500 = 대략 1.5G 정도가 된다.

 

32 bit JVM의 경우 process가 사용할 수 있는 공간은 4G가 되는데, 이중 2G는 시스템(OS)이 사용하고 2G가 사용자가 사용할 수 있다. 그래서 위의 설정을 사용하면 32bit JVM에서도 잘 동작한다.

64 bit JVM의 경우 더 큰 메모리 영역을 사용할 수 있는데, 일반적으로 2G를 안 넘는 것이 좋다.(최대 3G), 2G가 넘어서면 Full GC 시간이 많이 걸리기 시작하기 때문에, 그다지 권장하지 않는다. 시스템의 가용 메모리가 많다면 Heap을 넉넉히 잡는 것보다는 톰캣 인스턴스를 여러개 띄워서 클러스터링이나 로드밸런서로 묶는 방법을 권장한다.

 

OutOfMemory

자바 애플리케이션에서 주로 문제가 되는 것중 하나가 Out Of Memory 에러이다. JVM이 메모리를 자동으로 관리해줌에도 불구하고, 이런 문제가 발생하는 원인은 사용이 끝낸 객체를 release 하지 않는 경우이다. 예를 들어 static 변수를 통해서 대규모 array hashmap reference 하고 있으면, GC가 되지 않고 계속 메모리를 점유해서 결과적으로 Out Of Memory 에러를 만들어낸다.

Out Of Memory 에러를 추적하기 위해서는 그 순간의 메모리 레이아웃인 Heap Dump가 필요한데, 이 옵션을 적용해놓으면, Out Of Memory가 나올때, 순간적으로 Heap Dump를 떠서 파일로 저장해놓기 때문에, 장애 발생시 추적이 용이하다.

-XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./java_pid<pid>.hprof

 

GC 옵션

다음은 GC 옵션이다. Memory 옵션 만큼이나 중요한 옵션인데, Parallel GC + Concurrent GC는 요즘은 거의 공식처럼 사용된다고 보면 된다. 이때 Parallel GC에 대한 Thread 수를 정해야 하는데, Thread수는 전체 CPU Core수 보다 적어야 하고, 2~4개 정도가 적당하다.

-XX:ParallelGCThreads=2 -XX:-UseConcMarkSweepGC

GC 로그 옵션

그리고 마지막으로 GC Log 옵션이다. 서버와 JVM이 건강한지 메모리상 문제는 없는지 GC 상황은 어떻게 디는지를 추적하려면 GC 로그는 되도록 자세하게 추출할 필요가 있다. GC로그를 상세하게 걸어도 성능 저하는 거의 없다.

-XX:-PrintGC -XX:-PrintGCDetails -XX:-PrintGCTimeStamps -XX:-TraceClassUnloading -XX:-TraceClassLoading

 

마지막에 적용된 TraceClassLoading은 클래스가 로딩되는 순간에 로그를 남겨준다. 일반적으로는 사용하지 않아도 되나, OutOfMemory 에러 발생시 Object가 아니라 class에서 발생하는 경우는 Heap dump로는 분석이 불가능 하기 때문에, Out Of Memory 에러시 같이 사용하면 좋다.

 

지금까지 간략하게 나마 톰켓 솔루션에 대한 튜닝 parameter 에 대해서 알아보았다. 사실 이러한 튜닝은 일반적인 개발자에게는 힘든 일이다. 해당 솔루션에 대한 많은 경험이 있어야 하기 때문에, 이런 parameter vendor의 기술 지원 엔지니어를 통해서 가이드를 받고, 성능 테스트 과정에서 최적화를 하고 표준화된 parameter를 정해서 사용하는 것이 좋다. Apache Tomcat의 경우에도 오픈소스이기는 하지만, Redhat등에서 기술 지원을 제공한다.

.
:
Posted by .07274.
2014. 8. 7. 11:37

아파치(Apache) 로그 포맷 I.lib()/I.lib(Apache)2014. 8. 7. 11:37

.. .. ..

.

오류 로그 (Error_log)

 

  Error Log는 서버 오류 로그는 진단정보와 요청을 처리하는 도중 발생한 오류를 기록한다. 서버가 시작하거나 동작하는데 문제가 있다면 무엇이 잘못되었고 때때로 어떻게 고치는지를 알려주는 이곳을 가장 먼저 살펴봐야 한다.

 

 

오류 로그는 보통 (전형적으로 유닉스 시스템에서는 error_log, 윈도우즈와 OS/2에서는 error.log) 파일에 기록된다.

오류 로그의 형식은 상대적으로 자유롭고 자세하다. 그러나 대부분의 오류 로그 항목에 공통적으로 나오는 정보가 있다. 예를 들어, 항목은 보통 다음과 같다.

[Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] client denied by server configuration: /export/home/live/ap/htdocs/test

로그 항목에서 첫번째 항목은 날짜와 시간이다. 두번째 항목은 보고하는 오류의 심각성을 나타낸다. 세번째 항목은 오류를 발생한 클라이언트의 IP 주소이다. 이 다음부터 오류문이 나오며, 이 경우 서버가 클라이언트의 접근을 거부하도록 설정되었다고 나와있다. 요청한 문서의 (웹 경로가 아닌) 파일시스템 경로도 보인다.

 

오류 로그에는 매우 다양한 종류의 문구가 나올 수 있다. 대부분은 위와 비슷하다. CGI 스크립트의 디버깅 출력도 오류 로그에 기록된다. CGI 스크립트가 stderr에 쓴 정보는 그대로 오류 로그로 복사된다.

 

오류 로그에 정보를 추가하가나 생략할 수 없다. 그러나 요청에 대한 오류 로그의 경우 접근 로그에도 대응하는 항목이 생긴다. 예를 들어, 위의 경우 상태코드가 403인 접근 로그 항목이 생긴다. 접근 로그는 사용자정의할 수 있으므로 이 파일을 참고하여 오류 상황에 대한 추가정보를 얻을 수 있다.

접근 로그 (Access Log)

 

서버 접근 로그는 서버가 처리하는 모든 요청을 기록한다. 로그 포맷 설정을 통해 로그에 포함할 내용을 쉽게 선택할 수 있다. 이 절은 서버가 접근 로그에 쓸 내용을 설정하는 방법을 설명한다.

 

물론 접근 로그에 정보를 기록하는 것은 로그 관리의 시작일 뿐이다. 다음 단계는 이 정보를 분석하여 유용한 통계를 만드는 것이다. 이 문서는 일반적인 로그 분석에 대해서 다루지 않으며, 로그 분석은 실제 웹서버가 할 일이 아니다. 로그 분석에 대한 정보와 로그를 분석하는 소프트웨어에 대해서는 Open DirectoryYahoo를 참고하라.

 

아파치 웹서버는 이전부터 mod_log_referer, mod_log_agent, CustomLog 같은 모듈과 지시어를 사용하여 접근 로그를 다루었다. 지금은 CustomLog 지시어가 오래된 지시어들의 모든 기능을 이어받았다.

 

Common 로그 형식

 

접근 로그의 전형적인 설정은 다음과 같다.

 

LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common

 

 형식문자열은 퍼센트 지시어들로 구성되며, 각각은 어떤 정보를 기록할지 알린다. 형식문자열에 일반 문자를 적으면 그대로 로그에 출력된다. 따옴표 문자(")를 출력하고 싶다면 백슬래쉬를 앞에 붙여서 형식문자열의 끝이 아님을 표시한다. 형식문자열에 줄바꿈 "\n", 탭 "\t"와 같은 특수 조절문자를 사용할 수 있다.

 

앞의 설정은 공통로그형식(Common Log Format, CLF)이라는 형식으로 로그 항목을 기록한다. 여러 다른 웹서버들도 이런 표준 형식으로 로그를 만들며, 여러 로그 분석 프로그램에서 읽을 수 있다. CLF로 만든 로그파일 항목은 다음과 같다:

 

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326

 

이제 로그 항목의 각 부분을 설명한다.

127.0.0.1 (%h)
서버에 요청을 한 클라이언트(원격 호스트)의 IP 주소이다. HostnameLookupsOn이라면 호스트명을 찾아서 IP 주소 자리에 대신 쓴다. 그러나 이 설정은 서버를 매우 느리게 할 수 있으므로 추천하지 않는다. 호스트명을 알려면 대신 나중에 logresolve와 같은 로그를 처리하는 프로그램을 사용하는 것이 좋다. 여기에 나온 IP 주소는 사용자가 사용하는 컴퓨터 주소가 아닐 수 있다. 프록시 서버가 사용자와 서버사이에 존재한다면, 원래 컴퓨터 주소가 아니라 프록시의 주소가 기록될 것이다.
 
- (%l)
출력에서 "빼기기호"는 요청한 정보가 없음을 나타낸다. 이 경우 여기에 나올 정보는 클라이언트 컴퓨터의 identd가 제공할 클라이언트의 RFC 1413 신원이다. 이 정보는 매우 믿을 수 없기때문에, 긴밀히 관리되는 내부 네트웍이 아니라면 절대로 이 정보를 사용하면 안된다. IdentityCheckOn이 아니라면 아파치 웹서버는 이 정보를 알아보려고 시도하지도 않는다.
 
frank (%u)
이는 HTTP 인증으로 알아낸 문서를 요청한 사용자의 userid이다. 보통 이 값은 CGI 스크립트에게 REMOTE_USER 환경변수로 넘겨진다. 요청의 상태코드가 401이라면 (아래 참고) 사용자가 아직 인증을 거치지 않았으므로 이 값을 믿으면 안된다. 문서를 암호로 보호하지 않는다면 이 항목은 이전 항목과 같이 "-"이다.
 
[10/Oct/2000:13:55:36 -0700] (%t)
서버가 요청처리를 마친 시간. 형식은:

[day/month/year:hour:minute:second zone]
day = 숫자 2개
month = 숫자 3개
year = 숫자 4개
hour = 숫자 2개
minute = 숫자 2개
second = 숫자 2개
zone = (`+' | `-') 숫자 4개

로그 형식문자열에 %{format}t를 사용하여 다른 형식으로 시간을 출력할 수 있다. format은 C 표준 라이브러리의 strftime(3)과 같다.
 
"GET /apache_pb.gif HTTP/1.0" (\"%r\") == ("%m %U%q %H)
클라이언트의 요청줄이 쌍따옴표로 묶여있다. 요청줄은 매우 유용한 정보를 담고 있다. 첫째, 클라이언트가 사용한 메써드는 GET이다. 둘째, 클라이언트는 자원 /apache_pb.gif를 요청한다. 세번째, 클라이언트는 HTTP/1.0 프로토콜을 사용한다. 요청줄의 여러 부분을 따로 로그할 수도 있다. 예를 들어, 형식문자열 "%m %U%q %H"은 "%r"과 똑같이 메써드, 경로, 질의문자열, 프로토콜을 로그한다.
 
200 (%>s)
이는 서버가 클라이언트에게 보내는 상태코드이다. 이 정보는 (2로 시작하는 코드) 요청이 성공하였는지, (4로 시작하는 코드) 클라이언트에 오류가 있는지, (5로 시작하는 코드) 서버에 오류가 있는지 알려주므로 매우 중요하다. 상태코드의 전체 목록은 HTTP 규약 (RFC2616 section 10)에서 찾을 수 있다.
 
2326 (%b)
마지막 항목은 응답 헤더를 제외하고 클라이언트에게 보내는 내용의 크기를 나타낸다. 클라이언트에게 보내는 내용이 없다면 이 값은 "-"이다. 내용이 없는 경우 "0"을 로그하려면 대신 %B를 사용한다.

 

Combined 로그 형식

 

자주 사용되는 다른 형식문자열은 결합된로그형식(Combined Log Format)이다. 다음과 같이 사용한다.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog log/access_log combined

이 형식은 두 항목을 더 추가한 것을 제외하고는 Common 로그 형식과 완전히 같다. 추가된 항목들은 퍼센트 지시어 %{header}i를 사용한다. 여기서 header 자리에 HTTP 요청 헤더 이름이 나올 수 있다. 이 형식의 접근 로그는 다음과 같다:

 

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"

추가된 항목은:

"http://www.example.com/start.html" (\"%{Referer}i\")
"Referer" (맞춤법 틀리지않았음) HTTP 요청 헤더. 클라이언트가 참조했다고 서버에게 알린 사이트이다. (즉, /apache_pb.gif를 링크하였거나 포함한 사이트이다.)
 
"Mozilla/4.08 [en] (Win98; I ;Nav)" (\"%{User-agent}i\")
User-Agent HTTP 요청 헤더. 클라이언트 브라우저가 자신에 대해 알리는 식별정보이다.

 

여러 접근 로그

 

설정파일에 여러 CustomLog 지시어를 사용하면 접근 로그가 여러개 만들어진다. 예를 들어, 다음 설정은 세가지 접근 로그를 만든다. 첫번째는 기본 CLF 정보를 기록하고, 두번째와 세번째는 referer와 브라우저 정보를 기록한다. 마지막 두 CustomLog 줄은 어떻게 이전 ReferLogAgentLog 지시어의 기능을 흉내낼 수 있는지 보여준다.

 

LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
CustomLog logs/referer_log "%{Referer}i -> %U"
CustomLog logs/agent_log "%{User-agent}i"

 

또, 이 예는 LogFormat으로 반드시 별명을 정의할 필요는 없음을 보여준다. 대신 CustomLog 지시어에 직접 로그 형식을 지정할 수 있다.

 

조건부 로그

 

클라이언트 요청의 성격에 따라 해당 항목을 접근 로그에 기록하지않고 싶을 때가 있다. 환경변수를 사용하면 쉽게 해결된다.

 

먼저, 클라이언트가 특정 조건을 만족하면 환경변수를 설정한다. 이 작업에는 보통 SetEnvIf를 사용한다. 그리고 CustomLog 지시어에 env=을 사용하여 환경변수 유무에 따라 요청을 집어넣거나 뺀다. 예를 들면:

 

# loop-back 인터페이스에서 요청을 표시한다
SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog

 

# robots.txt 파일에 대한 요청을 표시한다
SetEnvIf Request_URI "^/robots\.txt$" dontlog

# 나머지를 로그에 남긴다
CustomLog logs/access_log common env=!dontlog

 

다른 예로 영어권 사용자의 요청만을 한 로그파일에 기록하고, 비영어권 사용자의 요청은 다른 로그파일에 기록하는 경우를 생각해보자.

SetEnvIf Accept-Language "en" english
CustomLog logs/english_log common env=english
CustomLog logs/non_english_log common env=!english

 

조건부 로그는 매우 강력하고 유연하지만, 이것이 로그 내용을 조절하는 유일한 방법은 아니다. 로그파일은 서버의 모든 행동을 기록할때 더 유용하다. 나중에 원하지않는 요청을 제외하고 로그파일을 분석하는 것이 더 쉽다.

 

위 글은 [http://httpd.apache.org/docs/2.4/logs.html] 글을 참조하여 작성하였습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.
:
Posted by .07274.
2014. 8. 7. 10:33

톰켓(Tomcat) 로그 포맷 I.lib()/I.lib(Tomcat)2014. 8. 7. 10:33

.. .. ..

.

톰켓 로그 포멧은 아래와 같다.

 

[한글]

%a - 원격 IP 주소
%A - 로컬 IP 주소
%b - Bytes sent,excluding HTTP headers, or '-' if zero
%B - Bytes sent, excluding HTTP headers
%h - 원격 호스트 이름 (호스트가 잘못된 경우 IP 주소)
%H - 요청 프로토콜
%l - 인증시 원격 논리적 유저명.(언제나 '-'를 리턴함)
%m - 요청 메서드 (GET, POST, etc.)
%p - 요청시 접근한 Local port
%q - 쿼리 스트링(요청 파라미터?).
%r - 요청의 첫번째 라인 (메서드와 요청 URI)
%s - 응답 HTTP 상태 (200, 404 등)
%S - 사용자 세션 id
%t - 공통 로그 포멧에 맞는 날짜와 시간값
%u - 인증되었을 경우 원격 사용자.(아닐시에는 '-')
%U - 요청된 URL 경로
%v - 로컬 서버 이름
%D - 요청을 처리한 시간 (밀리세컨)
%T - 요청을 처리한 시간 (초)
%I - 현재 요청한 쓰레드 이름(차후 스텍 트레이스에 사용가능)

[영어]

%a - Remote IP address
%A - Local IP address
%b - Bytes sent, excluding HTTP headers, or '-' if zero
%B - Bytes sent, excluding HTTP headers
%h - Remote host name (or IP address if resolveHosts is false)
%H - Request protocol
%l - Remote logical username from identd (always returns '-')
%m - Request method (GET, POST, etc.)
%p - Local port on which this request was received
%q - Query string (prepended with a '?' if it exists)
%r - First line of the request (method and request URI)
%s - HTTP status code of the response
%S - User session ID
%t - Date and time, in Common Log Format
%u - Remote user that was authenticated (if any), else '-'
%U - Requested URL path
%v - Local server name
%D - Time taken to process the request, in millis
%T - Time taken to process the request, in seconds
%I - Current request thread name (can compare later with stacktraces)

.
:
Posted by .07274.