2008-09-16 125 views
1

我們有一臺服務器,運行着10個運行mongrel_cluster實例,前面有apache ,每隔一段時間,其中一個或一些掛起。 數據庫中沒有看到活動(我們正在使用activerecord會話)。 Mysql與innodb表。顯示innodb狀態顯示沒有鎖定。顯示 processlist沒有顯示任何內容。Mongrel掛起100%CPU/EBADF(錯誤文件描述符)

服務器是Linux的Debian 4.0

Ruby是:紅寶石1.8.6(2008-03-03 PATCHLEVEL 114)[1486-的linux]

Rails是:Rails的1.1.2(是的,相當舊)

我們使用本地的mysql連接器(寶石安裝mysql)

「使用strace -p PID」 給出了鴻雜種循環以下 過程:

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的,發現過程中使用67個文件描述符(lsof的-p PID | WC-1)

有沒有其他辦法,我可以調試這一點,這樣我就可以例如 確定哪個文件描述符是「壞」? 任何其他信息或建議?其他人看到這個?

該網站是相當使用,但不是過度,平均負載通常約爲 0.3。


一些附加信息。我安裝mongrelproctitle證明有多少 掛流程在做,而且看來他們是掛在一個方法 顯示使用file_column /圖片圖片來自數據庫/ 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的輸出。不知道 將如何在該郵件格式...

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 

我已經安裝的monit來監控服務器。由於PID文件問題,沒有自動重新啓動,但也許我會得到支持刪除陳舊PID文件的最新版本。
這將是很好,雖然實際解決問題,因爲有人會得到斷開等如果服務器需要重新啓動所有的時間(約10倍,每天)

的雜種的工藝不採取任何大發生這種情況時的內存量,並且機器甚至沒有交換,所以它可能不是內存泄漏。

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

您使用的是哪個版本的Image Magick? – 2008-09-17 13:54:27

回答

1

第6.3章在書中部署Rails應用程序(如步驟指南一個步驟),對安裝和配置Linux上的監控工具monit的,並用它來監視你的雜種良好的部分。它可以在失敗時重新啓動你的雜種。

較早版本的Mongrel由於磁盤上存在重複的PID文件而無法重新啓動。較新的版本支持--clean選項,可以擺脫剩餘的PID文件(如果存在)。因此,您必須將Mongrel升級到支持--clean來解決過時的PID文件問題的版本,Monit本身無法執行此操作。

2

考慮使用ImageScience,RMagick已知會泄漏大量內存並鎖定。

+0

替換rmagick並不是這個項目的真正選擇。此外,除非它在生產環境中運行,否則我無法重現這一點,所以rmagick開發人員無法提供幫助(我試着問)。並沒有內存泄漏,但只鎖定(這可能是由於其他原因) – Frontline 2008-09-17 09:57:06