$ sudo passwd root
[sudo] password for kimyonghwan:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

$  su
Password:
Posted by '김용환'
,

윈도우 이클립스에서 안드로이드 어플을 개발할 때 API 보는 것 대신 소스를 보려면, 두가지 중 하나를 하면 된다.
1. 소스를 다운받기
   tortoiseGit 프로그램을 이용해서 아래 주소에 git 파일을 가지고 clone한다. 
    https://android.googlesource.com/platform/frameworks/base.git  
2. 자바 소스 zip 파일 다운 받기
 https://github.com/android/platform_frameworks_base/tags 디렉토리에 접근해서 버전에 맞게 소스를 다운받으면 된다. 


예전에는 소스를 다운받는 구조로 했었는데.. 별로 안좋은 것 같다. 


웹 브라우져에서 https://github.com/android/platform_frameworks_base/tags  에 접속한다.




나는 안드로이드 2.3.3 어플을 개발중이므로, android_2.3.3_r1을 다운받는다.



안드로이드 소스 연동 이클립스에서 SurfaceView 클래스의 소스를 보려고 했을 때, 아래와 같은 화면이 나타난다.

 




여기서 Attach Source의  External File을 선택후, 다운받은 zip 파일을 연결한다. (사진에 그림을 잘 못 그렸음..)
 



아래와 같이 안드로드이 자바 소스를 확인할 수 있다. 





Posted by '김용환'
,

Applications->Accessories->Disk Usage Analyzer 를 통해서 디스크 용량 확인
Scan Home 버튼을 눌러스 디렉토리 용량 확인
Posted by '김용환'
,
Posted by '김용환'
,

 

Apache Http 서버의 전체 connection pool 개수가 Tomcat Instance connector thread 의 개수를 초과해서는 안된다. 초과시, 일부 요청은 새로 ajp connection을 연결을 시도하기 위해서 hang 상태에 걸릴 수 있다.

전체 Tomcat Instance의 connection thread 개수는 다음과 같아야 한다.

• Apache Http 서버가 prefork 방식일 때의 connection pool은 MaxClients을 의미한다.

• Apache Http 서버가 worker 방식일 때의 connection pool은 (MaxClients / ThreadsPerChild) * connection _pool_size 을 의미한다.

Tomcat Instance 의 Connecotr가 AJP 이기 때문에 connection의 개수는 thread의 개수로 이어지기 때문에 maxThreads 값과 연관되어 진다. 성능 테스트를 통해서 적절한 TPS 값을 찾고 이에 맞게 maxThreads 숫자를 찾아야 한다. 또한 load balance 되는 worker들의 maxThreads 값의 합을 통해서 Apache Http 서버의 MaxClients 값을 산출해야 한다.

prefork방식일 때는 아래와 같이 대략 맞추는 것이 좋다.

Tomcat maxThreads 값 * load balanced 개수 (연동되는 Tomcat instance 개수) = Apache Http MaxClients * 1.1 (또는 1.2)

1.1 또는 1.2 의 수를 넣어주는 것은 mod_jk의 load balance에 대한 조정(variation) 값이다.

Posted by '김용환'
,

 

<timeout 설정>

하나의 tomcat worker에 전달되어 서비스가 되도록 한다.

 

worker.list=tomcat

worker.tomcat.type=ajp13

worker.tomcat.port={portnumber}

#worker.tomcat.connect_timeout=1000

#worker.tomcat.prepost _timeout=1000

#worker.tomcat.socket_timeout=3

#worker.tomcat.reply_timeout=1000

 

Tomcat Instance의 GC time, 통신 속도, 트래픽을 고려해서 개발자가 mod_jk의 timeout설정을 해야 한다.

아래 Timeout 설정에 하나라도 만족이 되면, mod_jk는 해당 Tomcat Instance에 대해서 에러로 처리되고, 특정기간(recover_time : 60초)동안 소켓을 전달하지 않는다.

실제 정확한 Timeout은 연속 시도 값(reties 속성값) 과 연속 시도 대기 값(retry_interval 속성값)에 따라서 영향을 받는다.

현재 reties default 값은 2, retry_interval 값은 100ms이므로, 실제 Timeout 값은 아래와 같다.

실제 Timeout은 (2 * xxx_timeout ) + 100ms이다.

위 설정의 의미를 설명한다.

* worker.list=tomcat : worker는 tomcat worker 하나만 지정한다.

* worker.tomcat.type=ajp13 : 로 Apache Http 서버와 Tomcat 서버가 통신하는 protocol은 ajp 13이다.

* worker.tomcat.connect_timeout=1000 : jk와 Tomcat Instance 간 연결이 완료된 후, arj13 protocol에서의 cping request에 대한 cpong respone timeout 을 1000ms로 지정한다.

* worker.tomcat.prepost _timeout=1000 : jk와 Tomcat Instance 간의 요청이 전달이 되기전 arj13 protocol에서의 cping request에 대한 cpong respone timeout 을 1000ms로 지정한다.

* worker.tomcat.socket_timeout=3 : jk와 Tomcat Instance간의 응답 대기 시간이 3초 되면, timeout이 된다. 이 응답대기 시간은 TCP socket 내부적인 상태에 대한 timeout을 의미한다.

* worker.tomcat.reply_timeout= 1000 : jk와 Tomcat Instance 간의 의미있는 요청과 응답간의 시간에 대해서 1000ms timeout으로 지정된다.

내부 IDC에서는 방화벽을 쓰지 않기 때문에, socket_keepalive(디폴트 false)설정은 따로 지정하지 않는다.

connection_pool_timeout을 지정할 경우, Tomcat Instance에서의 connectionTimeout 설정과 같이 설정해야 한다.

 

<status 보기>

Apache Http 서버에서 status 정보를 볼 수 있듯이, mod_jk에서도 status 정보를 보여줄 수 있다. 이 설정은 서비스에는 영향을 주지 않는다.

workers.properties 파일 안에 Status worker를 추가한다.

worker.list=jkstatus

worker.jkstatus.type=status

conf 설정 파일에 jk mount 디렉토리를 지정하고, 외부로 노출되지 않도록 IP관리가 되어야 한다.

JkMount /jkmanager/* jkstatus

<Location /jkmanager/>

JkMount jkstatus

Order deny,allow

Deny from all

Allow from 127.0.0.1

Allow from <내부 IP>

</Location>

http://127.0.0.1/jkmanager/ 로 접속하면 관련정보를 확인할 수 있다.

 

<fail on status>

 

worker.{application1}.fail_on_status=400

Tomcat Instance에서 보낸 Http response status code에 대해서 fail로 간주할 수 있도록 한다. Tomcat Instance에서 400 error발생시 fail이 동작될 수 있다.

 

<redirect>

 

worker.{application1}.redirect ={component6}

worker.{application6}.port=8050

worker.{application6}.host=2.2.2.2

worker.{application6}.type=ajp13

worker.{application6}.activation=disable

특정 상황에서 application1 worker가 application6 worker로 redirect가 가능하다.
activation 설정은 1.2.19부터 가능하다.

worker.properties 파일에 connection_pool_timeout 설정을 추가하여, fail 이후의 상황에 대해서 필요 없는 connection을 오랫동안 쓰지 않도록 할 수 있다. Apache Tomcat 서버의 server.xml의 connectionTimeout값과 동일하게 잡아야 한다.

worker.tomcat1.port=8050

worker.tomcat1.connection_pool_timeout=5

Posted by '김용환'
,

mod_jk 샘플/설명

Web service 2012. 1. 17. 18:33


<간단 설명> 

Apache Http의 설정 파일이다.

LoadModule jk_module modules/mod_jk.so

<IfModule mod_jk.c>

JkWorkersFile "/home/www/httpd/conf/workers.properties"

JkLogFile "| /home/www/httpd/bin/rotatelogs –l /home/www/httpd/logs/mod_jk.log. %y%m%d 86400 "

JkLogLevel error

JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

#JkRequestLogFormat "%w %V %T"

</IfModule>

mod_jk 로그도 full 되어서 write를 못하면 apache httpd 서버가 동작이 안될 수 있으니 rotatelogs를 쓰는 것이 좋다.

 

필요시에는 JkLogLevel 을 error에서 debug 혹은 info 레벨로 낮추어서 테스트할 수 있다. 디폴트 값은 error이다.

하루 단위로 mod_jk 로그가 생성되도록 하였다. 옵션에 대한 상세한 mod_jk.log 설정은 다음과 같다.

JkLogFile에 적힌 옵션들과 숫자들의 의미이다.

• %y : 연도 (year)

• %m : 월 (month)

• %d : 일 (day)

• 86400 : 하루를 초로 나타난 시간 (60 * 24 * 24)

JkLogLevel 의 경우는 default로 error로 초기화 되나, 필요에 따라서 info나 debug로 설정한다.

JkLogStampFormat 설명은 다음과 같다.

• %a : 요일

• %b : 월 (month)

• %d : 일 (day)

• %H:%M:%S %Y] : 시간정보 와 연도 (year)

JkRequestLogFormat 설명은 다음과 같다.

• %w : Tomcat worker의 이름

• %V : 요청한 Domain 이름

• %T : 처리 시간 (소수점 초 단위)

JkRequestLogFormat을 정의하면, Apache Http 서버에서 Apache Tomcat 서버로 Http요청으로 넘어갈 때, 로그가 저장이 된다.

[Fri Dec 03 14:47:19 2010] solution_search search.nhncorp.com 0.017900
[Fri Dec 03 14:47:20 2010] solution_search search.nhncorp.com 0.020706

따라서, Error 가 발생할 때만, 로그가 저장되길 원한다면, JkRequestLogFormat을 사용하지 말아야 한다. 그 이유는 내부적으로 log level을 JK_LOG_REQUEST_LEVEL로 지정하고 있는데, JkLogLevel과는 상관없이 출력하도록 코딩이 되어 있다.

WAS에서 Flush 되지 않거나 하는 문제가 발생시 다음의 옵션을 사용하여 Flush 되게 할 수 있다.

JkOptions +FlushPackets +FlushHeader

예를 들어, chunked encoding 으로 gzip을 전송시 바로 flush가 안될 수 있는데, 위의 옵션을 추가하면 바로 flush 되는 것을 확인할 수 있다. (Http server 2.2.8부터 가능)

만약 동작이 되지 않는다면, JkLogLevel 을 trace로 내리면 구체적인 로그를 확인할 수 있다. 로그 레벨의 디폴트 값은 info이며, 레빌의 수준은 trace, debug, info, warn, error 단계로 나눌 수 있다.


<상세 로그 보기>



Apache Http서버는 mod_jk 관련 로그를 상세하게 출력이 가능하다. Failover시에 대한 정보를 아래와 같은 포맷으로 출력할 수 있다.

LogFormat "%h %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{pid}P %{JK_WORKER_NAME}n %{JK_LB_FIRST_NAME}n %{JK_LB_FIRST_STATE}n %{JK_LB_LAST_NAME}n %{JK_LB_LAST_STATE}n %{JK_REQUEST_DURATION}n" mod_jk_log


CustomLog "| /home/www/httpd/bin/rotatelogs -l /home/www/httpd/modjklog.%Y%m%d 86400" mod_jk_log env=!nolog-request
추가된 설정의 의미를 설명한다.
 %{pid}P : prefork 기준 Apache Http process 아이디
 %{JK_WORKER_NAME}n : load balancer worker 이름
 %{JK_LB_FIRST_NAME}n : 처음 시도한 load balancer worker의 이름
 %{JK_LB_FIRST_STATE}n : 처음 시도한 load balancer worker 의 상태
 %{JK_LB_LAST_NAME}n : 마지막으로 Http 요청을 처리한 load balancer worker의 이름
 %{JK_LB_LAST_STATE}n : 마지막으로 Http 요청을 처리한 load balancer worker의 상태
 %{JK_REQUEST_DURATION}n : 처리시간


Posted by '김용환'
,

 

VirtualHost 설정은 순서가 민감하다. 먼저 선언된 것일수록 우선순위가 높다.

아래와 같이 www1.google.com과 www2.google.com이 있다고 가정한다.

<VirtualHost *>

ServerName www1.google.com

DocumentRoot /home/www/deploy/google-www1

</VirtualHost>

<VirtualHost *>

ServerName www2.google.com

DocumentRoot /home/www/deploy/google-www2

</VirtualHost>

웹브라우저에서 www1.google.com 요청이 들어오면, 첫번째 VirtualHost에서 처리하게 된다.

www2.google.com 요청이 들어면, 두번째 VirtualHost에서 처리하게 된다.

www3.google.com 을 요청하면, 어떤 ServerName 지시자에도 해당되지 않은 요청이기 때문에 첫번째 VirtualHost에서 처리하게 되어 www1.google.com에서 처리가 된다.

 

특이하게 쓰는 경우에는 어떻게 될까?

아래 예제와 같이 첫번째 VirtualHost와  두번째 VirtualHost의 ServerName으로 선언된 www2.google.com을 ServerAlias로 지정한다.

<VirtualHost *>

ServerName www1.google.com

ServerAlias www2.google.com

DocumentRoot /home/www/deploy/google-www1

</VirtualHost>

<VirtualHost *>

ServerName www2.google.com

DocumentRoot /home/www/deploy/google-www2

</VirtualHost>

www2.google.com을 요청하면, 우선순위가 높은 첫번째 VirtualHost에서 처리하게 되어 www1.google.com에서 처리가 된다.

Posted by '김용환'
,

 

ListenBackLog 지시자는 성능을 조금 더 높이기 위한 설정으로서, Http 서버가 요청을 받기 위한 Listen 의 큐의 길이를 길게 해준다. 511이 디폴트로 되어 있는데, 웹 서비스의 성격에 따라서 효과를 발휘할 수도 있고, 없을 수도 있다. 또한 TCP Syn Flooding 공격에 유리하다고 알려져 있다.

기본적인 파일을 전달하는 Http 서버를 테스트해본 결과 8192 의 값이 좋게 나왔다. (항상 좋은 결과치를 나오지 않으니 성능 테스트를 통해서 결과치를 확인해야 한다.)

ListenBackLog 8192

이 값과 함께 수정해야 하는 값은 리눅스 커널 파라미터이다.

먼저 다음의 명령어를 사용하여 먼저 파라미터를 수정한다.

#] echo 8192 > /proc/sys/net/core/somaxconn

그리고, 영구적으로 사용하기 위해서 /etc/sysctl.conf 파일을 열어, 아래 필드를 추가 또는 수정한다.

net.core.somaxconn = 8192

다음의 명령어를 실행하여 리눅스 OS에 반영한다.

#] sysctl –p

Posted by '김용환'
,

 

access.log(error.log) 파일을 통해서 간단한 Http 요청이 들어왔는지 확인할 수 있다. 보다 깊숙하게 어떤 정보가 들어왔는지 확인하기 위해서는 mod_dumpio 모듈을 이용해서 확인할 수 있다.

Modules 디렉토리안에 mod_dumpio.so 파일이 존재하지 않으면, 소스디렉토리의 modules/debug/mod_dumpio.c 파일을 설치하면 된다.

${APACHE_HOME}/bin/apxs –aic mod_dumpio.c

Modules디렉토리의 mod_dumpio.so 파일이 생성되고, conf/httpd.conf 파일에 다음 설정이 추가된다.

LoadModule dumpio_module modules/mod_dumpio.so

Conf/httpd.conf 파일에 다음 설정을 추가하고 서버를 재시작한다.

LogLevel debug

DumpIOInput On

Java 의 HttpURLConnection을 이용해서 http://dev-service.google.com/index?type=service&keyword=aaa 을 요청하도록 하였다. Access.log 파일에는 기존과 동일하게 요청결과를 확인할 수 있다.

10.64.83.203 - - [13/Apr/2011:19:57:53 +0900] "POST /index HTTP/1.1" 200 64061

Error.log 파일에는 Http 요청에 대한 정보가 상세하게 기록이 된다.

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(113): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_in (data-HEAP): 26 bytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(74): mod_dumpio: dumpio_in (data-HEAP): POST /index HTTP/1.1\r\n

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(113): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_in (data-HEAP): 39 bytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(74): mod_dumpio: dumpio_in (data-HEAP): Content-type: text/xml; charset=UTF-8\r\n

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(113): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_in (data-HEAP): 25 bytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(74): mod_dumpio: dumpio_in (data-HEAP): Cache-Control: no-cache\r\n

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(113): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_in (data-HEAP): 18 bytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(74): mod_dumpio: dumpio_in (data-HEAP): Pragma: no-cache\r\n

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(113): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_in (data-HEAP): 27 bytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(74): mod_dumpio: dumpio_in (data-HEAP): User-Agent: Java/1.6.0_24\r\n

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(113): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_in (data-HEAP): 30 bytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(74): mod_dumpio: dumpio_in (data-HEAP): Host: dev-service.google.com\r\n

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(113): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_in (data-HEAP): 62 bytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(74): mod_dumpio: dumpio_in (data-HEAP): Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(113): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_in (data-HEAP): 24 bytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(74): mod_dumpio: dumpio_in (data-HEAP): Connection: keep-alive\r\n

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(113): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_in (data-HEAP): 20 bytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(74): mod_dumpio: dumpio_in (data-HEAP): Content-Length: 18\r\n

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(113): mod_dumpio: dumpio_in [getline-blocking] 0 readbytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_in (data-HEAP): 2 bytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(74): mod_dumpio: dumpio_in (data-HEAP): \r\n

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(113): mod_dumpio: dumpio_in [readbytes-blocking] 18 readbytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_in (data-HEAP): 24 bytes

[Wed Apr 13 19:57:53 2011] [debug] mod_dumpio.c(74): mod_dumpio: dumpio_in (data-HEAP): type=service&keyword=aaa

DumpIOOutput 지시자를 추가하면, response 정보도 확인할 수 있다.

LoadModule dumpio_module modules/mod_dumpio.so

LogLevel debug

DumpIOInput On

DumpIOOutput On

Error.log 파일에 기존 http request 정보와 함께 다음과 같이 response 출력도 확인할 수 있다.

[Wed Apr 13 20:23:38 2011] [debug] mod_dumpio.c(142): mod_dumpio: dumpio_out

[Wed Apr 13 20:23:38 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_out (data-HEAP): 330 bytes

[Wed Apr 13 20:23:38 2011] [debug] mod_dumpio.c(74): mod_dumpio: dumpio_out (data-HEAP): HTTP/1.1 200 OK\r\nDate: Wed, 13 Apr 2011 11:23:38 GMT\r\nServer: Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.7a mod_jk/1.2.31\r\nLast-Modified: Wed, 13 Apr 2011 11:23:31 GMT\r\nAccept-Ranges: bytes\r\nContent-Length: 6\r\nCache-Control: max-age=7192\r\nExpires: Wed, 13 Apr 2011 13:23:31 GMT\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n

[Wed Apr 13 20:23:38 2011] [debug] mod_dumpio.c(142): mod_dumpio: dumpio_out

[Wed Apr 13 20:23:38 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_out (data-FILE): 6 bytes

[Wed Apr 13 20:23:38 2011] [debug] mod_dumpio.c(74): mod_dumpio: dumpio_out (data-MMAP): hello\n

[Wed Apr 13 20:23:38 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_out (metadata-EOS): 0 bytes

[Wed Apr 13 20:23:38 2011] [debug] mod_dumpio.c(142): mod_dumpio: dumpio_out

[Wed Apr 13 20:23:38 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_out (metadata-FLUSH): 0 bytes

[Wed Apr 13 20:23:38 2011] [debug] mod_dumpio.c(142): mod_dumpio: dumpio_out

[Wed Apr 13 20:23:38 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_out (metadata-FLUSH): 0 bytes

[Wed Apr 13 20:23:38 2011] [debug] mod_dumpio.c(55): mod_dumpio: dumpio_out (metadata-EOC): 0 bytes

Posted by '김용환'
,