在MongoDB日志中,“fastmod”是什么意思?

3

我认为fastmod指定了一些像原地更新的操作。在我的应用中,我使用'$'修饰符通过_id进行更新,例如:

$colleciton->update(
    array('_id' => $id),
    array(
        '$inc' => array('hits' => new MongoInt32(1)),
        '$set' => array(
                      'times.gen' => gettimeofday(true),
                      'http.code' => new MongoInt32(200)
         )
    ),
    array('safe'=>false,'multiple'=>false,'upsert'=>false)
);

我收到了这样的日志:
Wed Jul 25 11:08:36 [conn7002912] update mob.stat_pages query: { _id: BinData } update: { $inc: { hits: 1 }, $set: { times.gen: 1343203715.684896, http.code: 200 } } nscanned:1 nupdated:1 keyUpdates:0 locks(micros) w:342973 342ms

在日志中,你可以看到我没有任何“fastmod”标志。没有“移动”标志,因为我在插入时设置了字段'times.gen'和'http.code',所以填充因子为1.0。
我是否做错了什么,或者我误解了fastmod的意思?

我有很高的锁定写入百分比,所以我正在尝试优化我的应用程序。我之前看到了快速模块更新,但现在它已经消失了,我不知道为什么。 - evilive
%locked 通常意味着您的工作集大于 RAM,mongodb 必须不断地从磁盘读取/写入内存页面。即使进行原地更新,如果内存页面在磁盘上,也会遇到问题。 - Sergio Tulentsev
实际上这是完全可能的。你每秒写入多少次? - Sergio Tulentsev
平均为45,根据时间在20到55之间变化。http://s017.radikal.ru/i421/1207/95/672cc8a4d831.png - evilive
更新也是写入操作。您是否启用了日志记录?您使用的是哪些磁盘? - Sergio Tulentsev
显示剩余7条评论
1个回答

3
您说得对,“fastmod”在日志中表示原地更新。可能导致未记录快速修改/原地操作的原因有:
  1. 您实际上是在设置或增加一个不存在的字段,因此必须添加而不是进行原地操作
  2. 日志只显示慢查询(默认值>100ms),因此原地操作可能发生得太快而无法记录
  3. 根据日志,您似乎正在使用2.1或2.2 - 如果/当您切换到新版本时,消息是否消失了?
进一步研究此问题的方法:
请查看分析器,尝试使用不同的设置,请注意:分析会增加负载 - 因此请谨慎使用。
您也可以尝试在启动时或之后将slowms值设得更低:
> db.setProfilingLevel(0,20) // slow threshold=20ms

是的,我正在使用 _version: 2.2.0-rc0_,并且我之前在同一版本中的日志中看到了 fastmod 的更新。我将尝试设置 setProfilingLevel(2) 几分钟,然后检查是否有任何 fastmod 更新。 - evilive
好的,我尝试了。当我将setProfilingLevel设置为1或2时,日志中会出现fastmod标志(有时它们并不真正快速^_^,但它们确实存在。我见过最长的大约是0.4秒)。但是当我将setProfilingLevel设置为0时,“fastmod”标志从日志中消失了。这样可以吗? - evilive
是的 - 这意味着任何时候(或至少大多数情况下),当您进行快速修改并进行原地更新时,它都低于100ms的默认慢操作阈值,因此不会被记录。当无法原地更新时(例如,字段不存在),则速度较慢,不是快速修改,并且超过了100ms的阈值,因此会被记录 - 明白了吗? - Adam Comerford
好的,由于我的英语不太好,所以很难解释,但我会尝试,抱歉。当我们将所有操作写入日志时,让我们忘记setProfililngLevel(2)。让我们执行setProfilingLevel(1,50),然后执行“show log global”:我看到很多“fastmod:1”,我甚至可以说所有更新都是fastmod。然后我们执行setProfilingLevel(0,50),再次执行“show log global”:我们不会看到任何“fastmod:1”。这似乎是某种记录问题,不是吗? - evilive
可能 nscanned 1 只检查了索引 (1),而 nscanned 2 则命中了索引和文档本身 - 这两者都适用于该计数器。 - Adam Comerford
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接