2008-09-16 8 views
1

우리 앞에 서버 이있는 mongrel_cluster 인스턴스가 10 개 실행되는 서버가 있으며, 그 중 하나 또는 일부가 중단됩니다. 데이터베이스에서 활동이 보이지 않습니다 (우리는 activerecord 세션을 사용 중입니다). innodb 테이블이있는 mysql. show innodb status는 잠금을 보여주지 않습니다. 프로세스 목록에 아무 것도 표시되지 않습니다.100 % CPU/EBADF (잘못된 파일 설명자)로 잡동사니가 있습니다.

서버 리눅스 데비안 4.0

루비이다 루비 1.8.6 (2008-03-03 패치 레벨 114)을 i486 리눅스]

레일이다 레일 1.1.2 (예, 아주

,691,363 : 오래된) 우리는 기본 MySQL의 커넥터를 사용하고

는 (보석 프로세스 중단 잡종에 대한 루프에서 다음

"strace를 -p PID는"제공) MySQL을 설치 나는 예를 에 대해 결정할 수

나는이 디버깅 할 수있는 다른 방법이 있나요 그래서 |210

gettimeofday({1219834026, 235289}, NULL) = 0 
select(4, [3], [0], [], {0, 905241}) = -1 EBADF (Bad file descriptor) 
gettimeofday({1219834026, 235477}, NULL) = 0 
select(4, [3], [0], [], {0, 905053}) = -1 EBADF (Bad file descriptor) 
gettimeofday({1219834026, 235654}, NULL) = 0 
select(4, [3], [0], [], {0, 904875}) = -1 EBADF (Bad file descriptor) 
gettimeofday({1219834026, 235829}, NULL) = 0 
select(4, [3], [0], [], {0, 904700}) = -1 EBADF (Bad file descriptor) 
gettimeofday({1219834026, 236017}, NULL) = 0 
select(4, [3], [0], [], {0, 904513}) = -1 EBADF (Bad file descriptor) 
gettimeofday({1219834026, 236192}, NULL) = 0 
select(4, [3], [0], [], {0, 904338}) = -1 EBADF (Bad file descriptor) 
gettimeofday({1219834026, 236367}, NULL) = 0 
... 

내가 lsof를 사용하고 프로세스가 (화장실 -l -p PID lsof를) 67 개 파일 디스크립터를 사용하는 것을 발견 어떤 파일 기술자가 "불량"입니까? 다른 정보 또는 제안 사항이 있으십니까? 이걸 본 사람?

사이트가 상당히 많이 사용되지는 않지만 부하 평균은 보통 0.3입니다.


일부 추가 정보. 걸린 프로세스가 무엇을하고 있었는지 보여주기 위해 mongrelproctitle을 설치했으며, 데이터베이스의 file_column/images를 사용하는 이미지 / rmagick을 사용하여 이미지의 크기를 조정하고 이미지를 회색조로 표시하는 방법 에 매달려있는 것으로 보입니다.

결론적이지 않은 것은 문제이지만 여기에는 의문이 있습니다. 분명히 다음과 같은 문제가 있습니까? 메서드는 주문에 이미지가 포함되어 있지 않으면 정적 이미지를 표시하고 그렇지 않은 경우 이미지는 주문에서 크기가 조정됩니다. 캐시 내용은 매번 브라우저에서 이미지가 으로 업데이트되도록합니다. 이미지는 일반 이미지 태그 인 페이지에 삽입됩니다.

코드 : 여기

def preview_image 
    @order = session[:order] 
    if @order.image.nil? 
     @headers['Pragma'] = 'no-cache' 
     @headers['Cache-Control'] = 'no-cache, must-revalidate' 
     send_data(EMPTY_PIC.to_blob, :filename => "img.jpg", :type => 
"image/jpeg", :disposition => "inline") 
     else 
     @pic = Image.read(@order.image)[0] 
     if (@order.crop) 
     @pic.crop!(@order.crop[:x1].to_i, @order.crop[:y1].to_i, 
@order.crop[:width].to_i, @order.crop[:height].to_i, true) 
     end 
     @pic.resize!(103,130) 
     @pic = @pic.quantize(256, Magick::GRAYColorspace) 
     @headers['Pragma'] = 'no-cache' 
     @headers['Cache-Control'] = 'no-cache, must-revalidate' 
     send_data(@pic.to_blob, :filename => "img.jpg", :type => 
"image/jpeg", :disposition => "inline") 
    end 
    end 

는 사람이 어떤 문제를 발견 할 수있는 경우 lsof의 출력입니다. 내가 서버를 모니터링 할 수 MONIT를 설치 한

lsof: WARNING: can't stat() ext3 file system /dev/.static/dev 
     Output information may be incomplete. 
COMMAND  PID USER FD TYPE  DEVICE  SIZE  NODE NAME 
mongrel_r 11628 username cwd DIR  9,2  4096 1870688 
/home/domains/example.com/usernameOrder/releases/20080831121802 
mongrel_r 11628 username rtd DIR  9,1  4096  2/
mongrel_r 11628 username txt REG  9,1  3564 167172 
/usr/bin/ruby1.8 
mongrel_r 11628 username mem REG  0,0     0 
[heap] (stat: No such file or directory) 
mongrel_r 11628 username DEL REG  0,8   15560245 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560242 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560602 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560601 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560684 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560683 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560685 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560568 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560607 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560569 
/dev/zero 
mongrel_r 11628 username mem REG  9,1 1933648 456972 
/usr/lib/libmysqlclient.so.15.0.0 
mongrel_r 11628 username DEL REG  0,8   15442414 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560546 
/dev/zero 
mongrel_r 11628 username mem REG  9,1  67408 457393 
/lib/i686/cmov/libresolv-2.7.so 
mongrel_r 11628 username mem REG  9,1  17884 457386 
/lib/i686/cmov/libnss_dns-2.7.so 
mongrel_r 11628 username DEL REG  0,8   15560541 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560246 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560693 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560608 
/dev/zero 
mongrel_r 11628 username mem REG  9,1  25700 164963 
/usr/lib/gconv/gconv-modules.cache 
mongrel_r 11628 username mem REG  9,1  83708 457384 
/lib/i686/cmov/libnsl-2.7.so 
mongrel_r 11628 username mem REG  9,1 140602 506903 
/var/lib/gems/1.8/gems/mysql-2.7/lib/mysql.so 
mongrel_r 11628 username mem REG  9,1 1282816 180935 
... 
mongrel_r 11628 username 1w REG  9,2 462923 1575329 
/home/domains/example.com/usernameOrder/shared/log/mongrel.8001.log 
mongrel_r 11628 username 2w REG  9,2 462923 1575329 
/home/domains/example.com/usernameOrder/shared/log/mongrel.8001.log 
mongrel_r 11628 username 3u IPv4 15442350    TCP 
localhost:8001 (LISTEN) 
mongrel_r 11628 username 4w REG  9,2 118943548 1575355 
/home/domains/example.com/usernameOrder/shared/log/production.log 
mongrel_r 11628 username 5u REG  9,1 145306 234226 
/tmp/mongrel.11628.0 (deleted) 
mongrel_r 11628 username 7u unix 0xc3c12480   15442417 
socket 
mongrel_r 11628 username 11u REG  9,1  50 234180 
/tmp/CGI.11628.2 
mongrel_r 11628 username 12u REG  9,1  26228 234227 
/tmp/CGI.11628.3 

... 그것은이 메시지에서 포맷하는 방법을 모르는 마십시오. PID 파일 문제로 인해 자동으로 다시 시작하지는 않지만 부실 PID 파일 삭제를 지원하는 최신 버전을 구할 수 있습니다.
서버를 항상 다시 시작해야하는 경우 (예 : 하루에 10 번)

mongrel 프로세스가 큰 크기를 차지하지 않으면 실제로 문제를 해결하는 것이 좋습니다. 이 상황이 발생할 때의 메모리 양과 컴퓨터가 스와핑을하지 않기 때문에 아마도 메모리 누수가 아닙니다. 책 배포 레일 응용 프로그램에서

   total  used  free  shared buffers  cached 
Mem:  4152796 4083000  69796   0  616624 2613364 
-/+ buffers/cache:  853012 3299784 
Swap:  1999992   52 1999940 
+0

사용중인 Image Magick의 버전은 무엇입니까? –

답변

1

장 6.3 (단계 가이드에 의해 단계)를 설치하고 리눅스에 대한 모니터링 유틸리티 MONIT를 구성하고 놈아을 모니터링하는 데 사용에 대한 좋은 부분이있다. 그것은 그들이 실패하면 잡종을 다시 시작할 수 있습니다.

이전 버전의 Mongrel은 디스크에 중복 PID 파일이 있기 때문에 다시 시작하는 데 문제가있었습니다. 최신 버전은 남은 PID 파일이 존재할 경우 없애 버리는 --clean 옵션을 지원합니다. 따라서 Mongrel을 부식 된 PID 파일 문제를 해결하기 위해 --clean을 지원하는 버전으로 업그레이드해야합니다. Monit만이이를 수행 할 수 없습니다.

2

ImageScience을 사용하는 것을 고려하면 RMagick은 방대한 양의 메모리와 잠금 장치를 누출하는 것으로 알려져 있습니다.

+0

rmagick을 대체하는 것은이 프로젝트에서 실제로 옵션이 아닙니다. 게다가, 생산에서 실행되지 않는 한이를 재현 할 수 없으므로 rmagick 개발자는 도움을받을 수 없습니다 (나는 물어 보았습니다). 그리고 메모리 누출은 없지만 잠금 만 (다른 것 때문에) – Frontline

관련 문제