![]() | 1 czheo 2016-08-07 22:00:04 +08:00 bgsave 耗 cpu ,如果你的机器还跑了其它进程和 bgsave 跑到同一个 cpu core 上会慢是正常的吧。 |
![]() | 3 defunct9 2016-08-07 22:11:18 +08:00 via iPhone redis 修改 cpu 亲和性 |
![]() | 4 killpanda 2016-08-07 22:11:58 +08:00 印象里 bgsave 会阻塞吧。。 |
![]() | 5 SErHo 2016-08-07 22:13:55 +08:00 ![]() 创建子进程是要耗时的,你可以测下。《 Redis 实战》这本书的作者是这样写的:对于真实硬件、 VMWare 、 KVM 虚拟机 Redis 进程每占用 1G 内存,创建子进程的时间就要增加 10~20ms , Xen 虚拟机大概 200~300 毫秒。 |
![]() | 6 sujin190 OP @killpanda 不可能吧 |
8 tczzjin 2016-08-07 22:31:26 +08:00 你可以再起一台机器,作为 slave,然后在 slave 执行 bgsave.slave 本身不对外提供业务,应该会好很多 |
![]() | 9 Numbcoder 2016-08-07 22:35:33 +08:00 bgsave 是 fork 的,但是比较耗 cpu ,可以把 bgsave 的频率降低点 |
![]() | 10 czheo 2016-08-07 22:55:25 +08:00 @sujin190 过秒的话考虑可能是内存太小了? bgsave 要消耗内存,所以内存使用会超出你的数据大小,最坏的情况会消耗 2 倍内存。 |
![]() | 11 500miles 2016-08-07 23:20:11 +08:00 bgsave 虽然是 fork 进程处理的。。但处理时,发起大量 fsync 系统调用,主进程的 fsync 就也可能被阻塞 官方解释过这个问题。。 可以指定 bgsave 时主进程不要 fsync ,但也丧失一些安全性 |
![]() | 15 onlineismy 2016-08-08 09:39:28 +08:00 ![]() |
![]() | 16 onlineismy 2016-08-08 09:42:00 +08:00 bgsave 不会阻塞,是 fork 一个子进程,然后写磁盘: “ RDB 需要经常 fork 子进程来保存数据集到硬盘上,当数据集比较大的时候,fork 的过程是非常耗时的,可能会导致 Redis 在一些毫秒级内不能响应客户端的请求.如果数据集巨大并且 CPU 性能不是很好的情况下,这种情况会持续 1 秒,AOF 也需要 fork,但是你可以调节重写日志文件的频率来提高数据集的耐久度.” |
![]() | 17 onlineismy 2016-08-08 09:47:40 +08:00 @sujin190 master 和 salve 之间的同步也是同步 master bgsaver 的 db 文件吧? |
![]() | 18 sujin190 OP @onlineismy 其实我知道这个过程,只是数据量和 fork 时间影响比我想象的大多了,所以是不是还有其他的坑呢 |
![]() | 19 sujin190 OP @onlineismy 首次启动确实是,之后就不是了啊,直接 master 把操作命令同步发给 slave ,后面消耗就很小了 |
20 freshlhy 2016-08-08 11:15:50 +08:00 每日一千万 什么好玩的应用啊 |
![]() | 21 linoder 2016-08-09 00:56:02 +08:00 kernel 没有关闭 cache 的话 bgsave 会占用相当大一部分内存 |
23 Rosanta 2016-08-09 13:16:50 +08:00 bgsave 会 fork 出子进程进行写磁盘操作,把内存里的数据倒进磁盘。但是因为操作系统是 copy on write 机制,你 bgsave 的过程里如果写请求太多的话,也会对服务有影响,最好确认下 |