我使用 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 的问题?
检查一下项目的 log,然后再检查一下 MongoDB 的 log,建议在跑任务的时候先
tail -f /var/log/mongodb/mongodb.log
你的 doing
也是 mongodb 的操作?
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 时间长,是因为 访问了外部服务,请求外部资源用时较长,貌似不怎么花费内存。