MongoDB MongoDB+Mongoid 的长时间运行后,运行前 100 条就结束

sitoto · 2013年09月17日 · 最后由 sitoto 回复于 2013年09月17日 · 8168 次阅读

我使用 Mongoid 连接 MongoDB;

MongoDB shell version : 2.4.6 mongoid (3.0.0.rc)

我有 500 个任务 存储在 mongodb 数据库中

tasks = Tasks.all
tasks.each do |task|
  #  doing 大概每个要花费  2-3分钟 。。
end 

××问题出现了,当依次 执行到 第 100 个 task 的时候(估计花了 2-3 个小时),程序就自动停止了。××

============ 是 session 的问题?

没报任何错?

#1 楼 @ruby_sky 是的 正常结束。 下面是我的 mongoid.yml

dataserver:
  sessions:
    default:
      identity_map_enabled: true
      database: mydatabase
      hosts:
        - 192.168.1.1:27017

检查一下项目的 log,然后再检查一下 MongoDB 的 log,建议在跑任务的时候先 tail -f /var/log/mongodb/mongodb.log

你的 doing 也是 mongodb 的操作?

doing 任务 会在 mongodb 的 其他 collection 里面增加修改数据/

试试这样呢:

Tasks.all.no_timeout.each

#5 楼 @kungs 这样写 有什么依据吗?

正在测试。。。

#5 楼 @kungs 过了一个多小时,,,还是老样子,自动停止了。

#7 楼 @sitoto ……那就不知道了

#3 楼 @ruby_sky 结束的看到 提示消息如下:

Tue Sep 17 13:51:55.748 [conn38] getMore: cursorid not found mydatabase.tasks 429367654900332415

把 MongoId 和 Moped 的日志打开

Mongoid.logger = Logger.new(STDERR)
Moped.logger = Logger.new(STDERR)

STDERR 可以改成文件名,有可能还需要修改日志级别,比如

Moped.logger = Logger::DEBUG

看看日志里有什么异常

#9 楼 @sitoto 找了这个问题的文档所在处:http://docs.mongodb.org/meta-driver/latest/legacy/mongodb-wire-protocol/ 正在进一步查找原因。

@sitoto 如果是跑后台 Task 而且那么长时间,我很容易联想到内存不足啊,建议看看这个 Unit Of Work

Mongoid.unit_of_work(disable: :all) do
  Band.find(1)
end

each 一次给了 500 个,但是根据 http://docs.mongodb.org/manual/core/cursors/#cursor-batches http://docs.mongodb.org/manual/reference/limits/#limit-bson-document-size 默认值 100,我建议你循环的时候,一次只塞进 100 以下的数据处理。即分批处理你的 500 数据。

#14 楼 @ruby_sky #13 楼 @wppurking 感谢!我再细看一下。

Task 时间长,是因为 访问了外部服务,请求外部资源用时较长,貌似不怎么花费内存。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号