redis 关闭 bgsave 后整个 web 响应时间提升 5 倍,这是个坑么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sujin190
V2EX    Redis

redis 关闭 bgsave 后整个 web 响应时间提升 5 倍,这是个坑么?

  •  1
     
  •   sujin190
    snower 2016-08-07 21:45:23 +08:00 11948 次点击
    这是一个创建于 3354 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近访问量略有点上涨(每日一千万左右),发现老是偶尔会有延迟很高的情况,超过一秒以上,一直找不出原因,昨天无意中发现出现时机居然和 redis 的 bgsave 一样,猜想和 redis 有点关系,于是关闭了 bgsave ,今天一看响应平均延时居然从原来的 110ms 左右下降到了 20ms 左右,我一直以为 redis 持久化是 fork 进程处理的,应该对正常处理请求不会有影响才是,感觉官方文档也是这么说的,难道是我理解的不对么?还是中间还有其他的坑呢?
    24 条回复    2016-08-09 13:34:30 +08:00
    czheo
        1
    czheo  
       2016-08-07 22:00:04 +08:00
    bgsave 耗 cpu ,如果你的机器还跑了其它进程和 bgsave 跑到同一个 cpu core 上会慢是正常的吧。
    sujin190
        2
    sujin190  
    OP
       2016-08-07 22:05:11 +08:00
    @czheo 8 核,就跑了一个 redis 实例
    defunct9
        3
    defunct9  
       2016-08-07 22:11:18 +08:00 via iPhone
    redis 修改 cpu 亲和性
    killpanda
        4
    killpanda  
       2016-08-07 22:11:58 +08:00
    印象里 bgsave 会阻塞吧。。
    SErHo
        5
    SErHo  
       2016-08-07 22:13:55 +08:00   1
    创建子进程是要耗时的,你可以测下。《 Redis 实战》这本书的作者是这样写的:对于真实硬件、 VMWare 、 KVM 虚拟机 Redis 进程每占用 1G 内存,创建子进程的时间就要增加 10~20ms , Xen 虚拟机大概 200~300 毫秒。
    sujin190
        6
    sujin190  
    OP
       2016-08-07 22:19:15 +08:00
    @killpanda 不可能吧
    sujin190
        7
    sujin190  
    OP
       2016-08-07 22:20:34 +08:00
    @SErHo 可是在 bgsave 过程中,响应延时都过秒了,也和那不一样啊,奇怪
    tczzjin
        8
    tczzjin  
       2016-08-07 22:31:26 +08:00
    你可以再起一台机器,作为 slave,然后在 slave 执行 bgsave.slave 本身不对外提供业务,应该会好很多
    Numbcoder
        9
    Numbcoder  
       2016-08-07 22:35:33 +08:00
    bgsave 是 fork 的,但是比较耗 cpu ,可以把 bgsave 的频率降低点
    czheo
        10
    czheo  
       2016-08-07 22:55:25 +08:00
    @sujin190 过秒的话考虑可能是内存太小了? bgsave 要消耗内存,所以内存使用会超出你的数据大小,最坏的情况会消耗 2 倍内存。
    500miles
        11
    500miles  
       2016-08-07 23:20:11 +08:00
    bgsave 虽然是 fork 进程处理的。。但处理时,发起大量 fsync 系统调用,主进程的 fsync 就也可能被阻塞

    官方解释过这个问题。。 可以指定 bgsave 时主进程不要 fsync ,但也丧失一些安全性
    sujin190
        12
    sujin190  
    OP
       2016-08-07 23:57:38 +08:00
    @tczzjin 现在就是这么干的,还不错
    sujin190
        13
    sujin190  
    OP
       2016-08-07 23:59:16 +08:00
    @500miles 这个系统调用不是同步文件写到磁盘的么?主进程还会有这个调用?
    sujin190
        14
    sujin190  
    OP
       2016-08-07 23:59:43 +08:00
    @500miles 内存只用了四分之一,应该不是这个问题
    onlineismy
        15
    onlineismy  
       2016-08-08 09:39:28 +08:00   1
    onlineismy
        16
    onlineismy  
       2016-08-08 09:42:00 +08:00
    bgsave 不会阻塞,是 fork 一个子进程,然后写磁盘:
    “ RDB 需要经常 fork 子进程来保存数据集到硬盘上,当数据集比较大的时候,fork 的过程是非常耗时的,可能会导致 Redis 在一些毫秒级内不能响应客户端的请求.如果数据集巨大并且 CPU 性能不是很好的情况下,这种情况会持续 1 秒,AOF 也需要 fork,但是你可以调节重写日志文件的频率来提高数据集的耐久度.”
    onlineismy
        17
    onlineismy  
       2016-08-08 09:47:40 +08:00
    @sujin190 master 和 salve 之间的同步也是同步 master bgsaver 的 db 文件吧?
    sujin190
        18
    sujin190  
    OP
       2016-08-08 09:52:14 +08:00
    @onlineismy 其实我知道这个过程,只是数据量和 fork 时间影响比我想象的大多了,所以是不是还有其他的坑呢
    sujin190
        19
    sujin190  
    OP
       2016-08-08 10:56:52 +08:00
    @onlineismy 首次启动确实是,之后就不是了啊,直接 master 把操作命令同步发给 slave ,后面消耗就很小了
    freshlhy
        20
    freshlhy  
       2016-08-08 11:15:50 +08:00
    每日一千万 什么好玩的应用啊
    linoder
        21
    linoder  
       2016-08-09 00:56:02 +08:00
    kernel 没有关闭 cache 的话 bgsave 会占用相当大一部分内存
    sujin190
        22
    sujin190  
    OP
       2016-08-09 10:12:13 +08:00
    @linoder 写缓存?这就是说用户空间内存使用加写缓存?
    Rosanta
        23
    Rosanta  
       2016-08-09 13:16:50 +08:00
    bgsave 会 fork 出子进程进行写磁盘操作,把内存里的数据倒进磁盘。但是因为操作系统是 copy on write 机制,你 bgsave 的过程里如果写请求太多的话,也会对服务有影响,最好确认下
    sujin190
        24
    sujin190  
    OP
       2016-08-09 13:34:30 +08:00
    @Rosanta 恩,确实,虽然 redis 写请求大半,但每秒也不到一千,这小意思了吧
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5575 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 08:12 PVG 16:12 LAX 01:12 JFK 04:12
    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