Nov 3, 2020 - 2가지의 dump 작업

jmap 으로 Heap dump 처리

jmap -dump:format=b,file=./dump_file 10372
{파일명} {pid} 으로 jmap 생성.

[WAS-05:root]/root>#ps -ef|grep java
root     10372     1 99 Nov02 ?        6-10:01:40 /usr/local/java/bin/java -Djava.util.rg.apache.juli.ClassLoaderLogManager -verbosegc -server -Xms10g -Xmx10g -XX:+UseG1GC -D-Duser.timezone=GMT+09:00 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tg.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=00al/tomcat9/lib/scouter.agent.jar -Dcom.sun.management.jmxremote -Dcom.sun.management.jm=false -Dcom.sun.management.jmxremote.authenticate=false -Dignore.endorsed.dirs= -classase=/usr/local/tomcat9 -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/to
root     27084 26857  0 10:52 pts/1    00:00:00 grep java

[WAS-05:root]/usr/local/tomcat9/logs>#cd /home/users/bymin/
[WAS-05:root]/home/users/bymin>#jmap -dump:format=b,file=./dump_file 10372
Heap dump file created

Thread dump 처리

[WAS-05:root]/home/users/bymin>#jcmd 10372 Thread.print > ./thread_file

jcmd {pid} Thread.print > {파일명}

Thread 분석 무료 사이트 를 이용하여 분석을 완료 합니다.

Oct 27, 2020 - E11000 duplicate key

2020-10-26T22:15:29.033+0900 I SHARDING [chunkInserter] Batch insertion failed  :: caused by :: DuplicateKey: E11000 duplicate key error collection: user_mapping.auth_id_info index: _id_ dup key: { : ObjectId('5d5e75b2b26437e191d4040b') }
2020-10-26T22:15:55.692+0900 I SHARDING [chunkInserter] Batch insertion failed  :: caused by :: DuplicateKey: E11000 duplicate key error collection: user_mapping.auth_id_info index: _id_ dup key: { : ObjectId('5d5e75b2b26437e191d4040b') }
2020-10-26T22:16:22.884+0900 I SHARDING [chunkInserter] Batch insertion failed  :: caused by :: DuplicateKey: E11000 duplicate key error collection: user_mapping.auth_id_info index: _id_ dup key: { : ObjectId('5d5e75b2b26437e191d4040b') }
2020-10-26T22:16:50.175+0900 I SHARDING [chunkInserter] Batch insertion failed  :: caused by :: DuplicateKey: E11000 duplicate key error collection: user_mapping.auth_id_info index: _id_ dup key: { : ObjectId('5d5e75b2b26437e191d4040b') }
2020-10-26T22:17:17.405+0900 I SHARDING [chunkInserter] Batch insertion failed  :: caused by :: DuplicateKey: E11000 duplicate key error collection: user_mapping.auth_id_info index: _id_ dup key: { : ObjectId('5d5e75b2b26437e191d4040b') }
2020-10-26T22:17:44.653+0900 I SHARDING [chunkInserter] Batch insertion failed  :: caused by :: DuplicateKey: E11000 duplicate key error collection: user_mapping.auth_id_info index: _id_ dup key: { : ObjectId('5d5e75b2b26437e191d4040b') }
2020-10-26T22:18:10.891+0900 I SHARDING [chunkInserter] Batch insertion failed  :: caused by :: DuplicateKey: E11000 duplicate key error collection: user_mapping.auth_id_info index: _id_ dup key: { : ObjectId('5d5e75b2b26437e191d4040b') }
2020-10-26T22:18:37.264+0900 I SHARDING [chunkInserter] Batch insertion failed  :: caused by :: DuplicateKey: E11000 duplicate key error collection: user_mapping.auth_id_info index: _id_ dup key: { : ObjectId('5d5e75b2b26437e191d4040b') }
2020-10-26T22:19:04.515+0900 I SHARDING [chunkInserter] Batch insertion failed  :: caused by :: DuplicateKey: E11000 duplicate key error collection: user_mapping.auth_id_info index: _id_ dup key: { : ObjectId('5d5e75b2b26437e191d4040b') }
2020-10-26T22:19:31.047+0900 I SHARDING [chunkInserter] Batch insertion failed  :: caused by :: DuplicateKey: E11000 duplicate key error collection: user_mapping.auth_id_info index: _id_ dup key: { : ObjectId('5d5e75b2b26437e191d4040b') }

db.getCollection(‘auth_id_info’).find({_id:ObjectId(“5d5e75b2b26437e191d4040b”)}) 로 검색시, 두개의 값이 나오는 것을 확인할 수 있었으며,

해당 키를 삭제하면 해결됩니다.

다만, 키가 동일하므로 두개의 값이 다 삭제될 수 있으므로, 해당 데이터를 백업해야할 수 있습니다!

Oct 23, 2020 - setEnv

layout: post
title: "crontab -e 로 java를 실행하기"
date: 2010-12-28 09:15:00 +0900
comments: true

2010년 crontab 으로 java를 실행시키기라는 글을 올린 적이 있습니다.
10년이 지났지만, 참 유용하게 사용합니다.

사람의 기억력은 미화하거나, 잊혀지지만,
잘 정리된 글은 필요할 때, 다시 봐도 항상 그 자리에서 저를 도와줍니다.

스프링부트의 임베디드 톰캣이 활성화(?)되기 전에,
모든 자바 어플리케이션은 tomcat을 별도 구성하고,
별도의 tomcat 폴더의 bin 에 있는 catalina.sh 을 실행하여야했습니다.

순수 설정을 정의하고자할 때, CATALINA_OPTS 같은 변수를 export 해야만 했습니다.
예를 들어, jconsole 등을 사용하기 위해 xmxremote 등을 설정해야했고,
scouter 를 하기 위해서는 javaagent 등의 독자적인 설정을 각 sh 파일에 export 해야했습니다.

요근래 스프링부트로 단독으로 올리게 되어,
아예 start 와 stop shell 을 구성하게 되었습니다.

#!/bin/sh or #!/bin/bash

SCOUTER_BASE=/home/xxx/scouter
export XXX_OPTS="-Duser.timezone=Asia/Seoul -javaagent:$SCOUTER_BASE/scouter.agent.jar -verbosegc -server -Xms1g -Xmx1g -Duser.timezone=GMT+09:00 -Dscouter.config=./scouter.conf"

scouter 로 트래픽 및 성능 및 모니터링을 해야하므로,
기본 설정값으로 setEnv.sh 을 구성하였고,
각각의 start, stop 의 쉘을 구성하였습니다.

#!/bin/sh

PID="$(ps -ef|grep java | grep -i xxx | grep -i 8082  | grep -v grep | awk '{print $2}')"
if [[ "" !=  "$PID" ]]; then
  echo "killing $PID"
  kill -s TERM $PID
fi

특정 ‘xxx’ 의 해당 port가 떠있으면 kill 한 후,

#!/bin/bash
usage=`ps -ef | grep java | grep toDsp | grep '8082' | wc -l`
echo $usage

DEFAULT_BASE=/home/xxx/data
. $DEFAULT_BASE/setEnv.sh

if [ $usage -lt 1 ];  then
        echo "ssp to Dsp  재 실행!";
        nohup java -jar -server -XX:+PrintGCDetails $XXX_OPTS -Xloggc:/home/xxx/log/gc/xxxx/gc8082.log -Dspring.profiles.active=prod -Dserver.port=8082 ../xxx-0.0.1-SNAPSHOT.jar 1>/dev/null 2>&1 &

else
        echo "ssp to Dsp 실행 중!";
fi

해당 서비스의 실행하도록 구축하였습니다.
gc 를 모니터링하기 위해 PrintGCDetails, loggc 를 정의하였는데,
조금더 깔끔한 부분이 있는 지 고민해봐야할 거 같습니다.