文档章节

Redis 阻塞追究

learn_more
 learn_more
发布于 2017/09/11 22:06
字数 1024
阅读 23
收藏 0
点赞 0
评论 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
粉丝 90
博文 240
码字总数 210196
作品 0
深圳
程序员
【Redis源码剖析】 - Redis数据类型之列表List

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

xiejingfa ⋅ 2016/04/16 ⋅ 0

(3)redis队列功能

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

Airship ⋅ 2016/01/26 ⋅ 0

Redisbook学习笔记(3)数据类型之列表

REDIS_LIST (列表) 是LPUSH 、LRANGE 等命令的操作对象, 它使用 REDISENCODINGZIPLIST 和REDISENCODINGLINKEDLIST 这两种方式编码: 编码的选择 创建新列表时Redis 默认使用REDISENCODING...

shayang88 ⋅ 2014/02/22 ⋅ 0

Golang基于redis实现的分布式信号量(semaphore)

前言: Semaphore是信号量,作用? 我想大家都知道。semaphore跟mutex的区别我想大家也知道了,我这里就不老生常谈,重复讲解了,有兴趣的朋友可以自行google相关的同步锁文章。 该文章后续会有...

rfyiamcool ⋅ 2017/10/17 ⋅ 0

Redis与Memcached的区别

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

underA ⋅ 2013/05/15 ⋅ 0

Redis时延问题分析及应对

Redis时延问题分析及应对 Redis的事件循环在一个线程中处理,作为一个单线程程序,重要的是要保证事件处理的时延短,这样,事件循环中的后续任务才不会阻塞; 当redis的数据量达到一定级别后...

古城寨主 ⋅ 2017/11/15 ⋅ 0

Redis——RDB持久化

因为Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以如果不想办法将存储在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见。 ...

nao ⋅ 2016/05/12 ⋅ 0

关于Redis的一些思考和总结

日常的业务系统中经常使用到redis,平时也会研究下redis的设计文档和源码,对redis的使用场景、实现方案、运维要点这些常规知识点都有所了解,但是零零碎碎总感觉不够系统,这里结合源码对自...

zqrferrari ⋅ 2017/11/21 ⋅ 0

11.python并发入门(part5 event对象)

一、引入event。 每个线程,都是一个独立运行的个体,并且每个线程的运行状态是无法预测的。 如果一个程序中有很多个线程,程序的其他线程需要判断某个线程的运行状态,来确定自己下一步要执...

技术小胖子 ⋅ 2017/11/15 ⋅ 0

Redis与Memcached的区别

简单地比较Redis与Memcached的区别,大多数都会得到以下观点: 1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。 2 Redis支持数据的备份,即master-slav...

xiaoxin ⋅ 2013/07/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Thrift RPC实战(二) Thrift 网络服务模型

TServer类层次体系 TSimpleServer/TThreadPoolServer是阻塞服务模型 TNonblockingServer/THsHaServer/TThreadedSelectotServer是非阻塞服务模型(NIO) 1 TServer抽象类的定义 内部静态类Args的...

lemonLove ⋅ 7分钟前 ⋅ 0

vim命令用法

第五章 vim命令 vim和vi几乎是一样的,唯一的区别就是当编辑一个文本时,使用vi不会显示颜色,而使用vim会显示颜色。 vim有三个模式:一般模式,编辑模式,命令模式。 系统最小化安装时没有安...

弓正 ⋅ 8分钟前 ⋅ 0

MyBatis源码解读之配置

1. 目的 本文主要介绍MyBatis配置文件解析,通过源码解读mybatis-config.xml(官方默认命名)、Mapper.xml 与Java对象的映射。 2. MyBatis结构 查看大图 MyBatis结构图,原图实在太模糊了,所以...

无忌 ⋅ 12分钟前 ⋅ 0

Ignite的jdbc与网格的连接方式的查询性能对比

环境: 数据量100万 Ignite2.5 Windows10 8g jdbc方式连接 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; i......

仔仔1993 ⋅ 27分钟前 ⋅ 0

收集自网络的wordpress 分页导航的代码教程(全网最全版)

wordpress 分页导航是用来切换文章的一个功能,添加了 wordpress 分页导航后,用户即可自由到达指定的页面数浏览分类文章,而这样的一个很简单功能却有很多朋友在用插件:WP-PageNavi,插件的...

Rhymo-Wu ⋅ 42分钟前 ⋅ 0

微服务 WildFly Swarm 入门

Hello World 就像前面章节中的其他框架一样,我们希望添加一些基本的 Hello-world 功能,然后在其上逐步添加更多的功能。让我们从在我们的项目中创建一个 HolaResources 开始。您可以使用您的...

woshixin ⋅ 49分钟前 ⋅ 0

Maven的安装和Eclipse的配置

1. 下载Maven 下载地址 2. 解压压缩包,放到自己习惯的硬盘中 此处我将其放到了 D:\Tools 目录下。 3. 配置环境变量 右键此电脑 -> 属性 -> 高级系统设置 -> 环境变量。 在系统变量中新建,变...

影狼 ⋅ 57分钟前 ⋅ 0

python pip使用国内镜像的方法

国内源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大学:http://......

良言 ⋅ 57分钟前 ⋅ 0

对于url变化的spa应该如何使用微信jssdk

使用vue单页面碰上微信jssdk config验证失败的坑。第一次成功 之后切换页面全部失败,找到了解决方法,第一次验证成功后保存验证信息 切换页面时验证信息直接拿来用,加一个wx.error() 失败时...

孙冠峰 ⋅ 今天 ⋅ 0

Spring Cloud Gateway 一般集成

SCF发布,带来很多新东西,不过少了点教程,打开方式又和以前的不一样,比如这个SCG,压根就没有入门指导,所以这里写一个,以备后用。 一、集成 pom.xml <dependency> <groupI...

kut ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部