Redis巡检及优化建议
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 操作系统
建议关闭透明大页,提高Redis持久化效率,降低fork期间的内存消耗
建议设置为1,将SWAP使用倾向降到最低,注意不要设置为0
vm.overcommit_memory =0 在内存不足是无法分配物理内存,建议设置为 1
建议关闭syncookie,调高tcp_max_syn_backlog、somaxconn值,避免高并发情况下增大连接建立的开销、出现网络丢包
tcp_max_tw_buckets、tcp_tw_reuse、tcp_tw_recycle等参数当前为默认值,无需调整,若调整不当会导致TCP连接丢包
4.2.2 Redis服务
注:以下优化建议可能在当前Reids版本无法全部适用
建议使用Redis 5.0版本
降低RDB持久化触发的频率,或者在业务允许的情况下关闭RDB持久化
建议设置最大内存上限及内存淘汰策略,避免Redis当存储使用
建议增大Redis复制缓冲,保证网络抖动尽可能的不出发全量同步
建议将风险度较高的命令重命名,避免误操作影响Redis服务运行
建议增大慢日志记录条数
建议配置redis日志,logfile
sentinel建议:
建议配置日志文件,有助于问题的排查:logfile
建议根据业务情况调整down-after-milliseconds,现在是10ms,建议调整为30ms
Redis巡检及优化建议相关推荐
- redis提高oracle性能,redis性能分析与优化建议
首先,并不是说redis是内存应用就完全没性能问题,用的不好,还是会出现各种状况,例如RDB频繁,碎片太多等. 性能分析 info信息: 在redis-cli进入登录界面后,输入info all,或者 ...
- Redis系列(四)--内存淘汰机制(含单机版内存优化建议)
每台redis的服务器的内存都是有限的,而且也不是所有的内存都用来存储信息.而且redis的实现并没有在内存这块做太多的优化,所以实现者为了防止内存过于饱和,采取了一些措施来管控内存. 文章结构: ( ...
- redis的内存优化【转】
Redis所有的数据都在内存中,而内存又是非常宝贵的资源.对于如何优化内存使用一直是Redis用户非常关注的问题.本文让我们深入到Redis细节中,学习内存优化的技巧.分为如下几个部分: 一.redi ...
- 如何将 Redis 的内存优化?
作者 | 阿文 责编 | Elle 出品 | CSDN(ID:CSDNnews) 双十一.双十二都是买买买的节奏,但是你知道吗?像京东.淘宝这样的电子商城是如何扛得住几亿的请求吗? 下面是一个电商网站 ...
- NoSQL之 Redis配置与优化
NoSQL之 Redis配置与优化 前言 一.缓存概念 (1)系统缓存 ①buffer与cache (2)缓存保存位置及分层结构 ①DNS缓存 ②应用层缓存 ③数据层缓存 ④硬件缓存 二.关系数据库和 ...
- 【146期】面试官问:说一说 RabbitMQ 的几种工作模式和优化建议?
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方留言必回,有问必答! 每天 08:00 更新文章,每天进步一点点... 1.组 ...
- Linux 网络性能的 15 个优化建议【转自微信公众号菜鸟教程】
Linux 网络在性能方面有哪些优化手段可用呢? 本文将给出一些开发或者运维中的 Linux 网络性能优化建议. 要注意的是,每一种性能优化方法都有它适用或者不适用的应用场景,应当根据当前的项目现状灵 ...
- Linux 网络性能的 15 个优化建议
建议1:尽量减少不必要的网络 IO 我要给出的第一个建议就是不必要用网络 IO 的尽量不用. 是的,网络在现代的互联网世界里承载了很重要的角色.用户通过网络请求线上服务.服务器通过网络读取数据库中数据 ...
- Linux NoSQL 之 Redis 配置与优化
目录 Linux NoSQL 之 Redis 配置与优化 一.缓存 缓存概念 系统缓存 缓存保存位置及分层结构 DNS 缓存 应用层缓存 数据层缓存 Redis 硬件缓存 二.关系数据库和非关系数据库 ...
最新文章
- 蜻蜓resin服务器虚拟目录的设置
- javascript函数嵌套时arguments的问题
- python def main return,python中main()函数写法
- python面向对象和面向过程的区别_Python11-01_面向对象----面向对象和面向过程的区别...
- MiniGUI编程之Helloworld(一)
- Jerry Wang的微信小程序开发系列文章
- webpack.config.js和package.json
- Java基础之Collection和Map
- sublime用cmd窗口调试python_Sublime Text设置程序输出窗口为dos窗口
- 入门机却拥有旗舰级音质体验 Redmi红米8系列音频信息曝光
- Struts2 之 对xwork的理解
- 关于ODBC使用SQL语句和调用存储过程传递参数的使用方式说明
- 幼儿-综合素质【9】
- c语言程序设计诗句,诗歌大全
- 赴日工作之在留换签证
- Web API-添加Swagger,SQL Server,记录并导出到Excel
- linux内存相关命令汇总
- excel导入mysql 截断_Excel导入数据库时出现的文本截断问题解决方案
- effective C++ 第三版
- Linux下ISCSI共享存储服务