Redis 3.x——Linux配置优化
inux配置优化1、内存分配控制1.1、vm.overcommit_memory1.2、获取和设置1.3、最佳实践2、swappiness2.1、参数说明2.2、设置方法2.3、如何监控swap3、THP4、OOM killer5、使用NTP6、ulimit7、TCP backlog通常来看Redis开发和运维人员更加关注的是Redis本身的一些配置优化例如AOF和RDB的配置优化、数据结构的配置优化等但是对于操作系统是否需要针对Redis做一些配置优化不甚了解或者不太关心。然而事实证明一个良好的系统操作配置能够为Redis服务良好运行保驾护航。1、内存分配控制1.1、vm.overcommit_memoryRedis在启动时可能会出现这样的日志# WARNING overcommit_memory is set to 0! Background save may fail under low memorycondition. To fix this issueaddvm.overcommit_memory 1to /etc/sysctl.conf andthenrebootor run thecommandsysctl vm.overcommit_memory1forthis to take effect.在分析这个问题之前首先要弄清楚什么是overcommitLinux操作系统对大部分申请内存的请求都回复yes以便能运行更多的程序。因为申请内存后并不会马上使用内存这种技术叫做overcommit。如果Redis在启动时有上面的日志说明vm.overcommit_memory0Redis提示把它设置为1。vm.overcommit_memory用来设置内存分配策略有三个可选值如表所示。本节的可用内存代表物理内存与swap之和。日志中的Background save代表的是bgsave和bgrewriteaof如果当前可用内存不足操作系统应该如何处理fork操作。如果vm.overcommit_memory0代表如果没有可用内存就申请内存失败对应到Redis就是执行fork失败在Redis的日志会出现Cannot allocate memoryRedis建议把这个值设置为1是为了让fork操作能够在低内存下也执行成功。1.2、获取和设置获取# cat /proc/sys/vm/overcommit_memory0设置echovm.overcommit_memory1/etc/sysctl.confsysctlvm.overcommit_memory11.3、最佳实践Redis设置合理的maxmemory保证机器有20%~30%的闲置内存。集中化管理AOF重写和RDB的bgsave。设置vm.overcommit_memory1防止极端情况下会造成fork失败。2、swappiness2.1、参数说明swap对于操作系统来比较重要当物理内存不足时可以将一部分内存页进行swap操作已解燃眉之急。但世界上没有免费午餐swap空间由硬盘提供对于需要高并发、高吞吐的应用来说磁盘IO通常会成为系统瓶颈。在Linux中并不是要等到所有物理内存都使用完才会使用到swap系统参数swppiness会决定操作系统使用swap的倾向程度。swappiness的取值范围是0~100swappiness的值越大说明操作系统可能使用swap的概率越高swappiness值越低表示操作系统更加倾向于使用物理内存。swap的默认值是60了解这个值的含义后有利于Redis的性能优化。下表对swappiness的重要值进行了说明。OOM(Out Of Memory)killer机制是指Linux操作系统发现可用内存不足时强制杀死一些用户进程非内核进程​来保证系统有足够的可用内存进行分配。从表中可以看出swappiness参数在Linux3.5版本前后的表现并不完全相同Redis运维人员在设置这个值需要关注当前操作系统的内核版本。2.2、设置方法swappiness设置方法如下echo{bestvalue}/proc/sys/vm/swappiness但是上述方法在系统重启后就会失效为了让配置在重启Linux操作系统后立即生效只需要在/etc/sysctl.conf追加vm.swappiness{bestvalue}即可。echovm.swappiness{bestvalue}/etc/sysctl.conf需要注意/proc/sys/vm/swappiness是设置操作/etc/sysctl.conf是追加操作。2.3、如何监控swap(1)查看swap的总体情况Linux提供了free命令来查询操作系统的内存使用情况其中也包含了swap的相关使用情况。下面是某台Linux服务器执行free–m以兆为单位的结果其中需要重点关注的是最后一行的swap统计从执行结果看swap一共有4095MB使用了0MB空闲4095MB。total usedfreeshared buffers cached Mem:643853157332812050510026-/ buffers/cache:2104043344Swap:409504095在另一台Linux服务器同样执行free-m这台服务器开启了8189M swap其中使用了5241MB。total usedfreeshared buffers cached Mem:2409682371585901362483-/ buffers/cache:561718479Swap:818952412947(2)实时查看swap的使用Linux提供了vmstat命令查询系统的相关性能指标其中包含负载、CPU、内存、swap、IO的相关属性。但其中和swap有关的指标是si和so它们分别代表操作系统的swap in和swap out。下面是执行vmstat1每隔一秒输出的效果可以看到si和so都为0代表当前没有使用swap。# vmstat 1procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpdfreebuff cache si so bi boincs us syidwa st1003359346851765610271928000100809100400335945165176561027192800001060696471019000100335943925176561027192800001149010244111890060033594292517656102719280003612406106811318700(3)查看指定进程的swap使用情况Linux操作系统中/proc/{pid}目录是存储指定进程的相关信息其中/proc/{pid}/smaps记录了当前进程所对应的内存映像信息这个信息对于查询指定进程的swap使用情况很有帮助。下面以一个Redis实例进行说明。通过info server获取Redis的进程号process_idredis-cli-hip-pport info server|grepprocess_id process_id:986通过cat/proc/986/smaps查询Redis的smaps信息由于有多个内存块信息这里只输出一个内存块镜像信息进行观察2aab0a400000-2aab35c00000 rw-p 2aab0a400000 00:000Size:712704kB Rss:617872kB Shared_Clean:0kB Shared_Dirty:0kB Private_Clean:15476kB Private_Dirty:602396kB Swap:58056kB Pss:617872kB其中Swap字段代表该内存块存在swap分区的数据大小。通过执行如下命令就可以找到每个内存块镜像信息中这个进程使用到的swap量通过求和就可以算出总的swap用量cat/proc/986/smaps|grepSwap Swap:0kB Swap:0kB… Swap:0kB Swap:478320kB… Swap:624kB Swap:0kB如果Linux3.5vm.swapniess1否则vm.swapniess0从而实现如下两个目标物理内存充足时候使Redis足够快。物理内存不足时候避免Redis死掉如果当前Redis为高可用死掉比阻塞更好​。3、THPRedis在启动时可能会看到如下日志WARNING you have Transparent Huge Pages(THP)support enabledinyour kernel. This will create latency and memory usage issues with Redis. To fix this issue run thecommandecho never /sys/kernel/mm/transparent_hugepage/enabledas root, andaddit to your /etc/rc.localinorder to retain the setting after a reboot. Redis must be restarted after THP is disabled.从提示看Redis建议修改Transparent Huge Pages(THP)的相关配置Linux kernel在2.6.38内核增加了THP特性支持大内存页(2MB)分配默认开启。当开启时可以降低fork子进程的速度但fork操作之后每个内存页从原来4KB变为2MB会大幅增加重写期间父进程内存消耗。同时每次写命令引起的复制内存页单位放大了512倍会拖慢写操作的执行时间导致大量写操作慢查询例如简单的incr命令也会出现在慢查询中。因此Redis日志中建议将此特性进行禁用禁用方法如下echonever/sys/kernel/mm/transparent_hugepage/enabled为了使机器重启后THP配置依然生效可以在/etc/rc.local中追加echonever/sys/kernel/mm/transparent_hugepage/enabled。在设置THP配置时需要注意有些Linux的发行版本没有 将THP放到/sys/kernel/mm/transparent_hugepage/enabled中例如Red Hat6以上的THP配置放到/sys/kernel/mm/redhat_transparent_hugepage/enabled中。而Redis源码中检查THP时把THP位置写死FILE *fpfopen(/sys/kernel/mm/transparent_hugepage/enabled,r);if(!fp)return0;所以在发行版中虽然没有THP的日志提示但是依然存在THP所带来的问题echonever/sys/kernel/mm/redhat_transparent_hugepage/enabled4、OOM killerOOM killer会在可用内存不足时选择性地杀掉用户进程它的运行规则是怎样的会选择哪些用户进程“下手”呢OOM killer进程会为每个用户进程设置一个权值这个权值越高被“下手”的概率就越高反之概率越低。每个进程的权值存放在/proc/{progress_id}/oom_score中这个值是受/proc/{progress_id}/oom_adj的控制oom_adj在不同的Linux版本中最小值不同可以参考Linux源码中oom.h从-15到-17​。当oom_adj设置为最小值时该进程将不会被OOM killer杀掉设置方法如下。echo{value}/proc/${process_id}/oom_adj对于Redis所在的服务器来说可以将所有Redis的oom_adj设置为最低值或者稍小的值降低被OOM killer杀掉的概率forredis_pidin$(pgrep-fredis-server)doecho-17/proc/${redis_pid}/oom_adjdone有关OOM killer的详细细节可以参考Linux源码mm/oom_kill.c中oom_badness函数。oom_adj参数只能起到辅助作用合理地规划内存更为重要。通常在高可用情况下被杀掉比僵死更好因此不要过多依赖oom_adj配置。5、使用NTPNTPNetwork Time Protocol网络时间协议是一种保证不同机器时钟一致性的服务。我们知道像RedisSentinel和Redis Cluster这两种功能需要多个Redis节点的类型可能会涉及多台服务器。虽然Redis并没有对多个服务器的时钟有严格要求但是假如多个Redis实例所在的服务器时钟不一致对于一些异常情况的日志排查是非常困难的例如Redis Cluster的故障转移如果日志时间不一致对于我们排查问题带来很大的困扰注但不会影响集群功能集群节点依赖各自时钟​。一般公司里都会有NTP服务用来提供标准时间服务从而达到纠正时钟的效果如图所示​为此我们可以每天定时去同步一次系统时间从而使得集群中的时间保持统一。例如每小时的同步1次NTP服务0* * * * /usr/sbin/ntpdate ntp.xx.com/dev/null216、ulimit在Linux中可以通过ulimit查看和设置系统当前用户进程的资源数。其中ulimit-a命令包含的open files参数是单个用户同时打开的最大文件个数# ulimit –a…max locked memory(kbytes, -l)64max memory size(kbytes, -m)unlimitedopenfiles(-n)1024pipe size(512bytes, -p)8…Redis允许同时有多个客户端通过网络进行连接可以通过配置maxclients来限制最大客户端连接数。对Linux操作系统来说这些网络连接都是文件句柄。假设当前open files是4096那么启动Redis时会看到如下日志# You requested maxclients of 10000 requiring at least 10032 max file descriptors.# Redis can’t set maximum open files to 10032 because of OS error: Operation not permitted.# Current maximum open files is 4096. Maxclients has been reduced to 4064 to compensateforlow ulimit. If you need higher maxclients increase ‘ulimit –n’.日志解释如下第一行Redis建议把open files至少设置成10032那么这个10032是如何来的呢因为maxclients默认是10000这些是用来处理客户端连接的除此之外Redis内部会使用最多32个文件描述符所以这里的100321000032。第二行Redis不能将open files设置成10032因为它没有权限设置。第三行当前系统的open files是4096所以将maxclients设置成4096-324064个如果你想设置更高的maxclients请使用ulimit-n来设置。从上面的三行日志分析可以看出open files的限制优先级比maxclients大。Open files的设置方法如下ulimit–Sn{max-open-files}7、TCP backlogRedis默认的tcp-backlog值为511可以通过修改配置tcp-backlog进行调整如果Linux的tcp-backlog小于Redis设置的tcp-backlog那么在Redis启动时会看到如下日志# WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn issetto the lower value of128.查看方法# cat /proc/sys/net/core/somaxconn128修改方法echo511/proc/sys/net/core/somaxconn

相关新闻

Grammarly Premium Cookie智能采集系统:技术架构与自动化实践指南

Grammarly Premium Cookie智能采集系统:技术架构与自动化实践指南

Grammarly Premium Cookie智能采集系统:技术架构与自动化实践指南 【免费下载链接】autosearch-grammarly-premium-cookie 免费白嫖使用Grammarly Premium高级版 项目地址: https://gitcode.com/gh_mirrors/au/autosearch-grammarly-premium-cookie 在数字化…

2026/9/23 8:43:13 阅读更多 →
致敬一线工作者:一份实用的致敬活动策划与PPT制作指南

致敬一线工作者:一份实用的致敬活动策划与PPT制作指南

如何策划一场走心的致敬活动、怎样用二狗PPT快速生成致敬演示文稿?本教程从方案构思、内容编排到PPT制作,一步步教你表达对一线工作者的敬意,干货满满。 致敬这件事,说大不大,说小也不小。尤其当对象是那些常年深耕一线…

2026/9/23 1:57:35 阅读更多 →
孤能子视角:智能模型三层架构关系编织

孤能子视角:智能模型三层架构关系编织

(在以下的与AI互动中,在EIS理论约束下,DeepSeek叫信兄,Kim叫酷兄,我呢叫水兄。姑且当科幻小说看) (已由信兄整理成文)孤能子视角:智能模型三层架构关系编织 ——从功能分工到编织次数与振动模式 EIS理论库硅基演化分册…

2026/9/23 12:15:03 阅读更多 →

最新新闻

九联UNT403A/413A免拆刷机:晶晨S905L3安卓9.0重装实战

九联UNT403A/413A免拆刷机:晶晨S905L3安卓9.0重装实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 7:01:26 阅读更多 →
大厂还是小厂?一文讲透两种职业环境的真实差异与取舍

大厂还是小厂?一文讲透两种职业环境的真实差异与取舍

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 7:01:26 阅读更多 →
ClawHub Convex 热路径性能审计指南:读放大、反规范化与索引滚动的实战规则

ClawHub Convex 热路径性能审计指南:读放大、反规范化与索引滚动的实战规则

后端前端AI 技能AI 插件搜索引擎 【免费下载链接】clawhub Skill Plugin Registry for OpenClaw 项目地址: https://gitcode.com/gh_mirrors/mo/clawhub 点击查看 免费下载 导读 本文是 ClawHub 仓库中 Convex 性能审计技能(.agents/skills/convex-pe…

2026/9/25 7:01:26 阅读更多 →
STM32培训值不值?从自学到报班的避坑指南

STM32培训值不值?从自学到报班的避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 7:01:26 阅读更多 →
PNG文件结构逆向解析:从IHDR、IDAT到RGB隐写实战

PNG文件结构逆向解析:从IHDR、IDAT到RGB隐写实战

1. 这不是拼图游戏,是PNG结构的逆向解剖现场“攻防世界_难度8_happy_puzzle”——光看标题,你可能以为这是个拖拽式益智小游戏,点开才发现:没有UI界面,没有交互按钮,只有一张看似普通的PNG图片,…

2026/9/25 7:01:26 阅读更多 →
NodeGui MouseEventSource 枚举深度解析:识别合成鼠标事件与 Qt 事件来源

NodeGui MouseEventSource 枚举深度解析:识别合成鼠标事件与 Qt 事件来源

桌面应用跨平台 【免费下载链接】nodegui A library for building cross-platform native desktop applications with Node.js and CSS 🚀. React NodeGui : https://react.nodegui.org and Vue NodeGui: https://vue.nodegui.org 项目地址: https://git…

2026/9/25 7:00:26 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →