连接reids获取数据时提示

 Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands t

网上搜索资料http://www.cnblogs.com/qq78292959/p/3994349.html提示

在在/etc/sysctl.conf 添加一项 'vm.overcommit_memory = 1' 重启
or
运行命令'sysctl vm.overcommit_memory=1'

问题解决。

追究缘由:

简单地说:Redis在保存数据到硬盘时为了避免主进程假死,需要Fork一份主进程,然后在Fork进程内完成数据保存到硬盘的操作,如果主进程使用了4GB的内存,Fork子进程的时候需要额外的4GB,此时内存就不够了,Fork失败,进而数据保存硬盘也失败了。

Redis的数据丢失问题

网址:http://www.linuxidc.com/Linux/2012-07/66079.htm

Redis的数据回写机制分同步和异步两种

同步回写即SAVE命令,主进程直接向磁盘回写数据。在数据大的情况下会导致系统假死很长时间,所以一般不是推荐的。
异步回写即BGSAVE命令,主进程fork后,复制自身并通过这个新的进程回写磁盘,回写结束后新进程自行关闭。由于这样做不需要主进程阻塞,系统不会假死,一般默认会采用这个方法。

个人感觉方法2采用fork主进程的方式很拙劣,但似乎是唯一的方法。内存中的热数据随时可能修改,要在磁盘上保存某个时间的内存镜像必须要冻结。冻结就会导致假死。fork一个新的进程之后等于复制了当时的一个内存镜像,这样主进程上就不需要冻结,只要子进程上操作就可以了。

在小内存的进程上做一个fork,不需要太多资源,但当这个进程的内存空间以G为单位时,fork就成为一件很恐怖的操作。何况在16G内存的主机上fork 14G内存的进程呢?肯定会报内存无法分配的。更可气的是,越是改动频繁的主机上fork也越频繁,fork操作本身的代价恐怕也不会比假死好多少。

找到原因之后,直接修改内核参数vm.overcommit_memory = 1

Linux内核会根据参数vm.overcommit_memory参数的设置决定是否放行。

 如果 vm.overcommit_memory = 1,直接放行
vm.overcommit_memory = 0:则比较 此次请求分配的虚拟内存大小和系统当前空闲的物理内存加上swap,决定是否放行。
vm.overcommit_memory = 2:则会比较 进程所有已分配的虚拟内存加上此次请求分配的虚拟内存和系统当前的空闲物理内存加上swap,决定是否放行。

最新文章

  1. 使用Python中PIL图形库进行截屏
  2. x01.Weiqi.11: 神来之笔
  3. IE下只读INPUT键入BACKSPACE 后退问题(readonly='true')
  4. sql server create foreign key
  5. hdu---(5038)Grade(胡搞)
  6. 开启Microsoft SQL Management时,如果出现"未能加载包
  7. Android 图片选择器
  8. ECMAScript 发展历史
  9. android设置组件所占的比例
  10. Win8.1应用开发之动态磁贴
  11. wireshark过滤规则
  12. CSS3基础(2)—— 文字与字体相关样式、盒子类型、背景与边框相关样式、变形处理、动画功能
  13. 图数据库orientDB(1-1)SQL基本操作
  14. 记一次Monolog的BufferHandler使用
  15. 【python】spark+kafka使用
  16. linux 搭建rap记录
  17. 继承标签extend
  18. hexo发表博文的方式
  19. Notes of Daily Scrum Meeting(12.19)
  20. Linux——线程

热门文章

  1. 数据库表结构设计方法及原则(li)
  2. Android 防止控件被重复点击
  3. Android游戏开发实践(1)之NDK与JNI开发01
  4. Activity生命周期
  5. jqgrid+bootstrap样式实践
  6. Play Framework 项目遇到问题
  7. centos6.5无法访问网络
  8. jquery基础
  9. Redis与KV存储(RocksDB)融合之编码方式
  10. 利用联合双边滤波或引导滤波进行升采样(Upsampling)技术提高一些耗时算法的速度。