基础编程学习快乐每一天
首页
留言
Siddim.com
当前位置:
首页
>
编程知识库
>
后端开发知识
>
面试官:你遇到 Redis 线上连接超时一般如何处理?
面试官:你遇到 Redis 线上连接超时一般如何处理?
阅读
1
2020-05-23
一封报警邮件,大量服务节点
redis
响应超时。
又来,好烦。
redis
响应变慢,查看日志,发现大量
TimeoutException
。
大量
TimeoutException
,说明当前
redis
服务节点上已经堆积了大量的连接查询,超出
redis
服务能力,再次尝试连接的客户端,
redis
服务节点直接拒绝,抛出错误。
那到底是什么导致了这种情况的发生呢?
总结起来,我们可以从以下几方面进行关注:
一、redis 服务节点受到外部关联影响
redis
服务所在服务器,物理机的资源竞争及网络状况等。同一台服务器上的服务必然面对着服务资源的竞争,
CPU
,内存,固存等。
1、CPU资源竞争
redis
属于
CPU
密集型服务,对
CPU
资源依赖尤为紧密,当所在服务器存在其它
CPU
密集型应用时,必然会影响
redis
的服务能力,尤其是在其它服务对
CPU
资源消耗不稳定的情况下。
因此,在实际规划
redis
这种基础性数据服务时应该注意一下几点:
一般不要和其它类型的服务进行混部。
同类型的
redis
服务,也应该针对所服务的不同上层应用进行资源隔离。
说到
CPU
关联性,可能有人会问是否应该对
redis
服务进行
CPU
绑定,以降低由
CPU
上下文切换带来的性能消耗及关联影响?
简单来说,是可以的,这种优化可以针对任何
CPU
亲和性要求比较高的服务,但是在此处,有一点我们也应该特别注意:我们在 关于
redis
内存分析,内存优化 中介绍内存时,曾经提到过子进程内存消耗,也就是
redis
持久化时会
fork
出子进程进行
AOF
/
RDB
持久化任务。
对于开启了持久化配置的
redis
服务(一般情况下都会开启),假如我们做了
CPU
亲和性处理,那么
redis
fork
出的子进程则会和父进程共享同一个
CPU
资源,我们知道,
redis
持久化进程是一个非常耗资源的过程,这种自竞争必然会引发
redis
服务的极大不稳定。
2、内存不在内存了
关于
redis
内存分析,内存优化 开篇就讲过,
redis
最重要的东西,内存。
内存稳定性是
redis
提供稳定,低延迟服务的最基本的要求。
然而,我们也知道操作系统有一个
swap
的东西,也就将内存交换到硬盘。假如发生了
redis
内存被交换到硬盘的情景发生,那么必然,
redis
服务能力会骤然下降。
swap
发现及避免:
1)info memory:
关于
redis
内存分析,内存优化 中我们也讲过,
swap
这种情景,此时,查看
redis
的内存信息,可以观察到碎片率会小于
1
。这也可以作为监控
redis
服务稳定性的一个指标。
2)通过redis进程查看。
首先通过
info
server
获取进程
id
:
查看
redis
进程
swap
情况:
cat
/
proc
/
1686
/
smaps
确定交换量都为
0KB
或者
4KB
。
3)redis服务maxmemory配置。
关于
redis
内存分析,内存优化 中我们提到过,对
redis
服务必要的内存上限配置,这是内存隔离的一种必要。需要确定的是所有
redis
实例的分配内存总额小于总的可用物理内存。
4)系统优化:
另外,在最初的基础服务操作系统安装部署时,也需要做一些必要的前置优化,如关闭
swap
或配置系统尽量避免使用。
3、网络问题
网络问题,是一个普遍的影响因素。
1)网络资源耗尽
简单来说,就是带宽不够了,整个属于基础资源架构的问题了,对网络资源的预估不足,跨机房,异地部署等都会成为诱因。
2)连接数用完了
一个客户端连接对应着一个
TCP
连接,一个
TCP
连接在
LINUX
系统内对应着一个文件句柄,系统级别连接句柄用完了,也就无法再进行连接了。(更多面试题,欢迎 )
查看当前系统限制:
ulimit
-
n
设置:
ulimit
-
n
{
num
}
3)端口TCP backlog队列满了
linux
系统对于每个端口使用
backlog
保存每一个
TCP
连接。
redis
配置:
tcp
_
backlog
默认
511
高并发情境下,可以适当调整此配置,但需要注意的是,同时要调整系统相关设置。
系统修改命令:
echo
{
num
}&
gt
;/
proc
/
sys
/
net
/
core
/
somaxconn
查看因为队列溢出导致的连接绝句:
netstat
-
s
|
grep
overflowed
4)网络延迟
网络质量问题,可以使用
redis
-
cli
进行网络状况的测试:
延迟测试:
redis
-
cli
-
h
{
host
} -
p
{
port
} --
latency
采样延迟测试:
redis
-
cli
-
h
{
host
} -
p
{
port
} --
latency
-
history
默认
15s
一次
图形线上测试结果:
redis
-
cli
-
h
{
host
} -
p
{
port
} --
latency
-
dist
4)网卡软中断
单个网卡队列只能使用单个
CPU
资源问题。
二、redis 服务使用问题
1、慢查询
如果你的查询总是慢查询,那么必然你的使用存在不合理。
1)你的key规划是否合理
太长或太短都是不建议的,
key
需要设置的简短而有意义。
2)值类型选择是否合理。
hash
还是
string
,
set
还是
zset
,避免大对象存储。
线上可以通过
scan
命令进行大对象发现治理。
3)是否能够批查询
get
还是
mget
;是否应该使用
pipeline
。
4)禁止线上大数据量操作
2、redis 服务运行状况
查看
redis
服务运行状况:
redis
-
cli
-
h
{
host
} -
p
{
port
} --
stat
keys
:当前
key
总数;
mem
:内存使用;
clients
:当前连接
client
数;
blocked
:阻塞数;
requests
:累计请求数;
connections
:累计连接数
3、持久化操作影响
1)fork子进程影响
redis
进行持久化操作需要
fork
出子进程。
fork
子进程本身如果时间过长,则会产生一定的影响。
查看命令最近一次
fork
耗时:
info
stats
单位微妙,确保不要超过
1s
。
2)AOF刷盘阻塞
AOF
持久化开启,后台每秒进行
AOF
文件刷盘操作,系统
fsync
操作将
AOF
文件同步到硬盘,如果主线程发现距离上一次成功
fsync
超过
2s
,则会阻塞后台线程等待
fsync
完成以保障数据安全性。
3)THP问题
关于
redis
内存分析,内存优化 中我们讲过透明大页问题,
linux
系统的写时复制机制会使得每次写操作引起的页复制由
4KB
提升至
2M
从而导致写慢查询。如果慢查询堆积必然导致后续连接问题。
来源:
cnblogs
.
com
/
niejunlei
/
p
/
12900578
.
html
最近五期
【
89
期】面试官
5
连问一个
TCP
连接可以发多少个
HTTP
请求?
【
90
期】面试官:说一下使用
Redis
实现大规模的帖子浏览计数的思路
【
91
期】面试官:
Spring
用了哪些设计模式?说三种即可
【
92
期】面试官:你说你精通
Java
并发,那给我讲讲
J
.
U
.
C
吧
【
93
期】经典面试题:
Redis
内存满了怎么办?
? ~
以上数据来源于网络,如有侵权,请联系删除。
上一篇:
面试官:熟悉Redis吗,项目中你是如何对Redis内存进行优化的
下一篇:
盘点那些关于Nginx的常考面试题
评论
(0)
提交
类别
基础编程学习
HTML
PHP
Python
编程知识库
后端开发知识
热门文章
Java并发中的同步容器与并发容器,你了解多少?
Innodb中的事务隔离级别和锁的关系,难倒一半面试者!
SpringBoot + minio实现分片上传、秒传、续传
面试官:你知道消息队列如何保证数据不丢失吗?
JAVA知识 Java8新特性
面试官:谈谈为什么要限流,有哪些限流方案?
说说动态代理与静态代理区别
面试官:思考Tomcat 类加载器为什么要违背双亲委派模型?
boot-admin 基于SpringBoot的后台权限管理系统,可作为脚手架,用于快速搭建项目
SpringBoot+Vue+App+硬件实现智能家居系统项目