본문 바로가기

Programming/JAVA/JSP

[JAVA] 파일처리 데몬 쓰레드 락 걸리는 현상..

출처 : http://www.javaservice.net/~java/bbs/read.cgi?m=resource&b=qna2&c=r_p&n=1196419059&p=65&s=d

아래와 비슷한 경우의 문제를 겪고 있어서 소스를 확인해보고 있는데 아무리 봐도 잘 모르겠다.
쓰레드로 되어 있어서 확인하기도 어렵고, 수정도 힘들다.

구조를 확실하게 잡아놓고 개발을 해야하는데 어영부영 대충 생각나는대로 개발하면 락이나 행 업같은 곤란한 상황이 발생한다.

만들었으면 끝까지 책임을 지던가 대충 만들어놓고 내빼기나 하는 개발자 정말 싫다.

제목 : 파일처리 데몬 쓰레드 락 걸리는 현상..
글쓴이: 손님(guest) 2007/11/28 21:36:33 조회수:845 줄수:78
사내에서 운영중인 서버에 문제가 생겼습니다.


이 서버의 역할에 대해서 간략하게 설명하자면

외부에 있는 특정장비에서 이 서버의 특정 폴더로 log를 
10초에 한번씩 FTP로 쏴줍니다.
용량은 10k정도 됩니다.


이 서버는 크게 3개의 쓰레드가 돌면서 처리합니다.


1. DB에서 특정 쿼리 실행
2. 위에서 생성된 log를 3초에 한번씩 FileReader로 읽어서 처리
3. Socket서버를 열고 클라이언트 요청때마다 1,2번에서 처리한 내용을
   클라이언트에게 전송



가끔 1시간에 한번쯤 cpu가 100%가 차는 현상이 발생해서
jconsole과 thread dump를 떠봤더니 File 읽을 때 lock이 걸려서
그런 것 같습니다.


추측하건데
외부장비에서 떨어뜨려주는 log와 데몬에서 읽어들이려는 log파일이 물리적인
위치가 같아서 외부장비에서 log를 저장하는 순간에 데몬에서 읽으려고 해서
lock이 걸리는게 아닐까 생각합니다.


아래 로그를 보시고 해결방법이나 조언 좀 해주세요.
아니면 이러한 로직의 경우 어떻게 처리를 하는게 좋을지..

읽어주셔서 감사합니다.

Name: Thread-3
State: RUNNABLE
Total blocked: 1,843  Total waited: 361

Stack trace: 
java.io.FileInputStream.readBytes(Native Method)
java.io.FileInputStream.read(FileInputStream.java:199)
sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
   - locked java.io.FileReader@1c6d0a5
java.io.InputStreamReader.read(InputStreamReader.java:167)
java.io.BufferedReader.fill(BufferedReader.java:136)
java.io.BufferedReader.readLine(BufferedReader.java:299)
   - locked java.io.FileReader@1c6d0a5
java.io.LineNumberReader.readLine(LineNumberReader.java:182)
   - locked java.io.FileReader@1c6d0a5
IPCC_Server.bean.CMSBean.parseFileString(CMSBean.java:117)
   - locked IPCC_Server.bean.VdnBean@c0feac
IPCC_Server.dao.CMSFile.fillData(CMSFile.java:55)
IPCC_Server.dao.CMSFile.run(CMSFile.java:25)




"Thread-4" prio=6 tid=0x02b7e800 nid=0x1384 runnable [0x03b5f000..0x03b5fd18]
   java.lang.Thread.State: RUNNABLE
	at java.io.FileInputStream.readBytes(Native Method)
	at java.io.FileInputStream.read(FileInputStream.java:199)
	at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
	- locked <0x22f06070> (a java.io.FileReader)
	at java.io.InputStreamReader.read(InputStreamReader.java:167)
	at java.io.BufferedReader.fill(BufferedReader.java:136)
	at java.io.BufferedReader.readLine(BufferedReader.java:299)
	- locked <0x22f06070> (a java.io.FileReader)
	at java.io.LineNumberReader.readLine(LineNumberReader.java:182)
	- locked <0x22f06070> (a java.io.FileReader)
	at IPCC_Server.bean.CMSBean.parseFileString(CMSBean.java:102)
	at IPCC_Server.dao.CMSFile.fillData(CMSFile.java:51)
	at IPCC_Server.dao.CMSFile.run(CMSFile.java:25)
제목 : Re: 참고로
글쓴이: 손님(guest) 2007/11/28 21:38:40 조회수:693 줄수:1
윈도우2k 환경입니다.
제목 : Re: 로그파일 전송완료되었음을 서버가 알수 있도록 처리...
글쓴이: 인생NullP.E(lleft) 2007/11/29 10:25:22 조회수:760 줄수:17
안녕하세요.

질문이 간략하여 정확하게는 파악할 수 없지만,
통상적으로 별도 프로세스에 의해 디렉토리에 파일쓰고, 파일읽을때는
읽어야 하는 하는 파일이 다 쓰여졌는지를 파악할 수 있도록 해야 합니다.

FTP로 올라오는(파일이 생성중인 상태) 상태에서 서버에서 파일을 읽으면 안되니까요.

질문한 내용으로는 로그 FTP 전송 완료 후 서버에 알려주는 별도 로직이 없는 거 같군요.
그렇다면, 로그 전송 후 별도의 상태알림 파일을 추가로 전송하여 서버에서 전송 상태를 알 수 있게 하면 될거 같습니다.

XXX.log.20071128_001 이라는 로그 파일을 전송한다면,
XXX.log.20071128_001_END 식으로 크기 0K 파일을 로그파일 전송 후 추가적으로 보내서
서버는 동일이름의 꼬리말 _END 파일이 있는 것만 전송이 완료되었다고 판단하면 되니까요.

수고하세요
제목 : Re: 파일처리 데몬 쓰레드 락 걸리는 현상..
글쓴이: Dion_Cho(guest) 2007/11/29 17:43:24 조회수:729 줄수:2
혹시 Full Dump File을 올려주실 수 있나요?
제목 : Re: 파일 락과 cpu 점유율의 문제...
글쓴이: 기운내요(guest) 2007/11/30 19:37:39 조회수:874 줄수:21
 일단 질문의 내용중에 한가지 말씀드리고 싶은 것이 있습니다.
파일락이 걸려서 waiting하고 있다면 오히려 cpu 점유율은
떨어지는 게 맞다고 봅니다.

 꼭 파일락뿐만 아니라 어떤 형태로든 락이 걸려서 대기하고
있다면 프로그램 실행이 늦어지는 경우는 있어도 cpu 점유율이
올라가지는 않습니다.

 다만 락을 걸고 확인하고 바로 락을 풀고, 다시 락을 걸고
확인하고 바로 락을 풀고 이런 상황에서는 cpu 점유율이 많이
올라가지요.

 제가 상황을 추측하기에는 윗분 말씀대로 FTP로 파일을
올리고 있는 순간에 java 프로그램에서 파일을 열심히
읽어서 처리를 하기 때문에 아닌 가 싶습니다.

 파일이 종료되지 않고 계속 쌓이는 와중에 파일을
읽는 구문에서 아마도 buffer양 만큼 읽기 위해서 짧고
빈번한 읽기 반복 시도가 있는 것 같습니다.