redis巡检

一 目的

定期主动执行数据库巡检可以及时有效的发现数据库潜在问题,降低数据库运行风险。本巡检报告是针对Redis数据库主机的系统资源、数据库运行状态指标采集分析,得出调整建议供用户决策评估

二 巡检项目

2.1 系统部分

巡检项 描述
磁盘空间可用率 评估系统磁盘空间是否充足。
内存使用率 评估系统内存是否充足。
swap分区配置 评估系统swap分区的使用权重
numa架构 评估是否开启numa导致性能问题
操作系统日志 评估系统是否存在运行异常
系统资源ulimit 评估数据库用户是否收到系统ulimit资源限制
操作系统版本/内核版本 评估是否会触发操作系统bug等问题
透明大页 评估系统是否开启透明大页(THP)特性
内存分配策略 评估系统是否可以充分分配物理内存
TCP连接 评估系统高并发下是否容易发生丢包问题

2.2 数据库部分

巡检项 描述
连续运行时长 可反映数据库连续的可用性
数据分布 反映不同**schema**的数据量
性能参数配置 反映数据库是否高效运行
慢日志 反应数据库是否高效运行
安全性参数配置 反映数据库是否存在安全风险
高可用架构 反映数据库架构及服务可用性
数据库复制状态 反映数据库复制同步状态及延迟情况
错误日志 反映数据库运行过程中是否存在异常

三巡检内容

3.1版本信息

3.1.1 系统版本

实例/ip 检查结果(操作系统版本) Normal/Notice/Warning 备注
Normal
Normal
Normal

3.1.2 Redis版本

实例 检查结果(redis版本) Normal/Notice/Warning 备注
Normal
Normal
Normal

3.2 系统参数

3.2.1 内存透明大页(THP)

巡检方式

# cat /sys/kernel/mm/transparent_hugepage/enabled
# cat /sys/kernel/mm/transparent_hugepage/defrag

巡检结果

实例(ip:port) 检查结果 Normal/Notice/Warning 备注
Warning 建议关闭,开启后fork子进程时会导致增加内存消耗
Warning
Warning

标准大页管理是预分配方式,而透明大页管理则是动态分配方式

为什么Transparent HugePages(透明大页)对系统的性能会产生影响.

  在khugepaged进行扫描进程占用内存,并将4 kPage交换为Huge Pages的这个过程中,对于操作的内存的各种分配活动都需要各种内存锁,直接影响程序的内存访问性能。并且,这个过程对于应用是透明的,

在应用层面不可控制,对于专门为4 k page优化的程序来说,可能会造成随机的性能下降现象。

3.2.2 内存策略

# cat /proc/sys/vm/overcommit_memory

巡检结果

实例(ip:port) 检查结果 Normal/Notice/Warning 备注
0 Warning 强烈建议设置为1,避免系统限制分配物理内存
0 Warning
0 Warning

overcommit_memory取值又三种分别为0, 1, 2 overcommit_memory=0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够 的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 overcommit_memory=1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。 overcommit_memory=2, 表示内核允许分配超过所有物理内存和交换空间总和的内存 overcommit_memory参数就是控制分配内存是否可以超过CommitLimit,默认是0,即启发式的overcommitting handle,会尽量减少swap的使用,root可以分配比一般用户略多的内存。1表示允许超过CommitLimit,2表示不允许超过CommitLimit

3.2.3 SWAP

巡检方式

# cat /proc/sys/vm/swappiness

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
30 Warning 强烈建议设置为1,避免使用 swap
30 Warning

异步任务中 将部分内存交互到磁盘,后续又需要使用,需要交换出来 导致任务执行变长,比如 垃圾回收时,需要遍历进程中维护的全局对象,但是若 交换出去了,还需要在交换进来

3.2.4 TCP SYN

巡检方式

# cat /proc/sys/net/ipv4/tcp_max_syn_backlog

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
2621440 Normal 建议设置为65535
2621440 Normal
2621440 Normal

服务因为队列满产生丢包,其中一个做法就是加大半/全连接队列的长度。 半连接队列长度Linux内核中,主要受tcp_max_syn_backlog影响 加大它到一个合适的值就可以

3.2.5 CP Accept

巡检方式

# cat /proc/sys/net/core/somaxconn

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
4096 Notice 建议设置为65535
4096 Notice
4096 Notice

定义了系统中每一个端口最大的监听队列的长度

该内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。

3.2.6 TCP Timewait

巡检方式

# cat /proc/sys/net/ipv4/tcp_max_tw_buckets
# cat /proc/sys/net/ipv4/tcp_tw_reuse
# cat /proc/sys/net/ipv4/tcp_tw_recycle

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
131072/1/1 notice 建议tcp_tw_reuse和/tcp_tw_recycle参数不同时开启
131072/1/1 notice
131072/1/1 notice

tcp_max_tw_buckets 该参数设置系统的TIME_WAIT的数量,如果超过默认值则会被立即清除。

tcp_tw_reuse 表示是否允许将处于TIME-WAIT状态的socket(TIME-WAIT的端口)用于新的TCP

tcp_tw_recycle 能够更快地回收TIME-WAIT套接字

3.2.7 TCP Keepalive

巡检方式

# cat /proc/sys/net/ipv4/tcp_keepalive_time
# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
# cat /proc/sys/net/ipv4/tcp_keepalive_probes

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
6/1/3 Notice 建议设置为120/15/3,加速回收无效连接
6/1/3 Notice
6/1/3 Notice

tcp_keepalive_time 控制 TCP/IP 尝试验证空闲连接是否完好的频率

需要更快地发现丢失了接收方,考虑减小这个值。 如果长期不活动的空闲连接出现次数较多,而丢失接收方的情况出现较少,需要提高该值以减少开销。

tcp_keepalive_time,在TCP保活打开的情况下,最后一次数据交换到TCP发送第一个保活探测包的间隔,即允许的持续空闲时长,或者说每次正常发送心跳的周期,默认值为7200s(2h)。

tcp_keepalive_intvl,在tcp_keepalive_time之后,没有接收到对方确认,继续发送保活探测包的发送频率,默认值为75s。

tcp_keepalive_probes 在tcp_keepalive_time之后,没有接收到对方确认,继续发送保活探测包次数,默认值为9(次)

3.2.8 TCP Syncookies

巡检方式

# cat /proc/sys/net/ipv4/tcp_syncookies

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
1 Notice 建议设置为0,关闭cookies特性
1 Notice
1 Notice
服务端半连接池满了以后是否开启syncookie机制
如果 SYN 半连接队列已满,默认会丢弃连接
开启 syncookies 功能就可以在不使用 SYN 队列的情况下成功建立连接。0 表示关闭该功能;
2 表示无条件开启功能;
1 则表示仅当 SYN 半连接队列放不下时,再启用它。
应当把 tcp_syncookies 设置为 1,仅在队列满时再启用。

3.3 安全

3.3.1 认证

巡检方式

redis> CONFIG GET requirepass

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
已开启 Normal 建议提高密码强度
已开启 Normal
已开启 Normal

3.3.2 复制认证

巡检方式

redis> CONFIG GET "masterauth"

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
已开启 Normal 建议提高密码强度
已开启 Normal
已开启 Normal

3.3.3 命令重命名

巡检方式

# cat redis.conf |grep -i rename-command

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
未开启 Notice 建议将风险较高的命令重命名避免误操作如 FLUSHDB FLUSHALL
未开启 Notice
未开启 Notice

3.4 持久化

3.4.1 RDB持久化

巡检方式

redis> CONFIG GET save

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
已开启(900 1 300 10 60 10000) Notice 当前使用默认持久化设置建议可根据业务需求做出调整
已开启(900 1 300 10 60 10000) Notice
已开启(900 1 300 10 60 10000) Notice

3.4.2 AOF 持久化

巡检方式

redis> CONFIG GET appendonly

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
No Notice 可根据持久化需求选择性开启
No Notice
No Notice

3.5 内存

3.5.1 当前内存使用情况

巡检方式

redis > info Memory  // used_memory_human

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
24.12M Normal 当前内存使用率接近机器内存的一半,需要注意,若服务器上还有其他占用内存的进程,redis在有fork等操作时可能出现问题
14.45M Normal
14.44M Normal

3.5.2 当前内存使用上限

巡检方式

redis > CONFIG GET maxmemory  // used_memory_human

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
未设置 Notice 视业务需求调整,建议设置为3-4G
未设置 Notice
未设置 Notice

3.5.3 内存淘汰策略

巡检方式

redis > CONFIG GET "maxmemory-policy"

volatile-lfu 是从所有配置了过期时间的键中驱逐使用频率最少的键

volatile-lru 是加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
Noeviction Notice 默认无删除策略,写满后禁止新的写入。建议根据键的使用调整为 其他删除策略。
Noeviction Notice
Noeviction Notice

3.5.4 内存碎片率

巡检方式

redis > INFO Memory  // mem_fragmentation_ratio

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
1.16 Normal 正常
1.42 Normal
1.21 Normal

3.6 SLOWLOG

巡检方式

redis > CONFIG GET "slowlog-max-len"
redis > CONFIG GET slowlog-log-slower-than

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
128/10000 Notice 建议增大慢日志条数,降低阈值
128/10000 Notice
128/10000 Notice

3.7 服务日志

巡检方式

redis > CONFIG GET "loglevel"

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
Notice Normal
Notice Normal
Notice Normal

3.8 超时时间

巡检方式

redis > CONFIG GET "timeout"

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
0 Normal 0 为无限制,建议设置为 1800 或 3600
0 Normal
0 Normal

3.9 复制缓冲

巡检方式

redis > CONFIG GET "repl-backlog-size"

巡检结果

实例 检查结果 Normal/Notice/Warning 备注
1048576(1M) Notice 复制及压缓冲区建议设置为1G,避免网络抖动后进行全量同步
1048576(1M) Notice
1048576(1M) Notice

四 巡检总结

IP地址 系统参数 安全 持久化 内存使用 SLOWLOG 日志 Timeout 复制
可优化调整 正常 可优化调整 正常 可优化调整 正常 可优化调整 可优化调整
可优化调整 正常 可优化调整 正常 可优化调整 正常 可优化调整 可优化调整
可优化调整 正常 可优化调整 正常 可优化调整 正常 可优化调整 可优化调整

4.1 风险评估

4.1.1 操作系统

4.1.2 redis服务

4.2 优化建议

4.2.1 操作系统

  1. 建议关闭透明大页,提高Redis持久化效率,降低fork期间的内存消耗

  2. 建议设置为1,将SWAP使用倾向降到最低,注意不要设置为0

  3. vm.overcommit_memory =0 在内存不足是无法分配物理内存,建议设置为 1

  4. 建议关闭syncookie,调高tcp_max_syn_backlog、somaxconn值,避免高并发情况下增大连接建立的开销、出现网络丢包

  5. tcp_max_tw_buckets、tcp_tw_reuse、tcp_tw_recycle等参数当前为默认值,无需调整,若调整不当会导致TCP连接丢包

4.2.2 Redis服务

注:以下优化建议可能在当前Reids版本无法全部适用

  1. 建议使用Redis 5.0版本

  2. 降低RDB持久化触发的频率,或者在业务允许的情况下关闭RDB持久化

  3. 建议设置最大内存上限及内存淘汰策略,避免Redis当存储使用

  4. 建议增大Redis复制缓冲,保证网络抖动尽可能的不出发全量同步

  5. 建议将风险度较高的命令重命名,避免误操作影响Redis服务运行

  6. 建议增大慢日志记录条数

  7. 建议配置redis日志,logfile

sentinel建议:

  1. 建议配置日志文件,有助于问题的排查:logfile

  2. 建议根据业务情况调整down-after-milliseconds,现在是10ms,建议调整为30ms

Redis巡检及优化建议相关推荐

  1. redis提高oracle性能,redis性能分析与优化建议

    首先,并不是说redis是内存应用就完全没性能问题,用的不好,还是会出现各种状况,例如RDB频繁,碎片太多等. 性能分析 info信息: 在redis-cli进入登录界面后,输入info all,或者 ...

  2. Redis系列(四)--内存淘汰机制(含单机版内存优化建议)

    每台redis的服务器的内存都是有限的,而且也不是所有的内存都用来存储信息.而且redis的实现并没有在内存这块做太多的优化,所以实现者为了防止内存过于饱和,采取了一些措施来管控内存. 文章结构: ( ...

  3. redis的内存优化【转】

    Redis所有的数据都在内存中,而内存又是非常宝贵的资源.对于如何优化内存使用一直是Redis用户非常关注的问题.本文让我们深入到Redis细节中,学习内存优化的技巧.分为如下几个部分: 一.redi ...

  4. 如何将 Redis 的内存优化?

    作者 | 阿文 责编 | Elle 出品 | CSDN(ID:CSDNnews) 双十一.双十二都是买买买的节奏,但是你知道吗?像京东.淘宝这样的电子商城是如何扛得住几亿的请求吗? 下面是一个电商网站 ...

  5. NoSQL之 Redis配置与优化

    NoSQL之 Redis配置与优化 前言 一.缓存概念 (1)系统缓存 ①buffer与cache (2)缓存保存位置及分层结构 ①DNS缓存 ②应用层缓存 ③数据层缓存 ④硬件缓存 二.关系数据库和 ...

  6. 【146期】面试官问:说一说 RabbitMQ 的几种工作模式和优化建议?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方留言必回,有问必答! 每天 08:00 更新文章,每天进步一点点... 1.组 ...

  7. Linux 网络性能的 15 个优化建议【转自微信公众号菜鸟教程】

    Linux 网络在性能方面有哪些优化手段可用呢? 本文将给出一些开发或者运维中的 Linux 网络性能优化建议. 要注意的是,每一种性能优化方法都有它适用或者不适用的应用场景,应当根据当前的项目现状灵 ...

  8. Linux 网络性能的 15 个优化建议

    建议1:尽量减少不必要的网络 IO 我要给出的第一个建议就是不必要用网络 IO 的尽量不用. 是的,网络在现代的互联网世界里承载了很重要的角色.用户通过网络请求线上服务.服务器通过网络读取数据库中数据 ...

  9. Linux NoSQL 之 Redis 配置与优化

    目录 Linux NoSQL 之 Redis 配置与优化 一.缓存 缓存概念 系统缓存 缓存保存位置及分层结构 DNS 缓存 应用层缓存 数据层缓存 Redis 硬件缓存 二.关系数据库和非关系数据库 ...

最新文章

  1. 蜻蜓resin服务器虚拟目录的设置
  2. javascript函数嵌套时arguments的问题
  3. python def main return,python中main()函数写法
  4. python面向对象和面向过程的区别_Python11-01_面向对象----面向对象和面向过程的区别...
  5. MiniGUI编程之Helloworld(一)
  6. Jerry Wang的微信小程序开发系列文章
  7. webpack.config.js和package.json
  8. Java基础之Collection和Map
  9. sublime用cmd窗口调试python_Sublime Text设置程序输出窗口为dos窗口
  10. 入门机却拥有旗舰级音质体验 Redmi红米8系列音频信息曝光
  11. Struts2 之 对xwork的理解
  12. 关于ODBC使用SQL语句和调用存储过程传递参数的使用方式说明
  13. 幼儿-综合素质【9】
  14. c语言程序设计诗句,诗歌大全
  15. 赴日工作之在留换签证
  16. Web API-添加Swagger,SQL Server,记录并导出到Excel
  17. linux内存相关命令汇总
  18. excel导入mysql 截断_Excel导入数据库时出现的文本截断问题解决方案
  19. effective C++ 第三版
  20. Linux下ISCSI共享存储服务

热门文章

  1. [面向对象与多线程综合实验]数据挖掘系统
  2. Forecasting: Principles and Practice读书笔记Chapter 3
  3. 关于二叉树重构的思索
  4. 2021第十届深圳国际智能家居展览会
  5. Thinking in java-35 String 字符串
  6. cout和std::cout的区别
  7. 9.1.4 用 send2trash 模块安全地删除
  8. 网络空间技能大赛A模块(乱)
  9. DNSPod十问德佑刘勇:传统地产业数字化转型会让10万人失业吗?
  10. pl/sql Developser 的官方网站地址