V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sujin190
V2EX  ›  Redis

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

  •  1
     
  •   sujin190 ·
    snower · 2016-08-07 21:45:23 +08:00 · 11396 次点击
    这是一个创建于 3011 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近访问量略有点上涨(每日一千万左右),发现老是偶尔会有延迟很高的情况,超过一秒以上,一直找不出原因,昨天无意中发现出现时机居然和 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   ·   实用小工具   ·   5478 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 03:45 · PVG 11:45 · LAX 19:45 · JFK 22:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.