redis做RDB时请求超时case

最近在排查redis做rdb时会有部分请求超时的case。初步判断是我们redis服务器上开启了THP(Transparent Huge Pages)。

1) Linux本身的页大小是固定的4KB,在2.6.38内核新增了THP,透明地支持huge page(2MB)的使用,并且默认开启。开启THP的优势在于:

- 减少page fault。一次page fault可以加载更大的内存块。

- 更小的页表。相同的内存大小,需要更少的页。

- 由于页表更小,虚拟地址到物理地址的翻译也更快。

劣势在于:

- 降低分配内存效率。需要大块、连续内存块,内核线程会比较激进的进行compaction,解决内存碎片,加剧锁争用。

- 降低IO吞吐。由于swapable huge page,在swap时需要切分成原有的4K的页。Oracle的测试数据显示会降低30%的IO吞吐。

2) 对于redis而言,开启THP的优势在于:

- fork子进程的时间大幅减少。fork进程的主要开销是拷贝页表、fd列表等进程数据结构。由于页表大幅较小(2MB / 4KB = 512倍),fork的耗时也会大幅减少。

劣势在于:

- fork之后,父子进程间以copy-on-write方式共享地址空间。如果父进程有大量写操作,并且不具有locality,会有大量的页被写,并需要拷贝。同时,由于开启THP,每个页2MB,会大幅增加内存拷贝。

3) 针对这个特性,我做了一个测试,分别在开启和关闭THP的情况下,测试redis的fork、响应时间。

测试条件:

redis数据集大小:16G

rdb文件大小:3.4G

./redis-benchmark -P 4 -t set -r 5000000 -n 1000000000

(1) fork时间对比

开启THP后,fork大幅减少。

(2)超时次数

使用redis-benchmark测试,单个kv只有几字节,没办法模拟真实线上的延迟,这里任务延迟超过300us的请求即为超时,统计这些请求的个数。

开启THP后,超时次数明显增多,但是每次超时时间较短。而关闭THP后,只有4次超时,原因是与fork在同一事件循环的请求受到fork的影响,chu‘l。

关闭THP影响的只是零星几个请求,而开启后,虽然超时时间短了,但是影响面扩大了。

4)查看THP状态

$ cat /sys/kernel/mm/transparent_hugepage/enabled

[always] madvise never

always表示总是开启, madvise根据程序的配置开启,never关闭。

关闭THP

sudo echo never > /sys/kernel/mm/transparent_hugepage/enabled

需要重启进程

5) 结论

集合业界的经验,建议关闭我们线上redis、mysql、mongodb等机器的THP。

6)references

Transparent Huge Pages

各种坑:

https://blogs.oracle.com/linux/entry/performance_issues_with_transparent_huge

http://docs.splunk.com/Documentation/Splunk/6.2.3/ReleaseNotes/SplunkandTHP

http://structureddata.org/2012/06/18/linux-6-transparent-huge-pages-and-hadoop-workloads/

http://antirez.com/news/84

时间: 2024-08-09 06:34:18

redis做RDB时请求超时case的相关文章

第十章 Redis持久化--RDB+AOF

注:本文主要参考自<Redis设计与实现> 1.Redis两种持久化方式 RDB 执行机制:快照,直接将databases中的key-value的二进制形式存储在了rdb文件中 优点:性能较高(因为是快照,且执行频率比aof低,而且rdb文件中直接存储的是key-values的二进制形式,对于恢复数据也快) 缺点:在save配置条件之间若发生宕机,此间的数据会丢失 AOF 执行机制:将对数据的每一条修改命令追加到aof文件 优点:数据不容易丢失 缺点:性能较低(每一条修改操作都要追加到aof文

redis持久化RDB和AOF

Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集. AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾. Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所

redis的 rdb 和 aof 持久化的区别 [转]

aof,rdb是两种 redis持久化的机制.用于crash后,redis的恢复. rdb的特性如下: Code: fork一个进程,遍历hash table,利用copy on write,把整个db dump保存下来.save, shutdown, slave 命令会触发这个操作.粒度比较大,如果save, shutdown, slave 之前crash了,则中间的操作没办法恢复. aof有如下特性: Code: 把写操作指令,持续的写到一个类似日志文件里.(类似于从postgresql等数

redis持久化RDB和AOF-转载

Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集. AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾. Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所

Redis 持久化RDB与AOF

Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集. AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾. Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所

Redis持久化RDB、AOF

持久化的意思就是保存,保存到硬盘.第一次接触这个词是在几年前学习EF. 为什么要持久化 redis定义:Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.它支持字符串.哈希表.列表.集合.有序集合,位图,hyperloglogs等数据类型.内置复制.Lua脚本.LRU收回.事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区. 可以看出redis是一个内存的数据库,但是如果re

REdis之RDB配置问题

RDB配置:save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error nordbcompression yesrdbchecksum yesrepl-diskless-sync noaof-use-rdb-preamble nordb-save-incremental-fsync yes 影响:易生成REdis客户端的连接超时. 建议:如果已经开启了AOF,可关闭RDB,即将save参数值设置为空:save "":或者调

Redis在持久化时产生的延迟

一个老外的有关Redis的博客文章中提到一个有趣的事情:它们在测试期间获得的延迟图.为了持久化Redis的数据到磁盘(例如:RDB持久化),Redis需要调用fork()系统命令. 通常使用物理服务器和大多数虚拟机管理程序进行fork是很快的,即使很大的进程也是如此. 然而,Xen的fork()速度很慢,因此对于某些EC2实例类型(以及其他虚拟服务器提供程序),每次父进程调用fork()以便进行RDB持久化时,可能会出现严重的延迟峰值. 如下图所示,清晰的展示了延迟峰值: 您可以想象一下,如果您

Spring整合Redis做数据缓存(Windows环境)

当我们一个项目的数据量很大的时候,就需要做一些缓存机制来减轻数据库的压力,提升应用程序的性能,对于java项目来说,最常用的缓存组件有Redis.Ehcache和Memcached. Ehcache是用java开发的缓存组件,和java结合良好,直接在jvm虚拟机中运行,不需要额外安装什么东西,效率也很高:但是由于和java结合的太紧密了,导致缓存共享麻烦,分布式集群应用不方便,所以比较适合单个部署的应用. Redis需要额外单独安装,是通过socket访问到缓存服务,效率比Ehcache低,但