最近使用Redis,由于它属于内存数据库,所以调优都集中到了内存上。
根据 Redis官方说法 :
需要将 vm.overcommit 设置为1
sysctl vm.overcommit_memory=1
确保设置了一定量的swap,最好和内存一样大,否则内核的OOM(out-of-memory)killer会干掉Redis进程
若Redis是大量写入的应用,持久化的RDB或者AOF会按比例使用,或 很有可能使用redis使用量的一样多的内存 .
使用和Redis一样多的内存做持久化,那我岂不是都得让一半的内存出来给它?
还有那个overcommit是几个意思也不解释一样?搞砸了其他进程肿么办?
好吧,得研究一下内存是如何管理的:
内核会将物理内存分割成动态虚拟的内存页(page),然后在malloc时按overcommit_memory和overcommit_ratio的设置来确定是否允许分配虚拟内存页。
翻看Linux Kernel的文档/资料才发现,有三种值:
overcommit_memory=0 ,默认,智能超发,每次要求分配内存时,kernel都会比较请求的空间和空余的空间是否足以分配
overcommit_memory=1 ,请求分配内存时, 永远 假装还有足够的内存
overcommit_memory=2 ,不允许超发内存,即允许分配的大小小于
overcommit_ratio*物理内存+swap大小
好吧,Redis要大家假装还有空余内存…也就是说会有很大的几率触发Swap造成性能急剧下降,不过, 性能下降总比不能用好 。
说到swap,大家肯定给Redis服务器设定过swappiness=0,然后祈祷奇迹的发生,但是还是触发了swap。 为什么呢?
首先,Linux十分注重读写性能,尽量避免磁盘IO,你从磁盘上读取的文件会被放入内存,就算程序结束了,还是存在的,这部分内存被称为file buffer(或者file page),是swap重点照顾的回收对象。 其次,Linux上的用户态进程所有页(也就是redis运行时占用的)也是可以回收的。
其实,swap的触发机制是这样的:
根据swap倾向(swap_tendency)决定回收用户态页还是file buffer,最后把LRU队列中用得最少的放入swap空间中。
摘自LWN
以下是内核计算其 “swap倾向”的公式:
swap_tendency = mapped_ratio/2 + distress + vm_swappiness
其中:
distress 值是内核在释放内存时遇到的问题数。当内核第一次决定收回内存页面时, distress将为0;尝试次数越多,这个值也越大。
mapped_ratio值是 mapped page与总page
比例,即
mapped ratio = (nr mapped * 100) / total memory
nr_mapped可以从下面的命令行获得
grep nr_mapped /proc/vmstat
vm_swappiness 就是大家设定的swappniness值
当swap_tendency超过100时,swap就开始收集最近较少用的页。
而且swappiness设置为0,PRFA就不会回收用户态页,
设置为100时,总是回收用户态页,当然这不是我们想看到的。
最后回到之前的问题,怎么避免触发swap? 其实调整好swapiness之后,只需要监测/proc/zoneinfo中的pages free/high 之间的差值即可,high是当前zone中计算出来的高水位值,当pages free低于pages high才会触发swap回收页,就是这么简单啦~
实在担心的话可以用
redis-server --test-memory 需要测试的内存(MB)
测试一下,系统就会在给定的内存下跑测试。
分享到:
相关推荐
本书深入浅出地介绍了Redis的5种数据类型,并通过多个实用示例展示了...第三部分对Redis用户经常会遇到的一些问题进行了介绍,讲解了降低Redis内存占用的方法、扩展Redis性能的方法以及使用Lua语言进行脚本编程的方法。
2.Redis的内存优化 3.Redis的Linux系统优化 4.Redis客户端常见异常分析 6.Redis无限全量复制问题分析与优化
在Linux上多实例部署,实例个数等于处理器个数,各实例最大内存直接为本机物理内存,避免单个实例内存撑爆 把海量数据(10亿+)根据key哈希(Crc16/Crc32)存放在多个实例上,读写性能成倍增长 采用二进制序列化,而...
我们不仅要选择适合自己口味的NoSQL数据库,比如基于内存的Memcache或Redis,更适合企业级架构的Cassandra或HBase,同时,针对Linux服务器的优化也必不可少。另外,还有一个问题需要探讨。我们在尝试NoSQL数据库的...
注意2:目前的版本不会再继续进行新功能开发,只会进行BUG修复,会拉一个分支基于jdk11和javafx11重构项目,重构后会减少内存占用50%左右,启动速度优化到1-3s启动 注意3:v1.1.0以后自己打包的,运行会报错误,因为...
内存:包括随机访问内存 (RAM) 和只读存储器 (ROM),用于临时或永久地存储程序和数据供CPU快速访问。 存储设备:如硬盘、固态硬盘 (SSD)、光盘驱动器等,用于长期保存大量的程序和数据。 输入/输出设备:如键盘、...
JVM:涉及常用的内存泄漏、内存溢出、MAT、jstack的分析案例 Linux:涉及开发中常用的命令,如telnet、curl、wget、netstat Redis:集群底层原理、持久化内部机制等 多线程、集合等 内容过多,就不一一例举。整理...
├─补充1:拔高课程(Redis3.0持久化、集群、MySQL5.6优化、Tomcat7优化) │ │ 打开必读.txt │ │ │ ├─课前资料 │ │ ├─MySQL5.6优化 │ │ │ MySql5.6性能优化.docx │ │ │ │ │ ├─Redis集群 │ ...
mdserver-web 0.8.6 简单Linux面板,感谢BT.CN写出如此好的web管理软件。...Redis - 一个高性能的key-value数据库。 CSVN - 最流行的SVN代码共享管理软件。 PureFtpd - 一款专注于程序健壮和软件安全
事务\事务隔离级别\Mysql默认隔离级别\串行化\存储引擎Innodb\Myisam\Inodb锁机制\MVCC\B树索引\哈希索引\聚簇索引\非聚簇索引\回表查询和覆盖索引\Explain语句\SQL语句的执行过程\范式\聚合函数\SQL优化\HTTP\多态\...
异步数据传输框架Ajax ⽂件的上传下载 1.3JavaEE框架 系统整体分层解耦框架spring 轻量级Web框架springmvc 轻量级持久层框架mybatis 服务器操作系统Linux 内存数据库Redis 项⽬架构、jar包管理⼯具Maven 1.4JavaEE⾼...
1、具备扎实的编程基础,精通Java语言,熟悉JVM,内存模型,并发编程 2、可以灵活运用设计模式,如:单例、工厂、策略、责任链、模板方法等设计模式进行项目开发 3、熟悉Spring、 SpringMVC、SpringBoot、Spring...
16 27道顶尖的Java多线程、锁、内存模型面试题!.pdf 17 29道常见的Spring面试题!.pdf 18 30个Java经典的集合面试题!.pdf 19 36道面试常问的MyBatis面试题!.pdf 20 40道常问的Java多线程面试题!.pdf 21 55道BAT...
CPPNotes 如下是 C++ 后台研发技术路线以及知识点,这里有很多细节,还需要不断完善。...linux下操作命令以及工具 工作中常用的linux 命令 编译工具GCC 调试工具GDB 性能优化工具Perf 内存泄露检查工具Valgrind
java二次微信开发源码真棒明星 ...是一个内存数据库,持久存在于磁盘上。 数据模型是键值,但支持许多不同类型的值:字符串、列表、集合、排序集合、哈希、流、HyperLogLogs、位图。 C# - 自由软件媒
linux 代码控制 自动化代码检查 sonar 代码规范 阿里巴巴Java开发规范手册 UMPAY——编码规范 日志规范 异常规范 网络 协议 TCP/IP HTTP hession file HTTPS 负载均衡 容器 JBOSS tomcat resin...
已经部署到 Linux+mysql+nginx+uwsgi 环境中,下面会有教程特性基于蓝图创建红图,更好细分模块与视图函数稍微完善的后台权限自定义登陆检测装饰器与权限检测装饰器多线程异步增加评论与访问数量结合redis实现弹幕发送...
java版sm4源码真棒明星 我的 GitHub 星星的精选列表! 生成者 内容 集会 - 用于命令和月球模块的原始阿波罗 11 ...Linux ...Linux ...设计和优化的开源大数据平台。...Redis 是一个内存数据库,持久存在于磁盘
(Spring+SpringMVC+MyBatis+Lucene+Redis+MAVEN) 计算机硬件系统: 计算机硬件系统是构成计算机物理实体的所有部件的集合,包括核心组件以及外设。其主要组成部分包括: 中央处理单元 (CPU):作为计算机的...