지난번에 Search관련해서 이슈가 있었는데 

오늘 on call로 연락온 내용을 review 하다 보니 같은 이슈가 production 에도 발생했던 걸로 보인다.

예전에 메일을 찾다보니 운호선임이 잘 정리 해 놓은게 보여서 다음번에 필요할 듯 해서 정리 해 놓는다. 

( Thanks Unho ) 

It occurred by limit of max user processes on server configuration.

Check

Check limit of max user processes

[central@01 ~]$ ulimit -u

Check count of processes by elasticsearch

[01 ~]$ ps -eLf | grep elasticsearch | wc -l

728

How to solve 

Update /etc/security/limits.conf
...

<account> soft nproc 30000
<account> hard nproc 30000


'개발자세상 > 자바세상' 카테고리의 다른 글

Scala  (2) 2016.06.16
Mockup 테스트  (0) 2016.02.02
Control character in XML  (0) 2014.05.28
jboss db pooling timeout  (0) 2014.03.01
ResultSet FetchSize  (0) 2014.02.25
Posted by headiron
,

RealTime Search Support 관련해서 자료를 서치하다 보니 Hibernate에서 interceptor라는 기능을 발견했다.

Hibernate에서 데이터 체인지나 Commit을 할떄  Interceptor에서 해당 데이터를 gather할 수 있다.

직접 Parsing하는 코드를 작성하지는 않았지만, Break point로 체크해보면 Hibernate관련 Object가 SELECT  Query로 보이는 걸로 봐서는 Object과 Relation Object모두를 Catch할 수 있는 것으로 보인다.

http://www.mkyong.com/hibernate/hibernate-interceptor-example-audit-log/

일단 변경 데이터를 가져와서 바로 LogStach로 Logging해서 데이터를 저장하면 될 것 으로 보이는데..

우리는 다른 Component 에서 데이터를 Handling하는 경우가 있어서 DB에서 데이터 Change를 Trigger하는 것으로 방향을 정했다.

뭐... 언젠가는 이 기능을 쓸 수 있을 것 같긴한데.... :-)

'개발자세상' 카테고리의 다른 글

Rotating Linux Log file  (0) 2016.03.10
Continuous Integration with Jenkins  (0) 2016.03.04
Curl에서 SOAP API 사용하기  (0) 2014.05.07
[구인공고] 247리얼미디어.  (0) 2011.06.23
자바?  (0) 2011.04.01
Posted by headiron
,

이번에 Production system에서 NullPointerException으로 API call이 failed 되는 이슈가 발생했다.
Review 하던 중에 Maximum Open Cursor도 함께 발생해서, 느낌은 Maximum Open Cursor 때문에 NullPointerException도 발생한 것 같은데 들어주는 사람이 없네.. -.-

어쨋든, 이슈는 이슈고, DBA 얘기로는 Cursor 개수 Count는 Session 단위라고 하니, 해당 이슈가 다시 발생할 개연성은 많이 줄은 듯 하다. ( 특히나 얼마전에 Upgrade 작업으로 DB Session들이 한 번 Restart 됐으니. )

그래도 일단은 Cursor Monitoring은 해야 할 듯 해서 Article을 찾아 보니 아래 Article이 괜찮아 보인다.

http://www.orafaq.com/node/758


현재 OPen Cursor 개수를 확인하는 Query

select a.value, s.username, s.sid, s.serial#
from v$sesstat a, v$statname b, v$session s
where a.statistic# = b.statistic#  and s.sid=a.sid
and b.name = 'opened cursors current';


현재 최대 Open Cursor 개수와 Maximum Cursor Limitation Check

select max(a.value) as highest_open_cur, p.value as max_open_cur
from v$sesstat a, v$statname b, v$parameter p
where a.statistic# = b.statistic# 
and b.name = 'opened cursors current'
and p.name= 'open_cursors'
group by p.value;


Posted by headiron
,

Travis가 API 오류 분석을 요청해서 확인해 본 결과 Temp folder를 작업 이후에 clean up 하지 않아서 32K limit로 인하여 오류가 발생한 case 였다.

다행히 TEST ( ? )  environment여서 다행이었지만, Production에 Temp folder가 몇 개나 있는지는 알수가 없었다.

이걸 shell을 어찌짜야 하나 internet을 뒤졌더니 다행히 아래와 같은 shell command로 가능했다.

shell> for D in *; do echo $D; find $D -type d| wc -l; done


다행히도 Production에 temp folder가 1000개 이상 넘는 case는 없어서 다행이었다.

근데 이상한건.. 어떻게 1000개가 넘는 case가 하나도 없을 수 있지?

U.I에서 clean up 해 준다고 해도, API만 사용하는 case도 많을 텐데..

'개발자세상 > Shell 관련' 카테고리의 다른 글

RPM Spec 실행 순서  (0) 2016.02.05
Java property 파일을 Shell에서 읽는 방법  (0) 2015.09.19
텍스트 프로세싱  (0) 2014.07.12
파일 기반의 do while 작성시 유의사항  (0) 2014.06.19
Shell script debug ( -x )  (1) 2013.08.04
Posted by headiron
,

이번에 Project를 진행하면서 특정 기간동안의 특정 도메인 TRAFFIC 정보를 GATHERING 한 후
TRAFFIC CUT-OVER 이후에 CUT-OVER 이전의 TRAFFIC에서 찾을 수 없는 CASE를 추출하는 SHELL을 작성해야 하는 상황이 발생하였다.

결국 특정 기간의 TRAFFIC 정보를 분석해서 MASTER 파일을 작성한 후 CUT-OVER 이후의 로그 파일과 이를 비교해야 하는 SHELL 이었다.

우선 진행해야 하는 건 로그 파일을 뒤져서 URL이 특정 도메인으로 시작하는 데이터를 가져오는 일이 었다.

일단 로그파일에서 특정 도메인 정보를 가져오는 건 비교적 쉬웠다.

egrep --file=<PATTERN_FILE>-i <LOG 파일들> | cut -d^ -f2,5,6

'^'를 구분자로 가지는 <LOG 파일들>에서 <PATTERN_FILE>에 지정된 문자열을 가지는 데이터를 가져와서 2,5,6 필드들을 가져오는 구문이었다. 이때 egrep의 -i 옵션을 사용하여 case insensitive 하게 처리 하도록 했다.

다른 필드 값들에 있는 케이스를 무시했었는데, 데이터를 보다보니 PATTERN에 있는 도메인 정보가 다른 필드에서도 사용되는 case도 있고, 도메인이 TEST 같은 간단한 경우는 URL 내의 다른 정보에서도 나오는 것이 아닌가.

결국 아래와 같이 egrep을 한 데이터를 다시 egrep 하도록 하였다.

egrep --file=<PATTERN_FILE>-i <LOG 파일들> | cut -d^ -f2,5,6 | egrep --file=<PATTERN_FILE> -i

이렇게 하니 로그 데이터를 모을 수 있었는데, 2번째 필드의 경우는 다시 ','로 세부 필드가 또 구분되게 되어 있다.

결국 tr로 모든 ','를 '^'로 변환하여 2번째 필드 안의 세부 필드들도 다음 프로세스에서 사용할 수 있게 하였다.

결국 아래와 같이 LOG 데이터를 1차 가공 파일로 저장하도록 SHELL을 작성하였다.

egrep --file=<PATTERN_FILE>-i <LOG 파일들> | cut -d^ -f2,5,6 | egrep --file=<PATTERN_FILE> -i | tr -s ',' '^' >> ${LOG_DATE}_site_log.txt

이 site_log파일에 있는 내용을 가지고 실제 TRAFFIC URL을 가져오는 코드를 작성해야 하는데, sort 와 uniq를 사용하니 간단히 해결 됐다.

awk '{FS="^"} {print $2"@"$5}' ${LOG_DATE}_site_log.txt | sort | uniq -c > ${LOG_DATE}_traffic.txt

먼제 awk로 2번째와 5번째 필드 문자열을 @를 연결자로 합치고, ( 즉 <2번째 필드>@<5번째 필드> ) 이 값을 가지고 sort와 uniq를 진행하니 ,

발생횟수 <2번째 필드>@<5번쨰 필드> 형태의 데이터를 가지는 TRAFFIC 정보 파일이 작성 되었다.


흠.. 그런데 생각해보니 EMPTY case 정보도 필요 할 듯 하여 3번째 필드가 0인 case의 EMPTY LOG를 EMTPY TRAFFIC 정보 파일에 저장하는 아래 SHELL도 작성하게 되었다.
awk -F'^' 'BEGIN {OFS="^"} {if ($3 == "0" ) print $2"@"$5}' ${LOG_DATE}_site_log.txt | sort | uniq -c > ${LOG_DATE}_empty_traffic.txt


처음에는 위 파일들을 MASTER 파일로 사용하려 했는데, 좀더 진행해 보니 날짜 별로 조금씩 트랙픽이 틀려져서 위 파일을 마스터 파일을 쓸 수가 없었다. 결국 날짜별 site_log 파일을 가지고 MASTER 파일을 만들어 내어야 하는데 나중에 처리할 떄 대/소문자 이슈를 없애기 위해서 전체 날짜별 TRAFFIC 파일들 CONCATE 시킨 후 모든 데이터를 소문자로 바꾸어 위와 동일한 Process를 통해 master 파일을 작성할 수 있었다.

for f in *_site_log.txt
do
        awk '{FS="^"} {print $2"@"$5}' ${f} | sort | uniq >> ${TMP}
        echo "$f file"
done

cat ${TMP} | tr '[:upper:]' '[:lower:]' | sort | uniq > ${마스터파일}

tr '[:upper:]' '[:lower:]' 이부분이 대문자를 소문자로 변환해 주는 파일이다.


이제 마지막으로 다른 로그 파일을 가져와서 마스터 파일에 있지 않은 TRAFFIC 정보를 추출해야 한다.
즉 마스터 파일과 join을 한 후 join 되지 않는 데이터를 가져와야 하는데 이 걸 라인단위로 읽어서 마스터 파일과 비교하는 SHELL을 짜려니 만만하지가 않다.

구글링을 해 보니 딱 나에게 필요한 기능의 SHELL COMMAND가 있다.

comm -23 <로그파일> <마스터파일> > <최종파일>

comm는 두개의 sort된 파일을 가지고 JOIN을 해서 결과를 추출해 주는데

이때 -1, -2, -3 과 같이 옵션을 주면

-1 은 왼쪽 ( <로그파일>) 결과만 있는 부분을 제거 - Right outer join과 유사 )
-2 는 오른쪽 ( <마스터파일> ) 결과만 있는 부분을 제거 - Left outer join과 유사 )
-3 는 양쪽에 모두 결과가 있는 부분을 제거 하게 되어 있다.
따라서 -23을 하게 되면 마스터파일에 결과만 있는 경우와, 양쪽 모두에 있는 부분을 제거 하게 되니, 마스터 파일에 등록되지 않은 Traffic 정보를 가지는 로그 데이터 만을 출력하게 되는 것이다.


처음에는 이런 걸 어떻게 개발하나 했는데, 기존에 다른 사람이 개발한 거랑, 구글링의 힘들 빌렸더니 결국 거의 원하는 결과를 추출해주는 SHELL을 작성할 수 있었다.

이렇게 개발해 놓고 나니, 지금 내가 개발해 놓은 로그 분석툴의 CONCURRENT CHECK 부분을 DB 에서 할필요가 없지 않았나 하는 생각이 든다.

이젠 너무 DB만 쓰지 말고 이렇게 SHELL 로 할 수 있는 부분은 SHELL로 많이 처리 해야 할 듯 싶다.

Posted by headiron
,

Log 파일들을 분석할 일이 있어서 여러 서버에서 Log 파일을 가져오는 Shell을 작성하고 있었다.

다른 Shell Script를 참조로 아래와 같이 작성하였고
while read host
do
  ....
done < host.txt

while loop이 잘 도는 지 체크해 보려고 echo로 확인해 보면 잘 실행되었다.

그래서 원하는 script를 추가 하였을 경우에는 loop이 실행되지 못하고 한 번 실행 한 후 바로 멈추는 것이었다.

너무 이상한데 마침 SSH 인증 관련 문제가 있어서 그 문제떄문이려니 해보니 그것도 아니다..

그래서 인터넷을 찾아 보니 아래 페이지가 TIP을 주었다.

http://stackoverflow.com/questions/5626374/while-read-line-do-and-grep-problems

마침 내가 작업하려는게 host 파일들에 접속해서 파일을 받아 오는 것이었는데..
파일 받아 올때 파일 에 있는 CRLF 가 while loop을 exist 하는 것이었다.

결국 shell 내에서 array를 선언한 후 아래와 같이 수정하여 실행을 하니 정상적으로 수행되었다.

HOST_LIST=( HOST1 HOST2 .. )

for host in "${HOST_LIST[@]}"

...

done

Shell이 빨라서 좋은 데 이렇게 전혀 생각도 못했던 부분에서 문제가 생기면 시간을 너무 잡아 먹어서 .. 좀..
뭐 어쨋든.. rsync 할 떄 CPU가 올라 가는 부분을 제외하면 거의 대 부분의 이슈는 해결 된 듯..

rsync 이슈도 googling 해보니 -c 옵션을 사용할 경우 파일 Checksum을 실행 하여 파일 COPY를 한 다고 하니,
이 부분을 제거하면 문제가 없을 듯 하다.
어차피 내가 지금 짜고 있는 건 파일 전체를 다운 받아야 하는 Code 이니깐.



'개발자세상 > Shell 관련' 카테고리의 다른 글

첫번째 하위 폴더의 폴더 개수 구하기  (0) 2014.09.11
텍스트 프로세싱  (0) 2014.07.12
Shell script debug ( -x )  (1) 2013.08.04
Shell 에서 FTP uploading check  (0) 2013.03.21
공용키 기반 인증  (0) 2010.01.26
Posted by headiron
,

아침에 출근해 보니 Backend Process가 invalid character 때문에 fail 되는 이슈가 발생되어 API 쪽 수정을 요청받았다.

0x3 character가 Field에 들어가서 문제가 생겼다고 하는데,
일단 우리 API도 XML로 processing 하니깐 아마도 API로는 해당 값이 들어가지 않았을 것 같은데,
문제는 어떻게 그 값을 넣는지 모르겠다는 것이다.

Googling 을 해보니 &#x3; 이렇게 넣으면 0x3 값을 넣을 수 있었다.
http://stackoverflow.com/questions/8485436/unicode-characters-like-u0016-in-xml

그리고 찾아 보니 invalid character를 escape 하는 tip도 찾을 수 있었다.( 뭐 물론 테스트 해보진 않았지만.. )

http://blog.mark-mclaren.info/2007/02/invalid-xml-characters-when-valid-utf8_5873.html

다행히 API는 DTD validation 단계에서 invalid character를 detect 하고 있어서 큰 문제는 없는 것으로 확인됐다.

'개발자세상 > 자바세상' 카테고리의 다른 글

Mockup 테스트  (0) 2016.02.02
java.lang.OutOfMemoryError: unable to create new native thread  (0) 2015.08.15
jboss db pooling timeout  (0) 2014.03.01
ResultSet FetchSize  (0) 2014.02.25
Timeout increase for axis soap client  (0) 2014.02.25
Posted by headiron
,

미국에 와서 QA가 사용하는 API Tool을 보고 놀랐던 적이 있었다.

QA가 Campaign등 Element를 추가 할 떄 사용하는 UI Tool인데 내부 코드를 파고 들어가 보니 curl로 SOAP Request를 작성하는 거였었다.

API 담당자로 몇 년을 있었으면서도 SOAP Message Level Handling을 몰랐다는 게 좀 부끄러웠고 그랬었다.

그 후로 Project로 API TOOL도 만들고, Tech Support가 사용하는 soapUI Tool을 사용하면서 SOAP Message Level Handling을 조금씩 보게 되었지만 아직도 좀 부족하다.

얼마전에 Client support 이슈가 발생해서 API 테스트를 해야 하는데,

VPN 연결은 잘 되는데.. 막상 API TOOL은 VPN과 연계가 되지 않는다..

그래서 어떻게 해야 하나 생각해보니 curl 을 이용하는 방법을 사용하면 되겠다 싶어서 다시 QA TOOL을 찾아 보게 되었다.

curl -X POST -H 'Content-Type: text/xml' -H 'soapAction: aa' -d "@<SOAP MESSAGE FILE>" "<WSDL URL>"   


위와 같이 호출하게 되면 SOAP API를 터미널에서도 호출할 수 있다.
흠.. 이 걸 잘 응용하면, 자동화 TOOL에서도 잘 사용할 듯 싶은데..


'개발자세상' 카테고리의 다른 글

Continuous Integration with Jenkins  (0) 2016.03.04
Hibernate interceptor  (0) 2015.05.20
[구인공고] 247리얼미디어.  (0) 2011.06.23
자바?  (0) 2011.04.01
Long Term Plan?  (0) 2011.02.19
Posted by headiron
,

Apahce 의 timeout 숫자를 increase 했던 client 쪽에서 이번에는 에러가 발생한다고 연락이 왔다.
로그를 Review 해 보니 timeout인것 같은데, 정확히 어디서 나왔는지를 모르겠다는 것이다.

02/28/2014 13:37:37,393 WARN  [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TransactionReaper_18] - TransactionReaper::check timeout for TX a830b16:916:5310bf91:c in state  RUN
02/28/2014 13:37:37,394 WARN  [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.BasicAction_58] - Abort of action id a830b16:916:5310bf91:c invoked while multiple threads active within it.
02/28/2014 13:37:37,394 WARN  [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.CheckedAction_2] - CheckedAction::check - atomic action a830b16:916:5310bf91:c aborting with 1 threads active!
02/28/2014 13:37:37,804 WARN  [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TransactionReaper_7] - TransactionReaper::doCancellations worker Thread[Thread-7,5,jboss] successfully canceled TX a830b16:916:5310bf91:c
02/28/2014 13:37:37,824 WARN  [JDBCExceptionReporter] SQL Error: 0, SQLState: null
02/28/2014 13:37:37,824 ERROR [JDBCExceptionReporter] Transaction TransactionImple < ac, BasicAction: a830b16:916:5310bf91:c status: ActionStatus.ABORTED > cannot proceed STATUS_ROLLEDBACK; - nested throwable: (javax.transaction.RollbackException: Transaction TransactionImple < ac, BasicAction: a830b16:916:5310bf91:c status: ActionStatus.ABORTED > cannot proceed STATUS_ROLLEDBACK)
02/28/2014 13:37:37,824 WARN  [JDBCExceptionReporter] SQL Error: 0, SQLState: null
02/28/2014 13:37:37,824 ERROR [JDBCExceptionReporter] Transaction TransactionImple < ac, BasicAction: a830b16:916:5310bf91:c status: ActionStatus.ABORTED > cannot proceed STATUS_ROLLEDBACK; - nested throwable: (javax.transaction.RollbackException: Transaction TransactionImple < ac, BasicAction: a830b16:916:5310bf91:c status: ActionStatus.ABORTED > cannot proceed STATUS_ROLLEDBACK)
02/28/2014 13:37:38,548 ERROR [STDERR] org.hibernate.exception.GenericJDBCException: could not inspect JDBC autocommit mode
...


결국 googling을 한 결과 jboss db pooling의 경우 arjuna 모듈을 사용하고 있고, 해당 모듈의 timeout 설정은 deploy/transaction-jboss-beans.xml에서 설정하게 되어 있다.

참조 : https://community.jboss.org/message/95336#95336


일단 기본 값은 10분 인데 더 늘려서, 실행이 되는 것 까지는 확인하였는데..
문제는 transaction이 더 길어 지면 결국은 또 timeout은 발생할 수 있다는 거..
결국은 program이나 시스템 structure를 바꿔야 한다는 얘기..

이번 case는 client측의 사용 패턴을 바꿔야 할 듯 한데..
Tech Support에서 어떻게 유도해 나갈지는 모르겠다..


'개발자세상 > 자바세상' 카테고리의 다른 글

java.lang.OutOfMemoryError: unable to create new native thread  (0) 2015.08.15
Control character in XML  (0) 2014.05.28
ResultSet FetchSize  (0) 2014.02.25
Timeout increase for axis soap client  (0) 2014.02.25
자바 DEBUGGING  (0) 2013.11.20
Posted by headiron
,

Client support 이슈로 작성하게 된 Data Dump API.
기능적으로는 문제가 없었는데.. Performance가 생각만큼 나오지 않았다.
DBA 팀에 속도가 너무 느리다고 문의 해 보니, Query 자체는 빠르게 실행된다고..
그러면서 fetch size를 증가시켜 보란다.

Googling 해보니, Oracle JDBC의 default FetchSize가 10이다.
Query 자체는 Optimize 되어서 빠르게 실행되고 있는데, 한 번 가져올 때 10개만 가져오다보니 Data Entry 개수가 많을 경우에 DB에 Revisiting 하는 회수가 증가하면서 Query 실행시간은 빠른데 JDBC side 에서는 느릴 수 밖에 없었던 것이다.

일단은 ResultSet에 fetchSize를 100으로 늘려 주어서 8초 걸리던 Query가 1초 이내에 실행되게 되었는데, fetchSize는 Statement level에서도 설정해 줄 수 있는 config 이다.

흐... 10 년 넘게 Java 개발하면서 이런 부분을 모르고 있었다니..
좀 많이 쪽 팔리는 일이..
뭐 그래도 어쩃든 DBA 도움 덕분에 성능을 크게 향상시키고 새로운 걸 알게 되었으니,
그게 어디여....

'개발자세상 > 자바세상' 카테고리의 다른 글

Control character in XML  (0) 2014.05.28
jboss db pooling timeout  (0) 2014.03.01
Timeout increase for axis soap client  (0) 2014.02.25
자바 DEBUGGING  (0) 2013.11.20
Spring property  (0) 2013.10.15
Posted by headiron
,