블로그 이미지
윤영식
Full Stacker, Application Architecter, KnowHow Dispenser and Bike Rider

Publication

Category

Recent Post

2013. 7. 18. 10:08 Middleware, Cloud/WAS

JBoss 기동후 정상적으로 시작되었는지 확인해 보기위하여 server.log 또는 nohup.out 에서 "Started in" 로그를 체크한다. 하지만 간혹 해당 메세지가 안나올 경우도 있는데 이때는 ADMIN PORT (default: 8080)에 대해서 체크하도록 한다 



1. start, stop, status check shell

#!/bin/sh
#JBOSS start and stop script.
#rks2286(at)gmail(dot)com
#Sample script start and stop for jboss:
#-----------------------
#Changable texts JBOSS_ROOT, ADMIN_USERNAME, ADMIN_PASSWD, ADMIN_PORT, RMI_PORT, PROFILE.
#-----------------------
JBOSS_ROOT=/opt/jboss-eap-4.3/jboss-as/
ADMIN_USERNAME=admin
ADMIN_PASSWD=jbossadm
ADMIN_PORT=8080
RMI_PORT=1099
PROFILE=all
#---------------------
#JBOSS StartUp.....
#---------------------
export CLASSPATH
start() {
echo Starting jboss...;
echo Wait while the jboss server starts...;
$JBOSS_ROOT/bin/run.sh -c $PROFILE -b 0.0.0.0 > /tmp/null &
}
#-------------------
#JBOSS shutdown.....
#-------------------

stop() {
echo Stopping jboss..;
echo Wait while the jboss server stops;
$JBOSS_ROOT/bin/shutdown.sh -s `hostname`:$RMI_PORT -u $ADMIN_USERNAME -p $ADMIN_PASSWD &
}
status() {
echo Checking JBoss Status..
echo Wait for a while...
_up=`netstat -an | grep $ADMIN_PORT | grep -v grep | wc -l`

if [[ "${_up}" != "0" ]]; then
echo "###############################################"
echo "JBoss Application Server is Up!! And Running.!!"
echo "###############################################"
else
echo "##################################"
echo "JBoss Application Server is Down!!"
echo "##################################"
fi;
}

if [[ "${1}" == "start" ]];
then
start
elif [[ "${1}" == "stop" ]];
then
stop
elif [[ "${1}" == "status" ]];
then
status
else
echo "####################################################"
echo Usage:
echo export JBOSS_ROOT=Path_To_Root_Folder
echo .\/\jboss.sh start\|\stop;
echo Example:
echo export JBOSS_ROOT=\/\opt\/\jboss-eap-4.3\/\jboss-as;
echo ./jboss.sh start\|\stop;
echo "####################################################"
fi;
exit 0;


2. 수행 방법 

  - 해당 쉘이 jboss.sh 라면

  - 시작 : jboss.sh start

  - 종료 : jboss.sh stop

  - 정상 : jboss.sh status



<참조>

  - 원문 : start, stop, status shell script

posted by 윤영식
2013. 7. 10. 18:06 Middleware, Cloud/WAS

아파치<->제이보스로 연결되어 있고 업무 애플리케이션에서 큰 파일을 업로드하면서 아파치에서는 응답없음 메세지가 화면에 나타나고, 제이보스는 계속해서 파일업로드 처리를 하여 정상 종료되었을 경우 어디를 보아야 하는지 알아보자 



1. mod_jk 설정 찾기

  - 먼저 apache에 설정된 workers.properties 파일을 찾는다

  - socket_timeout 과 reply_timeout 설정 값을 확인한다



2. socket_timeout 의미

Socket timeout in seconds used for communication channel between JK and remote host. If remote host does not respond inside that timeout the JK will generate an error, and retry again. If set to value zero (default) the JK will wait for infinite on all socket operations. 

  - 초단위로 설정

  - JK와 리모트이니 여기서는 제이보스간의 연결

  - 제이보스에서 응답이 없으면 timeout 설정값에 따라 에러가 발생함

  - 0으로 설정하면 응답 올 때까지 socket 동작이 유지됨. 권장하지 않음 (참조)



3. reply_timeout 의미

 Reply_timeout property told webserver to wait some time for reply to a forwarded request before considering the remote tomcat is dead and eventually switch to another tomcat in a cluster group. 

  - 밀리초단위로 설정

  - 리모트 서버 -여기서는 제이보스가 다운되기 전까지- 아파치가 앞선 요청에 대하여 응답을 기다리는 시간

  - 만일 제이보스가 클러스터링 되어 있고 timeout이 발생하면 Live된 곳으로 요청이 재전송됨



4. 상황 및 튜닝

  - socket_timeout 300 초, reply_timeout 60 초 이면서 파일 업로드가 180초걸릴 경우

    + 아파치에서는 60초후 응답이 없으므로 브라우져로 응답이 없다고 에러를 클라이언트에게 던진다

    + 그러나 리모트 서버쪽의 socket은 300초까지 live 이므로 파일업로드는 정상적으로 수행하게 된다 

    + 클라이언트 입장에서는 브라우져에서 에러를 뱉어내니 에러인줄 알지만 실상은 서버에 정상적으로 업로드 되었다 


  - 파일 업로드 시간이 최대 180초 걸릴 경우

    + socket_timeout = 200 , reply_timeout = 200000 

    + 즉 각 timeout 값을 180초 이상 설정한다 



<참조> 

  - workers.properties 설정하기

  - socket_timeout과 reply_timeout의 의미

  - apache timeout 에 대하여 : 파일다운로드시

  - socket_timeout과 retry count에 대하여

posted by 윤영식
2013. 7. 9. 18:02 Middleware, Cloud/WAS

Apache-WebLogic간의 연결시 Timeout 설정에 대한 부분을 체크해 보자.


1. Apache-WebLogic간의 연결

  - AJP를 사용하지 않고 직접 WebLogic module을 httpd.conf 에 설정한다 (참조)

  - 환경설정 예

LoadModule weblogic_module    modules/mod_wl_22.so


<Location /services>
    SetHandler weblogic-handler
</Location>

<IfModule mod_weblogic.c>
WebLogicCluster 127.0.0.1:8881,127.0.0.1:8882
MatchExpression *.jsp
Idempotent OFF
DynamicServerList OFF
KeepAliveEnabled OFF
ConnectTimeoutSecs 16
ConnectRetrySecs 2
FileCaching OFF
</IfModule>



2. Apache Timeout 설정

  - ajp 연결이 아니므로 workers.properties의 socket_timeout 또는 reply_timeout과 관련이 없다

  - apache/httpd/conf/extra/httpd-default.conf의 Timeout 과 관련 (참조)

Timeout 300
클라이언트의 요청에 의해 서버와 연결이 되었을 때 클라이언트와 서버간에 아무런 메시지가 발생하지 않았을 때 오류로 처리될 시간을 초단위로 설정. 초기값은 1200초(20분)이며 보통은 300초(5분)로 지정한다. 네트워크의 속도가 나쁠수록 수치값은 높게 설정하는 것이 좋다.



3. WebLogic Timeout 설정

  - httpd.conf에 timeout 관련 설정을 한다

  - WebLogic안에서 request<->response에 대한 직접적인 처리 - WLIOTimeoutSecs 설정 (참조1, 참조2)

WLIOTimeoutSecs 300

  - default : 300 초

  - 웹로직으로 request를 보내고 response를 받기 위해서 대기하는 시간

  - post 방식으로 대량의 데이터를 WebLogic으로 보낼 때 timeout이 발생하면 plug-ins에 "POST_TIMEOUT"에러가 발생한다


  - WebLogic을 클러스터링 환경으로 구성하였을 경우는 idempotent 환경에 대하여 고려한다. (참조)

Idempotent OFF

  - WebLogic서버로 부터 request전송시 에러가 발생하거나, 서버로부터 결과를 기다리는 중에
     위에 정의된 WLIOTimeoutSecs 시간 초과되어서 에러 발생시 요청을 다시 보낼 것인가를 지정.
  - 서버와 연결은 되었는데 그 이후에 에러가 발생 하였을 경우 해당 옵션이 ON이면 다시 연결을 시도하고
    요청을 보내게 되므로 중복 요청의 가능성이 있다. OFF권장.


posted by 윤영식
2013. 6. 5. 14:06 Middleware, Cloud/WAS

JBoss 나 WebLogic에서 Oracle을 연결할 때 Oracle이 RAC(Oracle Real Application Clustering)으로 구성이 되어 있다면 이에 맞는 DB Pool 설정을 해야한다 



1. Oracle Clustering Config

  - 환경설정

<connection-url>

jdbc:oracle:thin:@(description=(address_list=(load_balance=on)(failover=on)(address=(protocol=tcp)(host=host1)(port=1521))(address=(protocol=tcp)(host=host2)(port=1521)))(connect_data=(service_name=xxxxsid)(failover_mode=(type=select)(method=basic))))

</connection-url>



2. JBoss Config

  - 환경파일 : <domainName>/deploy/oracle-ds.xml 

 <datasources>

   <local-tx-datasource>

  <jndi-name>cmstDs</jndi-name> 

  <connection-url>

jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST = (LOAD_BALANCE = off)(FAILOVER = on)(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = 128.0.0.1)(PORT = 1521)))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = PGTMO)(FAILOVER_MODE =    (TYPE = SELECT)(METHOD = BASIC))))

</connection-url> 

  <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> 

  <user-name>yun</user-name> 

  <password>dowon</password>


  <min-pool-size>30</min-pool-size>

  <max-pool-size>50</max-pool-size>


  <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>

  <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name>


   <query-timeout>300</query-timeout>

   <background-validation-minutes>5</background-validation-minutes>

   <blocking-timeout-millis>10000</blocking-timeout-millis>


  </local-tx-datasource>

 </datasources>



3. Weblogic Config

  - 환경파일 : <domainName>/config/jdbc/xxxx-jdbc.xml

<?xml version='1.0' encoding='UTF-8'?>

<jdbc-data-source xmlns="http://xmlns.oracle.com/weblogic/jdbc-data-source" xmlns:sec="http://xmlns.oracle.com/weblogic/security" xmlns:wls="http://xmlns.oracle.com/weblogic/security/wls" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/jdbc-data-source http://xmlns.oracle.com/weblogic/jdbc-data-source/1.2/jdbc-data-source.xsd">

  <name>youngsik-test</name>

  <jdbc-driver-params>

    <url>

jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=OFF)(FAILOVER=ON)(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=128.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=PGTMO)))

    </url>

    <driver-name>oracle.jdbc.OracleDriver</driver-name>

    <properties>

      <property>

        <name>SendStreamAsBlob</name>

        <value>true</value>

      </property>

      <property>

        <name>user</name>

        <value>MOBICON</value>

      </property>

      <property>

        <name>oracle.net.CONNECT_TIMEOUT</name>

        <value>10000</value>

      </property>

    </properties>

    <password-encrypted>dowon-manse</password-encrypted>

  </jdbc-driver-params>

  <jdbc-connection-pool-params>

    <initial-capacity>1</initial-capacity>

    <connection-creation-retry-frequency-seconds>10</connection-creation-retry-frequency-seconds>

    <test-frequency-seconds>120</test-frequency-seconds>

    <test-connections-on-reserve>true</test-connections-on-reserve>

    <test-table-name>SQL SELECT 1 FROM DUAL</test-table-name>

    <seconds-to-trust-an-idle-pool-connection>0</seconds-to-trust-an-idle-pool-connection>

  </jdbc-connection-pool-params>

  <jdbc-data-source-params>

    <jndi-name>jdbc/oracle/yun</jndi-name>

    <global-transactions-protocol>None</global-transactions-protocol>

  </jdbc-data-source-params>

</jdbc-data-source>



<참조>

  - Weblogic DB Configuration 이해하기

  - Oracle Cluster config

  - JBoss Deploy 및 ClassLoader구조와 Hibernate 사용하기 

  - JBoss 5 환경설정 및 튜닝 (필독)

posted by 윤영식
2013. 5. 29. 14:16 Middleware, Cloud/WAS

제이보스에서 버전별 Session 객체의 타임아웃 설정하는 곳은 어디일까?


1. 버전별 설정 위치 

  - 기본 설정사항 

JBoss 6.x

deploy/jbossweb.sar/web.xml

JBoss 5

deployers/jbossweb.deployer/web.xml

JBoss 4.3
deploy/jboss-web.deployer/conf/web.xml
Earlier versions

deploy/jbossweb-tomcat55.sar/conf/web.xml


    <!-- ==================== Default Session Configuration ================= -->

   <!-- You can set the default session timeout (in minutes) for all newly   -->
   <!-- created sessions by modifying the value below.                       -->

   <session-config>
      <session-timeout>30</session-timeout>
   </session-config>



2. 재설정 방법

  - 컨텍스트별 설정 변경

  - WEB-INF/web.xml 에 동일 태그로 설정한다.  (단위, min)

  - 값이 0 이면 영구적으로 보관 즉, WAS 재기동전까지...

Add the same tags as above to WEB-INF/web.xml.  Here is the DTD for further explanation:

<!--
The session-config element defines the session parameters for
this web application.

Used in: web-app
-->
<!ELEMENT session-config (session-timeout?)>

<!--
The session-timeout element defines the default session timeout
interval for all sessions created in this web application. The
specified timeout must be expressed in a whole number of minutes.
If the timeout is 0 or less, the container ensures the default
behaviour of sessions is never to time out.

Used in: session-config
--> 

<!ELEMENT session-timeout (#PCDATA)>


  - 또는 애플리케이션에서 호출해도 된다. 

    + 만일 web.xml 설정을 해도 제대로 동작되지 않으면 하드코딩 되어 있는지 확인한다 (참조1 , 참조2)

    + 해당 코드를 넣으면 전역으로 반영이 된다

HttpSession.setMaxInactiveInterval(int seconds)



<참조>

  - 원문 : 세션 Timeout 설정

  - 세션 Timeout 설정하기 정리

posted by 윤영식
2013. 5. 21. 17:08 Middleware, Cloud/WAS

OOM(OutOfMemory) 에러가 발생하거나 Heap Dump 로그를 떨구고서 WAS가 죽을 경우 메모리설정에 대한 이슈를 어떻게 해결할지 알아보자 


1) JVM 메모리 운영

  - Heap = Young Generation + Old Generation + Permanent Generation(PermSize=MethodArea)

    + Young 에서 신규 생성되어 오래된 객체가 Old로 넘어감

    + Young 에서 바로 사용되지 않으면 Minor GC

    + Old로 넘어간 후 Old에서 더 이상 사용되지 않으면 Full GC

    + Perm 영역은 상수영역으로 GC 대상은 아니나 간혹 일어남


  - Young Generation = Eden + Survivor (2개)  로 구성

    + Eden 에서 사용되어진 것은 Survivor로 넘어가고 다시 Old 영역으로 넘겨진다  



2) jstat 명령을 통한 GC 모니터링

  - $JDK_HOME/bin/jstat 명령어 이용 

  - jstat 옵션들 : 출처 (http://helloworld.naver.com/helloworld/helloworld/6043)

옵션

기능

gc

각 힙(heap) 영역의 현재 크기와 현재 사용량(Eden 영역, Survivor 영역, Old 영역등), 총 GC 수행 횟수, 누적 GC 소요 시간을 보여 준다.

gccapactiy

각 힙 영역의 최소 크기(ms), 최대 크기(mx), 현재 크기, 각 영역별 GC 수행 횟수를 알 수 있는 정보를 보여 준다. 단, 현재 사용량과 누적 GC 소요 시간은 알 수 없다.

gccause

-gcutil 옵션이 제공하는 정보와 함께 마지막 GC 원인과 현재 발생하고 있는 GC의 원인을 알 수 있는 정보를 보여 준다.

gcnew

New 영역에 대한 GC 수행 정보를 보여 준다.

gcnewcapacity

New 영역의 크기에 대한 통계 정보를 보여 준다.

gcold

Old 영역에 대한 GC 수행 정보를 보여 준다.

gcoldcapacity

Old 영역의 크기에 대한 통계 정보를 보여 준다.

gcpermcapacity

Permanent 영역에 대한 통계 정보를 보여 준다.

gcutil

각 힙 영역에 대한 사용 정도를 백분율로 보여 준다. 아울러 총 GC 수행 횟수와 누적 GC 시간을 알 수 있다.


  - gcutil / gccapcity 사용 예

    + gcutil : WAS 기동후 FGC(Full GC 건수)는  230회 발생하였고, FGCT(Full GC 수행시간)은 2302초로 거의 10초가 소요되었다

                 Full GC 수행마다 10초의 시간

    + gccapacity : New 영역 사용크기(NGCMN) 이 2,097,152 (즉 2Gbytes)이고 Old 영역 사용크기(OGCMN)가 3,145,728 (즉 3GBytes) 가량이 된다 

[jboss@dowon ~]$ ps -ef |grep java

jboss    13090 13053  8 Mar27 ?        04:28:28 /usr/java/jdk1.6.0_31/bin/java -Dprogram.name=run.sh -server .. 중략..


[jboss@dowon ~]$ jstat -gcutil 13090

  S0     S1     E        O       P     YGC   YGCT    FGC   FGCT      GCT   

  0.76   0.00  85.57  86.24  26.88   1260  644.013   230   2302.259   2946.273


[jboss@dowon ~]$ jstat -gccapacity 13090

 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC      PGCMN    PGCMX     PGC       PC     YGC    FGC 

2097152.0 2097152.0 2097152.0 430656.0 412096.0 1254400.0  3145728.0  3145728.0  3145728.0  3145728.0 524288.0 524288.0 524288.0 524288.0   1260   230


  - 간단한  GC Check Shell Script 작성해 보았다 

    + weblogic.Server (jboss: org.jboss.Main) 부분을 WAS나 JAVA Process 환경에 맞게 변경하여 사용한다

    + WAS가 기동된 이후 Full GC 평균 시간 = FGCT/FGC  : 만일 3초이상이면 점검 대상으로 지정

#!/bin/sh


# [GC Statistics after WAS started]

# config

#   interval : 3 sec

#   count : 2


echo ""

echo "[GC statistics after WAS is started]"

echo "----------------------------------------"

echo " S0/S1: Survivor 0/1 (KB)"

echo " E    : Eden (KB)"

echo " O    : Old area size (KB)"

echo " P    : Permanent area size (KB)"

echo " YGC  : Young Generation GC Count"

echo " YGCT : Young Generation GC Total Time"

echo " FGC  : Full GC Count"

echo " FGCT : Full GC Total Time"

echo " GCT  : GC Total Time"


echo "----------------------------------------"

echo ""

echo " HostName : " $(hostname)

echo ""

for PID in  `ps -ef | grep java | egrep -v grep | grep weblogic.Server | awk -F" " '{print $2}'`

do

echo " WAS PID  : " $PID

echo "----------------------------------------------------------------------------"

jstat -gcutil $PID 3000 2

echo "----------------------------------------------------------------------------"

echo ""

done

echo ""


결과

===========================================

 HostName :  jupitorDowon


 WAS PID  :  355343

----------------------------------------------------------------------------

  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   

  0.00   0.00  52.68  13.52  31.58   3764   30.408  1878 1148.863 1179.271

  0.00   0.00  52.69  13.52  31.58   3764   30.408  1878 1148.863 1179.271

----------------------------------------------------------------------------


  - 컬럼 출력 내용 : 출처 (http://helloworld.naver.com/helloworld/helloworld/6043)

칼럼

설명

jstat 옵션

S0C

Survivor 0 영역의 현재 크기를 KB 단위로 표시

-gc

-gccapacity

-gcnew

-gcnewcapacity

S1C

Survivor 1 영역의 현재 크기를 KB 단위로 표시

-gc

-gccapacity

-gcnew

-gcnewcapacity

S0U

Survivor 0 영역의 현재 사용량을 KB 단위로 표시

-gc

-gcnew

S1U

Survivor 1 영역의 현재 사용량을 KB 단위로 표시

-gc

-gcnew

EC

Eden 영역의 현재 크기를 KB 단위로 표시

-gc

-gccapacity

-gcnew

-gcnewcapacity

EU

Eden 영역의 현재 사용량을KB 단위로 표시

-gc

-gcnew

OC

Old 영역의 현재 크기를 KB 단위로 표시

-gc

-gccapacity

-gcold

-gcoldcapacity

OU

Old 영역의 현재 사용량을KB 단위로 표시

-gc

-gcold

PC

Permanent영역의 현재 크기를 KB 단위로 표시

-gc

-gccapacity

-gcold

-gcoldcapacity

-gcpermcapacity

PU

Permanent영역의 현재 사용량을KB 단위로 표시

-gc

-gcold

YGC

Young Generation의 GC 이벤트 발생 횟수

-gc

-gccapacity

-gcnew

-gcnewcapacity

-gcold

-gcoldcapacity

-gcpermcapacity

-gcutil

-gccause

YGCT

Yong Generation의 GC 수행 누적 시간

-gc

-gcnew

-gcutil

-gccause

FGC

Full GC 이벤트가 발생한 횟수

-gc

-gccapacity

-gcnew

-gcnewcapacity

-gcold

-gcoldcapacity

-gcpermcapacity

-gcutil

-gccause

FGCT

Full GC 수행 누적 시간

-gc

-gcold

-gcoldcapacity

-gcpermcapacity

-gcutil

-gccause

GCT

전체 GC 수행 누적 시간

-gc

-gcold

-gcoldcapacity

-gcpermcapacity

-gcutil

-gccause

NGCMN

New Generation의 최소 크기를 KB단위로 표시

-gccapacity

-gcnewcapacity

NGCMX

New Generation의 최대 크기를 KB단위로 표시

-gccapacity

-gcnewcapacity

NGC

New Generation의 현재 크기를 KB단위로 표시

-gccapacity

-gcnewcapacity

OGCMN

Old Generation의 최소 크기를 KB단위로 표시

-gccapacity

-gcoldcapacity

OGCMX

Old Generation의 최대 크기를 KB단위로 표시

-gccapacity

-gcoldcapacity

OGC

Old Generation의 현재 크기를 KB단위로 표시

-gccapacity

-gcoldcapacity

PGCMN

Permanent Generation의 최소 크기를 KB단위로 표시

-gccapacity

-gcpermcapacity

PGCMX

Permanent Generation의 최대 크기를 KB단위로 표시

-gccapacity

-gcpermcapacity

PGC

현재 Permanent Generation의 크기를 KB단위로 표시

-gccapacity

-gcpermcapacity

PC

Permanent 영역의 현재 크기를 KB단위로 표시

-gccapacity

-gcpermcapacity

PU

Permanent 영역의 현재 사용량을 KB단위로 표시

-gc

-gcold

LGCC

지난 GC의 발생 이유

-gccause

GCC

현재 GC의 발생 이유

-gccause

TT

Tenuring threshold. Young 영역 내에서 이 횟수만큼 복사되었을 경우(S0 ->S1, S1->S0) Old 영역으로 이동

-gcnew

MTT

최대 Tenuring threshold. Yong 영역 내에서 이 횟수만큼 복사되었을 경우 Old 영역으로 이동

-gcnew

DSS

적절한 Survivor 영역의 크기를 KB단위로 표시

-gcnew



3) verbose:gc 옵션을 통한 GC 모니터링

  - WAS 기동 Shell에 verbose:gc 옵션을 준다

    + GC에 대해 자세히 시간을 찍도록 한다

    + 로그위치와 명칭을 지정한다

-verbose:gc 

-Xloggc:/applog/cmsmDomain/gclog/gc.log 

-XX:+PrintGCDetails 

-XX:+PrintGCTimeStamps 

-XX:+PrintHeapAtGC 

-XX:+HeapDumpOnOutOfMemoryError 

-XX:HeapDumpPath=/applog/cmsmDomain/gclog/java_pid.hprof 


  - 로그 출력 예

// Full GC

7210.826: [Full GC (System) [PSYoungGen: 23616K->0K(1947520K)] [PSOldGen: 886563K->856929K(3145728K)] 910179K->856929K(5093248K) [PSPermGen: 138064K->138064K(524288K)], 2.9391980 secs] [Times: user=2.98 sys=0.00, real=2.94 secs]

Heap after GC invocations=52 (full 3):

 PSYoungGen      total 1947520K, used 0K [0x0000000780000000, 0x0000000800000000, 0x0000000800000000)

  eden space 1801536K, 0% used [0x0000000780000000,0x0000000780000000,0x00000007edf50000)

  from space 145984K, 0% used [0x00000007edf50000,0x00000007edf50000,0x00000007f6de0000)

  to   space 141376K, 0% used [0x00000007f75f0000,0x00000007f75f0000,0x0000000800000000)

 PSOldGen        total 3145728K, used 856929K [0x00000006c0000000, 0x0000000780000000, 0x0000000780000000)

  object space 3145728K, 27% used [0x00000006c0000000,0x00000006f44d8428,0x0000000780000000)

 PSPermGen       total 524288K, used 138064K [0x00000006a0000000, 0x00000006c0000000, 0x00000006c0000000)

  object space 524288K, 26% used [0x00000006a0000000,0x00000006a86d41d8,0x00000006c0000000)

}

// Minor GC

10500.769: [GC [PSYoungGen: 1769535K->35007K(1928320K)] 2645761K->912640K(5074048K), 0.0958040 secs] [Times: user=0.17 sys=0.00, real=0.09 secs]

Heap after GC invocations=67 (full 3):

 PSYoungGen      total 1928320K, used 35007K [0x0000000780000000, 0x0000000800000000, 0x0000000800000000)

  eden space 1754816K, 0% used [0x0000000780000000,0x0000000780000000,0x00000007eb1b0000)

  from space 173504K, 20% used [0x00000007f5690000,0x00000007f78bff00,0x0000000800000000)

  to   space 168832K, 0% used [0x00000007eb1b0000,0x00000007eb1b0000,0x00000007f5690000)

 PSOldGen        total 3145728K, used 877632K [0x00000006c0000000, 0x0000000780000000, 0x0000000780000000)

  object space 3145728K, 27% used [0x00000006c0000000,0x00000006f59101d8,0x0000000780000000)

 PSPermGen       total 524288K, used 138386K [0x00000006a0000000, 0x00000006c0000000, 0x00000006c0000000)

  object space 524288K, 26% used [0x00000006a0000000,0x00000006a8724880,0x00000006c0000000)

}



4) 튜닝하기 

  - WAS 기동 Shell의 기본옵션

    + -Xms -Xmx 힙사이즈 지정

    + -server 옵션 지정

    GC 튜닝 시 기본적으로 학인해야 하는 JVM 옵션 (출처: http://helloworld.naver.com/helloworld/37111)

구분

옵션

설명

힙(heap) 영역 크기

-Xms

JVM 시작 시 힙 영역 크기

-Xmx

최대 힙 영역 크기

New 영역의 크기

-XX:NewRatio

New영역과 Old 영역의 비율

-XX:NewSize

New영역의 크기

-XX:SurvivorRatio

Eden 영역과 Survivor 영역의 비율


  - 설정 예 

/usr/java/jdk1.6.0_31/bin/java 

-server 

-Xms5120m -Xmx5120m 

-XX:NewSize=2048m 

-XX:MaxNewSize=2048m 

-XX:PermSize=512m 

-XX:MaxPermSize=512m 


-Xss5m 

-verbose:gc 

-Xloggc:/applog/cmsmDomain/gclog/gc.log 

-XX:+PrintGCDetails 

-XX:+PrintGCTimeStamps 

-XX:+PrintHeapAtGC 

-XX:+HeapDumpOnOutOfMemoryError 

-XX:HeapDumpPath=/applog/cmsmDomain/gclog/java_pid.hprof 


  - 다음의 경우 튜닝이 필요없다. 단 이것은 서비스의 특성에 따라 틀리다. 해당 시간 이상이면 튜닝 대상

  • Minor GC 처리 시간이 빠르다(50ms내외).
  • Minor GC 주기가 빈번하지 않다(10 내외).
  • Full GC 처리 시간이 빠르다(보통1 이내).
  • Full GC 주기가 빈번하지 않다(10분에 1).


  - Full GC 수행 시간과 수행 간격 조사 => Minor GC 수행 시간과 수행 간격 조사 => 전체 평균값 및 수행 횟수등을 조사하여 튠이 필요성을 판단한다 


  - 메모리 설정 옵션을 조정하면서 결정한다

    + 힙사이즈가 크면 GC 시간도 올래 걸린다 : 그만큼 많은 객체가 쌓여 있을 것이므로 

    + 따라서 무조건 크게 잡는다고 해서 좋은 것은 아니므로 적정사이즈를 찾아가는 것이 중요하다 

    + NewRatio=2 는 New Generation:Old Generation = 1:2 비율 사이즈로 사용크기를 지정하는 것임 (-Xmx 사이즈에 대해서)

      즉, NewRatio=4 이면 New:Old=1:4 비율의 크기임


  - 튜닝 예 1)

    + jstat -gccapacity의 New영역 사용크기(NGCMN)과 Old영역 사용크기(OGCMN) 값의 비율을 체크한다 

      NGCMN:OGCMN = 2:3 (Gbytes)

    + NewRatio=2 => 3 => 4 로 바꾸어 가면서 Full/Minor GC 평균응답시간을 구한다 (jstat -gctuil로 구함)


  - 튜닝 예 2)

    + verbose:gc 로그가 남으면 HP JMeter를 통하여 분석한다

    + JMeter를 통하여 Duration 발생 간격을 측정하거나 GC 소요 시간을 그래프 형태로 볼 수 있다. 

    + 여러 옵션을 차례로 처음 몇개에만 적용해 보고 jstat -gcutil 을 통하여 통계값을 얻고 최적치를 측정해 나간다 

  • Case1 : -XX:+UseParallelGC -Xms1536m -Xmx1536m -XX:NewRatio=2
  • Case2 : -XX:+UseParallelGC -Xms1536m -Xmx1536m -XX:NewRatio=3
  • Case3 : -XX:+UseParallelGC -Xms1g -Xmx1g -XX:NewRatio=3
  • Case4 : -XX:+UseParallelOldGC -Xms1536m -Xmx1536m -XX:NewRatio=2
  • Case5 : -XX:+UseParallelOldGC -Xms1536m -Xmx1536m -XX:NewRatio=3
  • Case6 : -XX:+UseParallelOldGC -Xms1g -Xmx1g -XX:NewRatio=3

 

위의 모든 내용은 HelloWorld의 연재글을 통하여 현재 운영하고 있는 JBoss의 GC 분석을 수행할 예정이다. 이자리를 빌어 이상민님에게 감사를 드린다. 또한 사전 허락없이 옵션 테이블을 인용하였고 만일 문제가 된다면 바로 삭제토록 할 예정이다. 



<참조>

  - GC 에 대한 이해 

    + Young:Old 영역에 대한 이해 : http://helloworld.naver.com/helloworld/1329

    + GC 모니터링 방법 -verbose:gc : http://helloworld.naver.com/helloworld/helloworld/6043


  - GC 튜닝 가이드 : http://helloworld.naver.com/helloworld/37111

  - jstat 사용예제 : https://community.jboss.org/thread/159052

posted by 윤영식
2013. 5. 15. 15:25 Middleware, Cloud/WAS

1. JBoss 5.1 has the following Thread Pools

  • System Thread Pool
  • HTTP Thread Pool
  • AJP Thread Pool
  • JCA Thread Pool(Work Manager Thread Pool)
  • JBoss Messaging Thread Pool (for remote clients)
  • JBoss Messaging Thread Pool (in JVM Clients)
  • EJB (same JVM)
  • EJB (remote Clients)

2. Port 정보 

TCP    10.2.20.156:1090       <--- RMI/JRMP socket for connecting to the JMX MBeanServer
TCP    10.2.20.156:1091       <--- RMI server socket
TCP    10.2.20.156:1099       <--- JNDI Service
TCP    10.2.20.156:1098       <--- RMI Port for JNDI Service
TCP    10.2.20.156:4446       <--- JBoss Remoting Connector
TCP    10.2.20.156:4712       <--- JBossTS Service
TCP    10.2.20.156:4713       <--- JBossTS Service
TCP    10.2.20.156:5445       <--- HornetQ JMS Service
TCP    10.2.20.156:5455       <--- HornetQ Netty port
TCP    10.2.20.156:5500       <--- JBoss Remoting
TCP    10.2.20.156:5501       <--- JBoss Remoting ssl
TCP    10.2.20.156:8009       <--- Web server AjpConnector
TCP    10.2.20.156:8080       <--- Web server HTTP Connector
TCP    10.2.20.156:8083       <--- Web services

 

<참조> 

  - http://zeroproductionincidents.wordpress.com/tag/jboss-thread-pool/

  - http://www.mastertheboss.com/jboss-configuration/jboss-port-configuration

posted by 윤영식
2013. 4. 1. 11:20 Middleware, Cloud/WAS

JVM에서 Thread Dump는 현재 수행중인 쓰레드에 대한 호출경로 StackTrace를 보기 위한 것이고 Heap Dump는 현재 Heap에서 점유되고 있는 객체들에 대한 조사를 위하여 필요한 내역이다 



1. Thread Dump 수행


  - 명령 : kill -3 <pid> 

  - <pid> 는 JVM의 process ID 이다 

  - Thread Dump 내역을 통하여 Thread ID와 호출에 대한 추적을 할 수 있다 

Full Java thread dump with locks info

"ZipFile Lock Reaper" Id=1826 in TIMED_WAITING on lock=java.util.TaskQueue@76a7850e

at java.lang.Object.wait(Native Method)

at java.util.TimerThread.mainLoop(Timer.java:509)

at java.util.TimerThread.run(Timer.java:462)


Locked synchronizers: count = 0


"ajp-0.0.0.0-8009-20" Id=1323 in WAITING on lock=org.apache.tomcat.util.net.AprEndpoint$Worker@12a2bc0f

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:485)

at org.apache.tomcat.util.net.AprEndpoint$Worker.await(AprEndpoint.java:1989)

at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:2014)

at java.lang.Thread.run(Thread.java:662)


Locked synchronizers: count = 0


"ajp-0.0.0.0-8009-19" Id=1321 in RUNNABLE (running in native)

at org.apache.tomcat.jni.Socket.recvbb(Native Method)

at org.apache.coyote.ajp.AjpAprProcessor.readt(AjpAprProcessor.java:1072)

at org.apache.coyote.ajp.AjpAprProcessor.readMessage(AjpAprProcessor.java:1163)

at org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:368)

at org.apache.coyote.ajp.AjpAprProtocol$AjpConnectionHandler.process(AjpAprProtocol.java:425)

at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:2036)

at java.lang.Thread.run(Thread.java:662)

... 중략 ..




2. Heap Dump 수행


  - JVM GC 블로깅에서 Old영역을 많이 사용할 경우 일반적으로 사용되지 않는 객체들이 Reference되어 GC되지 않고 남아 있을 가능성이 높다. 이때는 어떤 객체들이 많이 점유되고 있는지 조사할 필요가 있다

  - 즉, Old 영역을 많이 점유하고 있으면 Full GC가 자주 오래동안 발생할 수 있으므로 업무 응답시간에 문제 또는 장애를 일으킬 소지가 있다

  - JDK6 명령 : jmap -dump:format=b,file=<fileName> <PID>    

  - jmap은 JDK_HOME/bin 에 포함되어 있음




3. Heap Dump 분석

 

  - Eclipse Memory Analyzer Tool (mat) 을 이용한다

  - 독립 프로그램 다운로드 : Heap Dump Size는 몇 Gbytes 씩 되므로 64bit OS 에서 64bit mat 를 다운로드 받는다

  - MemoryAnalyzerTool.ini 파일의 초기값 설정을 Heap Dump 파일 사이즈에 따라 적절히 한다

    + 내 경우 : -Xms2048m -Xmx8192m (Heap Dump file size 6Gbytes 일때) 

-XX:MaxPermSize=256m

-Xms40m

-Xmx512m


  - mat에서 Heap Dump 파일을 로딩한다. 이때 파일 확장자는 .hprof 여야 한다. 

    6Gbytes 로딩에 대략 수시간이 소요되니 인내심이 필요 하다  

  - mat 통하여 Heap Dump 분석할 때 로컬 메모리가 부족할 경우 Swap Size를 확장하여 준다 (스왑 설정하기)



<참조>

  - OOM 발생에 대한 고찰

  - Heap Dump 생성하기

  - Eclipse Memory Analyzer Tool Download

  - JHat 분석툴, JVisualVM 분석툴 (jdk1.6제공)

posted by 윤영식
2013. 2. 20. 17:36 Middleware, Cloud/Linux

로그 백업을 위하여 crontab에 등록할 Bash Shell를 작업하려 한다. 익혀간 과정을 적어보자 


1) Backup 가정

  - 3일전 로그를 압축한다.

  - 여러개의 로그파일이 다양한 위치에 존재한다

  - 압축된 로그파일은 년/월 별도 디렉토리로 이동하여 관리한다

  - 작은 업무 시스템별로 로그의 위치가 틀리다 (단, 작은 업무 시스템안에 디렉토리는 고정임)


2) 3일전 로그찾기 

  - 몇일전 날짜를 찾는 문법 (참조)

####################################################

# 1) output is 3 days ago 

# backup directory name : backup_YYYY-MM in log files

# 3일전 파일을 찾는다 

YYYYMMDD=`date +%Y%m%d --date '3 days ago'`

DATE="${YYYYMMDD:0:4}-${YYYYMMDD:4:2}-${YYYYMMDD:6:2}"

BK_DIR="backup_${YYYYMMDD:0:4}-${YYYYMMDD:4:2}"

GZIP_CNT="0"


echo ""

echo "===============================[Backup Start]============================="

echo "<< Start Time: "`date '+%F  %r'`" >>"

echo "-- Backup File Date : $DATE, Backup Dir : $BK_DIR"


3) 여러개의 로그파일이 다양한 위치에 존재함

  - 지정한 디렉토리에 파일이 있으면 gzip으로 압축한다

####################################################

# 2) run gzip for log files

# ${1} : directory full path

# ${2} : file name

function mkdir_function()

{

  if [ ! -d ${1} ]; then

    echo "  make dir : ${1}"

    mkdir ${1}

  fi

}


# backup_YYYY-MM 디렉토리가 없으면 만들고 .gz  압축파일을 월별로 관리한다 

function mv_file_function()

{

  mkdir_function "${1}/$BK_DIR"


  echo "  move : ${1}/${2}.gz to ${1}/$BK_DIR"

  mv ${1}/${2}.gz ${1}/$BK_DIR/

}


# ${1} : directory full path

# ${2} : file name

# 지정된 파일만 압축 

function gzip_function() 

{

  if [ -e ${1}/${2} ]; then

    cd "${1}"    

    echo "  gzip : ${1}/${2}"


    gzip ${1}/${2}


    mv_file_function "${1}" "${2}"  


    GZIP_CNT=`expr $GZIP_CNT + 1` 

  fi

}


# for time loop gzip

# 3일 이전의 모든 파일들 

function gzip_loop_function()

{

  cd "${1}"

  for file in `find -type f -mtime +3`; do

     local FNAME="${file:2}"

     local EXT="${FNAME##*.}"

     if [ "$EXT" != "" ] && [ "$EXT" != "gz" ] && [ "$EXT" != "sh" ]; then

        gzip_function "${1}" "${FNAME}"

     fi

  done

}


4) 업무 단위 시스템별로 로그의 위치 지정 : 로그 지정하여 압축 수행함 

  echo "-- [START] ${JDOMAIN} backup : TX.xml & Error.xml log"

  gzip_function "/tmp/logs" "Transactions.log.$DATE"

  gzip_function "/tmp/logs" "Error.log.$DATE"


  # gc old log

  echo "-- [START] ${JDOMAIN} backup : old gclog log"

  gzip_loop_function "/tmp/logs/$JDOMAIN/old/gclog"

 

  # nohup old log

  echo "-- [START] ${JDOMAIN} backup : old nohup log"

  gzip_loop_function "/tmp/logs/$JDOMAIN/old/nohup"


5) 전체 Shell Script


<참조>

  - 백업받을 디렉토리를 만들어야 하는 경우 : 하기 내용은 function을 이용한 참조 내역임 (다른 유사 참조)

  - Bash Shell 문법을 익혀보자 (참조)

  - Bash Shell 문법 : 옵션 잘 설명됨 (참조)

posted by 윤영식
2013. 2. 7. 13:51 Middleware, Cloud/Linux

Linux의 CPU 갯수를 알아내는 명령어


  - 명령어 : grep processor /proc/cpuinfo | wc -l

  - 결과 : cpu core 8개

[jboss]$ grep processor /proc/cpuinfo | wc -l

8

[jboss]$ grep processor /proc/cpuinfo

processor       : 0

processor       : 1

processor       : 2

processor       : 3

processor       : 4

processor       : 5

processor       : 6

processor       : 7


posted by 윤영식
2013. 1. 11. 09:20 Middleware, Cloud/Linux

제목과 같은 경우 w 명령어가 있다. 


1) w - show who is logged on and what they are doing  : 로그인 사용자가 지금 수행중인 명령어를 볼 수 있다.

  - 예로 상대가 NFS(Network File System)를 마운트하고 있는데, 정확한 위치의 File을 상대가 마운트했는지 알려면 w 하라

  - w를 치면 누가 접속을 했고, 어떤 명령을 수행했는지 알 수 있다.

[jboss@host01 ~]$ w

 09:15:34 up 113 days,  6:32,  3 users,  load average: 0.05, 0.11, 0.10

USER     TTY         FROM           LOGIN@  IDLE   JCPU   PCPU   WHAT

jboss    pts/1        10.222.111.2     07:19     32:33    0.90s  0.83s    tail -100f xxxDomain.out

comc01 pts/0        10.222.111.2     Thu17   15:58m  0.11s  0.10s     vim company-log.log

jboss    pts/2        10.222.111.2     09:15     0.00s    0.01s  0.00s     w


<참조>

http://linux.about.com/library/cmd/blcmdl1_w.htm

'Middleware, Cloud > Linux' 카테고리의 다른 글

[Linux] Bash Shell for Log Backup  (0) 2013.02.20
[Linux] CPU 갯수 알아내기  (0) 2013.02.07
[Linux] Free Memory 사이즈 알기  (0) 2012.12.07
[Linux] Ubuntu 에 Maven 2 설치  (0) 2012.11.23
[Linux] vsftpd 설치하기  (0) 2012.11.21
posted by 윤영식
2012. 12. 7. 13:59 Middleware, Cloud/Linux

운영중에 Free Memory size가 부족하다고 하여 top 명령어로 살펴보았다. 


top - 13:52:48 up 60 days,  4:05,  2 users,  load average: 0.09, 0.34, 0.46

Tasks: 186 total,   1 running, 185 sleeping,   0 stopped,   0 zombie

Cpu(s):  1.8%us,  0.2%sy,  0.0%ni, 97.8%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st

Mem:  47185920k total, 47125908k used,    60012k free,  1250664k buffers

Swap: 10485752k total,      120k used, 10485632k free, 30877100k cached


  - Mem: 60,012 free 로 나온 것을 보아 헉 현재 60Mbytes 밖에 여유가 없다니! 과연 그럴까?

  - Linux의 경우 real free = free + cached of Swap 로 봐야 한다. 


free -gt 명령을 수행해 보면, 여유 메모리는 30G가 됩니다. 따라서 free 0 로 나오지만 buffers + cached 30G 의 free memory 여유가 있다고 보면 됩니다. 

[jboss@hostname ~]$ free -gt
                 total       used     free     shared   buffers  cached
Mem:            45         44          0          0          1         29
-/+ buffers/cache:     14         30
Swap:            9          0          9
Total:            54        44         10

cashed는 여유메모리로 보시면 됩니다.

리눅스 시스템은 파일형태로 관리되는 운영체제이기때문에 여유메모리를 캐쉬파일로 표현되고 있습니다.

또한 스왑이란 실제 메모리 캐쉬메모리까지 모두 사용해서, 부족할때 하드 일부분을 메모리 처럼 가져다 쓸때 사용되는 메모리를 말합니다.

free -gt로 보시면 사용되는 스왑메모리는 거의없습니다.

현재 메모리 여유가 있다고 보시면됩니다.


<참고>

  - 리눅스 메모리 관리

posted by 윤영식
2012. 11. 27. 17:18 Middleware, Cloud/DBMS

AMPSetup에서 install wizard로 설치후에 MySQL을 사용해 본다. apmsetup으로 설치를 하면 mysql console을 수행할 수 있고, 여기서 부터 mysql 명령을 통해 테이블을 만들어 보자


  • 테이터베이스 로그인 : mysql -u <id> -p <password> (만일 root 패스워드 잃어버렸을 경우 재설정 방법, APMSetup으로 설치하면 root default 암호 : apmsetup)
  • 테스트 데이터베이스 생성 : create database <database명>;   (참조)
  • 생성 내역 보기 : show databases;  (참조)
  • 데이터 베이스 사용하기 : use <database명>;
  • 테이블 보기 : show tables;  
mysql> create database ajax;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ajax               |
| mysql              |
| phpmyadmin         |
+--------------------+
4 rows in set (0.00 sec)

mysql> use ajax;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> create table comment(
    ->    id  int primary key,
    ->    name varchar(20) not null,
    ->    content long varchar not null
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> create table id_repository(
    ->    name varchar(2) primary key,
    ->    value int
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> insert into id_repository values('commnet', 0);
Query OK, 1 row affected, 1 warning (0.00 sec)

ajax 샘플 프로그램-댓글 달기- 테스트 하면서 만든 테이블 구조


posted by 윤영식
2012. 11. 26. 10:59 Middleware, Cloud/WAS

JBoss의 deploy와 deployer 디렉토리의 차이는 무엇을까? 들여다 보면 xml과 서브 디렉토리가 존재한다. 



deploy는 배포되는 애플리케이션과 jboss 서비스들이 위치한곳, deployer는 그러한 것들을 deploy하는 관련 내역을 설정한 것 정도가 아닐까 싶다. micro container가 OSGi container 개념과 유사하게 이해 하면 되겠다. 


posted by 윤영식
2012. 11. 23. 10:00 Middleware, Cloud/Linux

jboss source build를 위하여 ubuntu에 maven을 설치해 보자 


1) maven2 설치 하기

2) maven 설치 와 실행 파일 위치

root@ip-10-146-81-140:/etc/maven2# cd /usr/share/maven2   <-- 설치 위치
root@ip-10-146-81-140:/usr/share/maven2# ls
bin  boot  conf  lib
root@ip-10-146-81-140:/usr/share/maven2# cd /etc/maven2    <-- 환경 파일 저장 위치
root@ip-10-146-81-140:/etc/maven2# ls
m2.conf  settings.xml
root@ip-10-146-81-140:/etc/maven2# ls -alrt /etc/bin/mvn     <-- 실행 파일 symbolic link
ls: cannot access /etc/bin/mvn: No such file or directory
root@ip-10-146-81-140:/etc/maven2# ls -alrt /usr/bin/mvn
-rwxr-xr-x 1 root root 6331 Oct 24  2011 /usr/bin/mvn
root@ip-10-146-81-140:/etc/maven2# cd bin
bash: cd: bin: No such file or directory
root@ip-10-146-81-140:/etc/maven2# cd /usr/share/maven2/bin
root@ip-10-146-81-140:/usr/share/maven2/bin# ls -alrt
total 8
lrwxrwxrwx 1 root root   21 Oct 24  2011 mvnDebug -> ../../../bin/mvnDebug
lrwxrwxrwx 1 root root   16 Oct 24  2011 mvn -> ../../../bin/mvn
lrwxrwxrwx 1 root root   15 Oct 24  2011 m2.conf -> ../conf/m2.conf
drwxr-xr-x 5 root root 4096 Nov 23 00:26 ..
drwxr-xr-x 2 root root 4096 Nov 23 00:26 .
root@ip-10-146-81-140:/usr/share/maven2/bin#


설치하면 현재(2012.11)기준 Maven version 2.2.1 이다. 그러나 최신 버전은 3.0.4 이다 


  - 아파치 메이븐 사이트


Ubuntu에 최신버전을 설치하려면 apt-get으론 안되고 별도의 과정을 거친다.

  - wget http://apache.mirror.cdnetworks.com/maven/maven-3/3.0.4/binaries/apache-maven-3.0.4-bin.zip

  - 압축을 풀고 환경변수 : export M2_HOME=<install dir path> 그리고 export M2=$M2_HOME/bin

  - PATH 환경변수 : export PATH=$M2:$PATH

  - 버전확인 : mvn -version 

dev@ip-10-146-81-140:~/deploy$ wget http://apache.mirror.cdnetworks.com/maven/maven-3/3.0.4/binaries/apache-maven-3.0.4-bin.zip

--2012-11-23 00:55:59--  http://apache.mirror.cdnetworks.com/maven/maven-3/3.0.4/binaries/apache-maven-3.0.4-bin.zip

Resolving apache.mirror.cdnetworks.com (apache.mirror.cdnetworks.com)... 61.110.198.174

Connecting to apache.mirror.cdnetworks.com (apache.mirror.cdnetworks.com)|61.110.198.174|:80... connected.

HTTP request sent, awaiting response... 200 OK

Length: 4889768 (4.7M) [application/zip]

Saving to: `apache-maven-3.0.4-bin.zip'


100%[============================================================================>] 4,889,768   1.46M/s   in 3.2s


2012-11-23 00:56:02 (1.46 MB/s) - `apache-maven-3.0.4-bin.zip' saved [4889768/4889768]


dev@ip-10-146-81-140:~/deploy$ ll

total 4784

drwxrwxr-x 2 dev dev    4096 Nov 23 00:55 ./

drwxr-xr-x 7 dev dev    4096 Nov 23 00:53 ../

-rw-rw-r-- 1 dev dev 4889768 Sep  5 07:01 apache-maven-3.0.4-bin.zip

dev@ip-10-146-81-140:~/deploy$ unzip apache-maven-3.0.4-bin.zip

Archive:  apache-maven-3.0.4-bin.zip

   creating: apache-maven-3.0.4/

   creating: apache-maven-3.0.4/boot/

  inflating: apache-maven-3.0.4/boot/plexus-classworlds-2.4.jar

   -- 중략 --

   creating: apache-maven-3.0.4/lib/ext/

  inflating: apache-maven-3.0.4/lib/ext/README.txt

dev@ip-10-146-81-140:~/deploy$vi .bashrc 


<.bashrc 삽입 내역> 

export M2_HOME=/home/dev/deploy/apache-maven-3.0.4

export M2=$M2_HOME/bin

export PATH=$M2:$PATH



dev@ip-10-146-81-140:~$ . .bashrc

dev@ip-10-146-81-140:~$ mvn -version

Apache Maven 3.0.4 (r1232337; 2012-01-17 08:44:56+0000)

Maven home: /home/dev/deploy/apache-maven-3.0.4

Java version: 1.7.0_09, vendor: Oracle Corporation

Java home: /usr/lib/jvm/java-7-oracle/jre

Default locale: en_US, platform encoding: UTF-8

OS name: "linux", version: "3.2.0-31-virtual", arch: "amd64", family: "unix"


posted by 윤영식
2012. 11. 22. 16:19 Middleware, Cloud/OSGi

Virgo v3.5.0 RELEASE 버전의 springframework는 3.0.x 버전 번들이 패키징 되어있다. 3.1.x 버전으로 재패키징을 할 경우 대비하여 Springsource에서 번들링 해놓은 파일을 받아서 virgo_home/repositories/ext/ 밑으로 넣으면 될듯! 아직 미 테스트함 


  - 번들의 개념에 대해서 알자 (하단 요약 참조 사이트)

  - SpringSource에서 운영하는 Bundle Repository

  - Spring 방식으로 Bundle을 만들 수 있는 Spring Dynamic Modules



▶ 번들 개념에 대하여 간단히 이해하고 가자 

  - OSGi Bundle은 모듈화 단위이다. (unit of moduelarization)

  - Bundle 구성 = resources + mainfest file(META-INF/MANIFEST.MF파일에 의존성 jar, 번들 정보) + OSGI-OPT 디렉토리(부가적인 정보)  

  - manifest.mf : 20 가지 헤더 정보를 가짐

    + Export-Package : package + name, 외부노출됨

    + Import-Package : package + name, 사용할 것들

    + Bundle-SymbolicName : unique name

    + Bundle-Name : human-readable name

    + Bundle-Activator : BundleActivator를 상속받아 구현한 것으로 start/stop 관련

    + Bundle-Classpath : embeddied libraries 의 여러 폴더나 파일 classpath 지정

    + Bundle-ManifestVersion : 1 = OSGi release 3, 2 = OSGi release 4

Bundle-Name: spring-core
Bundle-SymbolicName: org.springframework.bundle.spring.core
Bundle-ManifestVersion: 2
Export-Package:org.springframework.core.task;uses:="org.springframework.core,org.springframework.util";version=2.5.1 org.springframework.core.type;uses:=org.springframework.core.annotation;version=2.5.1[...]
Import-Package:org.apache.commons.logging,edu.emory.mathcs.backport.java.util.concurrent;resolution:=optional[...]



▶ bnd 툴 사용하기 

  - http://www.aqute.biz/Bnd/Bnd  사이트에서 다운로드

  - 하기와 같이 수행하면 manifest 정보가 출력됨 

java -jar bnd.jar print c3p0-0.9.1.2.jar

[MANIFEST c3p0-0.9.1.2.jar]
Ant-Version Apache Ant 1.7.0
Created-By 1.5.0_07-87 (&quot;Apple Computer, Inc.&quot;)
Extension-Name com.mchange.v2.c3p0
Implementation-Vendor Machinery For Change, Inc.
Implementation-Vendor-Id com.mchange
Implementation-Version 0.9.1.2
Manifest-Version 1.0
Specification-Vendor Machinery For Change, Inc.
Specification-Version 1.0


  - 또는 OSGify 로 manifest를 수정하여 준다 (detail)

java -jar bnd.jar wrap c3p0-0.9.1.2.jar


번들 툴을 사용해 보자 

posted by 윤영식
2012. 11. 21. 09:53 Middleware, Cloud/Linux

AWS의 Ubuntu 시스템에 ftpd를 설치하는 방법. 구글링하면 너무 많은 정보가 있으므로 좋은 사이트 몇개 링크함


1) 설치 기본 : sudo 설치 방법. https://help.ubuntu.com/10.04/serverguide/ftp-server.html

2) 설정 상세 : 설정에 대한 한글 상세 설명. http://community.365managed.com/10759


JBoss를 curl로 받으려고 하는데 마땅한 곳이 없다. 어디 없을까?

posted by 윤영식
2012. 11. 15. 18:10 Middleware, Cloud/Cloud

그동안 브라우져에서 코딩하기 위하여 사용해본 툴들중에 Cloud9IDE가 가장 최적이지 않을까 생각된다. 그 동안 웹에서 코딩할려고 시도해본 IDE를 열거해 본다. 



GitHub 이나 Bitbucket에 올린 소스를 clone하여 개발할 수 있고, Node.js에서 돌릴 수 있는 개발 IDE와 PaaS를 제공하는 Cloud9IDE를 앞으로 사용해 보자.


posted by 윤영식
2012. 11. 15. 16:35 Middleware, Cloud/Cloud

 

AWS의 우분투위에 Vert.x를 사용해 보려고 한다. Vert.x는 기본 JDK 1.7 를 사용한다

 

  - Oracle JDK1.7 설치하기 : root 계정 또는 sudo를 수행하여 설치한다

  

1. apt-get 보완 하기

prompt> sudo add-apt-repository ppa:webupd8team/java 

prompt> sudo apt-get update


2. jdk 1.7 설치

prompt> apt-get install oracle-jdk7-installer 

prompt> java –version 

java version "1.7.0_09" 
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)

'Middleware, Cloud > Cloud' 카테고리의 다른 글

Cloud9IDE 사용하기  (0) 2012.11.15
[CloudFoundry] 개발한 Node.js 프로그램 배포하기  (0) 2012.11.03
posted by 윤영식
2012. 11. 15. 15:05 Middleware, Cloud/OSGi

5주간의 주말 강좌를 통하여 OSGi의 개념을 정리해 보고, 어떤 것이 나의 목적에 가장 잘 부합되는지 고민해 보았다.

  - Felix : OSGi의 커널은 잘 동작하지만 HTTP Server 등의 사용하고자 하는 기능에 대해서는 sub project에서 bundle을 설치해 주어야 했다.

  - Virgo : SpringSource의 dm Server를 Eclipse 재단에 기부하고 OSGi kernel과 HTTP Server(Tomcat or Jetty 선택가능), war 파일 배포, Spring framework 등이 내장된 POJO를 위한  Enterprise Application Server

 

Virgo를 찾았을 때의 흥분이란.. 이제 서버에서 만들 기능들을 서비스 개념의 번들로 나누어서 Virgo OSGi Server의 Bundle로 등록할 수가 있게 된다.

  - 서비스별로 버전관리가 가능하고

  - 모듈 프로그래밍이 되고

  - POJO 기반의 Spring DM을 적용할 수 있고

  - 서비스의 Life Cycle을 관리한다

Ecliipse의 Plugin이 Equinox  OSGi bundle인 것을 생각하다면 이제 패키지 솔루션의 서버 Layer의 서비스 단들을 번들로 관리하면서 외부적으로는 Plugins 형태로 유지보수할 수 있게되는 것이다.

  

<오늘 읽은 기사>

  - Vert.x를 OSGi에 올리기 : Vert.x 번들 만들기와 Spring DM 기증으로 나온 blueprint 적용법까지 자세히 설명하고 있다


'Middleware, Cloud > OSGi' 카테고리의 다른 글

[OSGi] Bundle 정의내리기  (0) 2012.11.22
[SpringDM] Dynamic Module 만들기  (0) 2012.11.10
[Eclipse Virgo] 사용하기  (0) 2012.11.03
[OSGi] 서비스 Layer 만들기  (0) 2012.10.30
[OSGi] BundleContext에 의한 LifeCycle 관리  (0) 2012.10.30
posted by 윤영식
prev 1 2 next