MongoDB 的磁盘 IO 高到被 Linode 警告.. - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX    MongoDB

MongoDB 的磁盘 IO 高到被 Linode 警告..

  •  
  •   undeflife 2014-07-08 10:19:11 +08:00 11093 次点击
    这是一个创建于 4114 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我有个网站搭在Linode上,用的MongoDB 2.4.9 ,一天大概6000个PV而已,但是磁盘IO很高,昨天Linode给发了abuse ticket说我IO已经高到影响到邻居了 ,MongoDB的设置基本都是默认的,请问怎么解决这个问题
    34 条回复    2014-07-09 13:35:36 +08:00
    notnumb
        1
    notnumb  
       2014-07-08 10:27:04 +08:00
    linode没有用cgroup限制么? 还是没用cfq
    那lz用cfq和cgroup吧。
    openroc
        2
    openroc  
       2014-07-08 10:32:47 +08:00
    + redius 减少磁盘IO
    skybr
        3
    skybr  
       2014-07-08 10:38:17 +08:00   1
    mongo疯吃IO就是内存太小, 装不下热数据, 要再redis不是OOM, 就是mongo让出部分内存, 自己对IO吃得更厉害, 这是往死里做啊.
    kslr
        4
    kslr  
       2014-07-08 10:40:33 +08:00   1
    碰到过,原因就是内存不够用,解决办法只有加内存。
    undeflife
        5
    undeflife  
    OP
       2014-07-08 10:41:07 +08:00
    @notnumb 使用cgroup这样去限制不会影响网站的速度吗?我是希望能从应用的层面来处理,比如通过iotop观察到一次查询瞬时300M/s的disk read 这是我的文档结构设计得不合理吗?
    undeflife
        6
    undeflife  
    OP
       2014-07-08 10:44:09 +08:00
    @skybr
    @kslr
    - -# 除了加内存就没有别的活路了啊?
    wecoders
        7
    wecoders  
       2014-07-08 10:45:41 +08:00
    @undeflife 换mysql
    missdeer
        8
    missdeer  
       2014-07-08 10:50:54 +08:00
    @skybr
    @undeflife
    @wecoders
    话说,你们在技术选型的时候是怎么决定用mysql还是用mongodb的?
    wecoders
        9
    wecoders  
       2014-07-08 11:00:03 +08:00
    @missdeer 用你搞得定的技术;以及前期的成本考虑;
    jungledrum
        10
    jungledrum  
       2014-07-08 11:02:24 +08:00
    你确定是mongodb导致的嘛
    notnumb
        11
    notnumb  
       2014-07-08 11:16:19 +08:00
    @missdeer 单机mongo意义不大吧,还不如很多包装的leveldb或者mysql或者Elasticsearch
    undeflife
        12
    undeflife  
    OP
       2014-07-08 11:38:48 +08:00
    @jungledrum iotop活动前三都是mongodb的进程
    kslr
        13
    kslr  
       2014-07-08 12:08:52 +08:00   1
    @undeflife 暂未找到。
    msg7086
        14
    msg7086  
       2014-07-08 12:37:36 +08:00
    一天6000PV,平均每分钟4.2PV,这能把linode的IO跑成abuse,不容易吧?
    shiny
        15
    shiny  
       2014-07-08 12:52:12 +08:00
    比如有正确添加索引都会出现这种状况。
    另外 Linode 的警告只是提醒下你,你可以修改其上限的。
    shiny
        16
    shiny  
       2014-07-08 12:55:31 +08:00
    看错了,abuse ticket确实有点夸张了。

    估计是数据库结构或者用法不正确。MongoDB 要正确使用其实很有难度。
    undeflife
        17
    undeflife  
    OP
       2014-07-08 14:09:44 +08:00
    @msg7086
    insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time
    1 4 *0 *0 0 1|0 0 7.95g 16.1g 2.82g 1046 site:0.1% 0 0|0 1|0 4k 3k 17 14:06:33

    mapped 近8G vsize 16G
    4G的vps 而mongodb的数据文件也已经涨到8G了,按楼上的回复 应该是内存不足导致的.
    tonyluj
        18
    tonyluj  
       2014-07-08 14:18:26 +08:00
    @msg7086 PV貌似不是这么算的,有的时间人很多,有的时候基本没人
    一般很大部分都集中在某几个小时里面

    确实需要+内存了
    msg7086
        19
    msg7086  
       2014-07-08 14:22:32 +08:00   2
    我不太清楚你的程序有多大的查询量,也不太清楚mongodb的运行性能到底如何,不过我这跑的论坛,12G的MySQL配合memcache热备,用20刀的机器就能轻松顶下来了,一天200万pv。

    而且之前搜索的时候也的确看到有人抱怨说mongodb的内存缓存需要等预热时间,否则会死很惨,不知道有没有关系。

    另外推荐改善一下架构,能走缓存的就不要撞数据库了。如果nosql的索引做不好的话,还是回到RDBMS的世界来比较好,毕竟是非常成熟的架构。
    msg7086
        20
    msg7086  
       2014-07-08 16:13:43 +08:00
    @tonyluj 对于大部分应用,一小时6000pv都不是什么很大的量,每秒2个而已。纯SSD+E5-2680v2要是每秒2个pv都应付不下来,肯定是有什么问题了。
    undeflife
        21
    undeflife  
    OP
       2014-07-08 16:19:13 +08:00
    @msg7086 考虑迁到postgreSQL上去,这样部分数据结构的问题可以使用PostgreSQL的json字段的特性解决,只不过这个需要开发时间,我现在需要解决掉这个高IO的问题,还不知道我如果持续不解决,Linode会怎么处理
    msg7086
        22
    msg7086  
       2014-07-08 16:59:02 +08:00   1
    @undeflife mongodb我不熟所以没办法帮你。

    Linode如果abuse的话是停掉你的机子直到你能解决问题为止。
    codingpp
        23
    codingpp  
       2014-07-08 18:07:39 +08:00
    会不会是journal日志的影响
    undeflife
        24
    undeflife  
    OP
       2014-07-08 18:29:45 +08:00
    @codingpp 有过这个怀疑 但是不敢关闭 - -
    skybr
        25
    skybr  
       2014-07-08 18:36:58 +08:00
    @undeflife 没办法, mongo的性能和可靠性本身就高度依赖充足的内存和冗余的节点来保证.


    @missdeer 有nosql需求的还是走pg吧, hstore很靠谱, 9.4之后还有jsonb.
    happy123
        26
    happy123  
       2014-07-08 18:37:10 +08:00
    mongostat

    看一下faults数目,正常情况下应该为0的。如果持续大于0说明一直在换页,该加内存了。如果持续100+,iostat看下IO负载,绝对要加内存了。
    codingpp
        27
    codingpp  
       2014-07-08 18:46:01 +08:00
    @undeflife
    用了journal日志也会丢消息吧,mongo又不支持事务,journal刷新磁盘默认好像是100ms,这100ms内的日志还会丢
    把journal日志关掉,就是把这100ms变成了60s

    前天写个用mongo的程序,数据文件300m,journal日志3g,过不了几天我的小vps就没空间了。。。
    undeflife
        28
    undeflife  
    OP
       2014-07-08 18:57:56 +08:00
    @happy123
    @codingpp
    faults 4~15 所以还是内存的问题..我准备晚上试试 repairDatabase 这样数据文件能变得小一些 看有没有效果.
    sujin190
        29
    sujin190  
       2014-07-08 19:09:23 +08:00
    这个4g内存,8g数据怎么会有那么高的fault,是不是索引建的有问题啊?或者是数据结构问题,每次查询都要调入所有数据到内存?
    sujin190
        30
    sujin190  
       2014-07-08 19:11:56 +08:00
    你这fault是1046么?!!
    undeflife
        31
    undeflife  
    OP
       2014-07-08 20:19:40 +08:00
    @sujin190 找到个坑...程序上有个地方无索引的排序整个大collection,把这个语句干掉之后似乎情况好了不少...
    sujin190
        32
    sujin190  
       2014-07-08 21:21:54 +08:00
    @undeflife 8g,应该还不到百万条记录吧
    undeflife
        33
    undeflife  
    OP
       2014-07-08 21:38:50 +08:00
    @sujin190 嗯 不到 90几万
    leafonsword
        34
    leafonsword  
       2014-07-09 13:35:36 +08:00
    1.加索引
    2.加内存
    3.换成支持数据压缩的TokuMX
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3939 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 00:56 PVG 08:56 LAX 17:56 JFK 20:56
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86