회사 사내 서버의 표준  OS인 CentOS에서 jps와 jstat을 사용할 때, java 정보가 잘 보이지 않는 부분이 있었습니다.

java 실행시 관련 정보를 /tmp 밑에 hsperfdata_계정명 이름으로 폴더를 생성하고 pid 정보를 파일로 저장하고 캐쉬하고 있었는데, centos내에서 동작하는 tmp파일 디렉토리를 지우는 tmpwatch가 돌아가면서 java가 저장하는 정보를 사라지게 하는 버그가 있었습니다.

(관련정보 : https://bugzilla.redhat.com/show_bug.cgi?id=527425)

 @개인적인 코멘트 : 리눅스에서 더이상 파일 시스템의 규약이 표준화되고 난 이후, 운영이 안된 문제라 할 수 있겠습니다. jdk는 써야겠고, redhat쪽은 임시파일은 지워야했으니까요.

 

관련해서 표준 설치안에 jps와 jstat가 참조하는 부분이 날아가지 않도록 CentOS의 cron을 수정토록 요구사항으로 적었습니다.

 

하드코딩때문에 생겨난 부분때문에 오라클 자바 버그질라에 올라갔습니다.

http://bugs.sun.com/view_bug.do?bug_id=6447182

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6938627

 

버그DB에 따르면, jdk 6u 21에서 패치가 되어 fix되었습니다.

하지만,  jdk 6u 21의 Release Note에 따르면, fix되었다라고 명시된 흔적은 찾을 수 없었습니다.

http://www.oracle.com/technetwork/java/javase/bugfixes6u21-156339.html

 

쫓아가보니. jdk 6u 23 에서 패치가 된 것을 확인할 수 있었습니다.

http://www.oracle.com/technetwork/java/javase/2col/6u23bugfixes-191074.html

(6938627 여깄구나!!)

 

실제 반영된 것과 버그 database가 다른 것을 확인할 수 있었습니다.

jdk 6 update 23부터 적용이 되었습니다.

 
JDK 7 소스 수정한 것은 여기에 있음~
http://hg.openjdk.java.net/jdk7/hotspot-rt/hotspot/rev/a2ea687fdc7c

-const char* os::get_temp_directory() { return "/tmp/"; }
+const char* os::get_temp_directory() {
+  const char *prop = Arguments::get_property("java.io.tmpdir");
+  return prop == NULL ? "/tmp" : prop;
+}



 

하지만 -Djava.io.tmpdir 디렉토리때문에 이슈가 될 만한 소지가 발견이 됩니다.

바로 Tomcat 때문입니다.

 

tomcat에서 실행할 때, -Djava.io.tmpdir=/usr/local/tomcat6/temp   처럼 java.io.tmpdir를 사용합니다.

tomcat에서 사용되는 pid 정보같은 정보를 넣기 위해서 사용됩니다. java의 jps, jstat에서 사용될 정보들이 한곳에 모아지지 않고, tomcat instance 별로 나눠지는 부분이 발생될 수 있습니다. 여러개의 tomcat instance를 사용하는 경우,  jps 정보를 한번에 읽어올 수 없습니다. (따로 catalina.sh 를 수정하여 tmpdir를 통합해야 하는 상황이 생기는 겁니다.)

 

jdk 6u update 24를 설치하고 tomcat 6를 설치해서 보도록 하겠습니다.

 

$ ps -ef | grep java
www       2691     1 30 20:54 pts/2    00:00:24 /usr/local/j2se/bin/java -Djava.util.logging.config.file=/usr/local/tomcat6/conf/logging.properties -Xms1000m -Xmx1000m -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+DisableExplicitGC -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat6/endorsed -classpath /usr/local/tomcat6/bin/bootstrap.jar -Dcatalina.base=/usr/local/tomcat6 -Dcatalina.home=/usr/local/tomcat6 -Djava.io.tmpdir=/usr/local/tomcat6/temp org.apache.catalina.startup.Bootstrap start

 

$ pwd
/usr/local/tomcat6/temp/hsperfdata_www

 

$ ls -al
ÇÕ°è 40
drwxr-xr-x 2 www www  4096  2¿ù 23 20:54 .
drwxr-xr-x 4 www www  4096  2¿ù 23 20:55 ..
-rw------- 1 www www 32768  2¿ù 23 20:54 2691

 

파일이 생성된 것을 확인할 수 있습니다.

 

jps 를 그냥 실행시키면, tomcat 데몬을 확인할 수 없습니다.

 

$ /usr/local/j2se/bin/jps
2839 Jps

 

jps와 jstat에도 argument를 넘겨줘서 확인해줘야 하는 부분이 생긴거죠. (-J가 붙습니다. 설명은 "-J<flag>      Pass <flag> directly to the runtime system.") 

$ /usr/local/j2se/bin/jps -J-Djava.io.tmpdir=/usr/local/tomcat6/temp
2865 Jps
2691 Bootstrap

 

톰캣쪽에 문의를 하려고 했더니. 이미 누군가가 작년 12월에 버그질라에 올렸습니다.

https://issues.apache.org/bugzilla/show_bug.cgi?id=50518  (http://wiki.apache.org/tomcat/FAQ/KnownIssues#OracleJREIssues)

Tomcat 개발 리더인 Mark Tomas는 JVM 이슈이지, 톰캣 이슈는 아녀~

 

결국 Oracle 버그질라에 올라갔습니다.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7009828

 

결국 update 25버젼부터 "java.io.hperfdir" 라는 property가 추가되어 모니터링과 tmp dir를 구분하겠다는 내용으로 가닥이 잡혔습니다.

open jdk7에도 영향을 미쳤으니.. 25버젼에 확인하고 써야 할 것 같습니다.

 

그 때까지는 ps 명령어를 이용하는 것이 가장 효과적으로 쓰일 수 있는 방법이라 생각됩니다.

Posted by '김용환'

댓글을 달아 주세요