文档章节

Redis 阻塞追究

learn_more
 learn_more
发布于 2017/09/11 22:06
字数 1024
阅读 79
收藏 0

 

1、Redis阻塞的原因

1)内在原因:API乱用,数据结构乱用,CPU饱和,持久化阻塞

2)外在原因:CPU竞争,内存交换,网络延迟

 

 

2、使用们慢查询日志 slowlog get 10

1)生产环境应该设置为 1 毫秒就记录为耗时操作

2)生产环境最好把这些慢日志导入到MySQL永久保存,这样可以进行问题追踪

3)因为慢日志记录的是命令执行耗时,那么可能对某些时间复杂度高的命令废弃使用

 

 

3、发现大对象 redis-cli --bigkeys

找出5种数据结构中最大的对象,因为对象的大小和时间复杂度有直接关系,所以减小对象和废弃高复杂度的算法是一种很直接的方式。

 

 

4、CPU 饱和 redis-cli --stat

1)单线程的Redis在执行复杂命令时会把单个CPU100%使用,从而导致其他命令阻塞,这个时候使用 top 命令观察是不是 redis-server 居高不下来确认;

2)如果发现是 redis-server , 然后我们使用观察服务端请求状态来查看,redis-cli --stat 请求数如果是合理范围内(0-6万),那么我们就要查看具体命令耗时;

3)info command stats 单个命令耗时,我们做过基准测试单个命令耗时,如果1秒钟有5万的请求,那么 1*1000*1000/50000 = 20 微秒,换句话说每个命令 20 微秒之内才算正常。(有些命令应该更少,比如 exists,但是由于懒删除可能导致他非常耗时)

 

 

5、持久化阻塞

1)fork 阻塞,RDB dump 和 AOF rewrite 的时候,执行 info stats 查看 latest_fork_usec,表示最近一次 fork 的耗时(微秒),大约10ms per GB的样子,如果耗时达到 1秒,那么说明要优化。

2)AOF fsync 阻塞,其实就是 write(2)的时候要等 fsync(2)完成,如果两秒内还没有完成,那么强制执行 write(2),从而导致后面的命令执行阻塞,其一可以通过日志看到:

Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.

或者可以通过命令 info persistence 查看 aof_delayed_fsync(Redis 4.0 没有这个属性了) 的大小,每次出现阻塞都会加1.

3)HugePage 阻塞,这个阻塞主要是在大量写操作时需要复制内存页,本来是 4K 结果要复制 2M,所以增大了 512 倍。对此对所有的数据库都应该设置 Linux 的 HugePage 为关闭

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

 

 

6、CPU 竞争

以为Redis是单线程,不建议把Redis和其他CPU密集型的应用部署在同一台服务器上,否则就会出现CPU竞争从而导致Redis阻塞,对此可以使用 top 、 sar 命令查看CPU的使用。

 

 

7、内存交换

是指操作系统把Redis的使用的部分内存交换到磁盘,本来Redis的快就是因为是内存操作,所以如果改为磁盘操作,那其实是相当的慢的。可以通过如下命令查看是否Swap

>/usr/local/bin/redis-cli info | grep process_id

process_id:7117

 

>cd /proc/7117

>cat smaps | grep 'Swap:'

 

 

8、网络及连接数

1)Redis 应该对 client 进行空闲时间监测,如果空闲时间超过 30 分钟,应该 kill 掉。 设置 timeout

2)Redis 应该对 TCP 连接进行监测,也就是设置 tcp-keepalive = 1

3)Redis 调大 tcp-backlog 参数,默认 511 不要动,但是操作系统默认是 128 ,需要调为 511

> echo 511 > /proc/sys/net/core/somaxconn // 设置操作系统的默认连接数 511

> netstat -s | grep overflowed // 查找被backlog阻塞的连接数

4)网络延迟,这里的内容就比较多,不过都是出自客户端和服务端的网络问题。

© 著作权归作者所有

共有 人打赏支持
learn_more
粉丝 92
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
Redis详解(六)------ RDB 持久化

   前面我们说过,Redis 相对于 Memcache 等其他的缓存产品,有一个比较明显的优势就是 Redis 不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。这...

ysocean
06/07
0
0
【Redis源码剖析】 - Redis数据类型之列表List

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51166709 Redis源码剖析系列文章汇总:传送门 今天为大家带来Redis五大数据类型之一 – List的源码分析。 Redis中的...

xiejingfa
2016/04/16
0
0
(3)redis队列功能

Redis队列功能介绍 List 常用命令: Blpop删除,并获得该列表中的第一元素,或阻塞,直到有一个可用 Brpop删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用 Brpoplpush Lindex获...

Airship
2016/01/26
96
0
redis安全 (error) NOAUTH Authentication required

redis安全 (error) NOAUTH Authentication required Redis 安全 我们可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证,这样可以让你的 redis 服务更安全...

linjin200
12/07
0
0
Redis与Memcached的区别

memcached和redis的区别 区别: 1、数据类型不同,memcached只支持key-value,redis支持String,List,Map,set,sorted Set 2、memcached保存在内存中,redis内存和文件里面都有保存,宕机之...

underA
2013/05/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于ComponentOne For WinForm 的全新控件 – DataFilter数据切片器(Beta)

概述 数据切片器在电子商务网站上很常见 - 它们可以帮助用户快速过滤所选商品,并且所有过滤选项都可以在一个地方使用,通常包含核心控件类型为:清单,范围栏和单选按钮等。在ComponentOne ...

葡萄城技术团队
8分钟前
0
0
Spring Data JPA 常见异常

异常一: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed; nested exception i......

小99
8分钟前
0
0
聊聊flink的EventTime

序 本文主要研究一下flink的EventTime SourceFunction flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/functions/source/SourceFunction.java /** * Inte......

go4it
21分钟前
1
0
如何解决 homebrew 更新慢的问题

之前一直困扰于 Homebrew 的更新速度,曾试过修改更新源(清华、中科大等)的方式,但是并没什么卵用;也试过设置 curl 代理的方式,但是 brew 走的好像不是 curl 的方式,所以也没用。 通过...

whoru
26分钟前
2
0
TiDB EcoSystem Tools 原理解读系列(二)TiDB-Lightning Toolset 介绍

简介 TiDB-Lightning Toolset 是一套快速全量导入 SQL dump 文件到 TiDB 集群的工具集,自 2.1.0 版本起随 TiDB 发布,速度可达到传统执行 SQL 导入方式的至少 3 倍、大约每小时 100 GB,适合...

TiDB
28分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部