我们有一台服务器,其中包含10个运行带有apache的mongrel_cluster实例 在他们面前,偶尔会有一个或几个人挂起。 数据库中没有活动(我们正在使用activerecord会话)。 与innodb表的Mysql。显示innodb状态显示没有锁。节目 进程列表没有显示任何内容。
服务器是linux debian 4.0
Ruby是:ruby 1.8.6(2008-03-03 patchlevel 114)[i486-linux]
Rails是:Rails 1.1.2(是的,很老)
我们正在使用本机mysql连接器(gem install 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 -l)
有没有其他方法可以调试这个,所以我可以举例 确定哪个文件描述符“坏”? 还有其他信息或建议吗?还有人见过这个吗?
网站使用得很充分,但并不过分,通常情况下加载平均值 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输出。别 知道它将如何在此消息中格式化...
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次),有人会断开连接等。
当发生这种情况时,mongrel-processes不占用任何大量内存,并且机器甚至没有交换,所以它可能不是内存泄漏。
total used free shared buffers cached
Mem: 4152796 4083000 69796 0 616624 2613364
-/+ buffers/cache: 853012 3299784
Swap: 1999992 52 1999940
答案 0 :(得分:2)
考虑使用ImageScience,已知RMagick会泄漏大量内存并锁定。
答案 1 :(得分:1)
“部署Rails应用程序(分步指南)”一书中的第6.3章介绍了如何在Linux上安装和配置监视实用程序Monit并使用它来监视您的mongrel。当它们失败时它可以重启你的杂种。
旧版本的Mongrel由于磁盘上存在重复的PID文件而无法重新启动。较新的版本支持--clean选项,它将删除剩余的PID文件(如果存在)。因此,您必须将Mongrel升级到支持--clean以绕过过时的PID文件问题的版本,Monit单独无法做到这一点。