Redis在Ubuntu 14.04上

时间:2014-07-15 02:19:00

标签: redis ubuntu-14.04

我从ppa安装了redis 2.8.12,但无法启动。查看日志这就是我得到的:

[4886 | signal handler] (1405388991) Received SIGTERM, scheduling shutdown...
[4886] 14 Jul 20:49:51.561 # User requested shutdown...
[4886] 14 Jul 20:49:51.561 * Saving the final RDB snapshot before exiting.
[4886] 14 Jul 20:49:51.566 * DB saved on disk
[4886] 14 Jul 20:49:51.566 * Removing the pid file.
[4886] 14 Jul 20:49:51.566 # Redis is now ready to exit, bye bye...
[6726] 14 Jul 20:56:04.063 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
[6726] 14 Jul 20:56:04.063 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted.
[6726] 14 Jul 20:56:04.063 # Current maximum open files is 1024. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 2.8.12 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in stand alone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 6726
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

[6726] 14 Jul 20:56:04.064 # Server started, Redis version 2.8.12
[6726] 14 Jul 20:56:04.064 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
[6726] 14 Jul 20:56:04.064 * The server is now ready to accept connections on port 6379

我确实运行了命令sysctl vm.overcommit_memory=1并按照建议重新启动但无法正常工作。我不知道该做什么。有人有想法吗?

2 个答案:

答案 0 :(得分:7)

当您收到过度使用警告时,服务器已启动并正在运行。但是,当它将分叉另一个进程来保存数据库(RDB)或压缩AOF时,如果内存不考虑写时复制开销,则可能会出错。

这就是为什么Redis坚持将过度使用模式设置为1。

现在,当您使用sysctl更改内核参数时,它们仅在运行时更改。由于机器已重新启动,您刚刚丢失了此更改。如果您希望定义是永久性的,则还需要将其添加到文件/etc/sysctl.conf中

请注意,除了过度使用内存问题之外,您还遇到有关文件描述符数量的问题。这可以通过调整/etc/security/limits.conf文件(nofile参数)或在某些情况下调整会话的ulimit设置来增加。

答案 1 :(得分:1)

简单地做

sudo echo 1 > /proc/sys/vm/overcommit_memory

它会解决你的错误。 :)

  

在Linux下,后台保存失败并出现fork()错误,即使我有大量的空闲内存!

     

简答:echo 1> / proc / sys / vm / overcommit_memory:)

     

现在是长篇:

     

Redis后台保存模式依赖于现代操作系统中fork的copy-on-write语义:Redis forks(创建子进程),它是父进程的精确副本。子进程将数据库转储到磁盘上,最后退出。理论上,孩子应该使用尽可能多的内存作为副本,但实际上由于大多数现代操作系统实现的写时复制语义,父和子进程将共享公共内存页。仅当页面在子项或父项中发生更改时,页面才会重复。由于理论上所有页面都可能在子进程保存时发生变化,因此Linux无法预先知道子进程将占用多少内存,因此如果将overcommit_memory设置设置为零,则除非有尽可能多的自由,否则fork将失败RAM需要真正复制所有父内存页面,结果是如果你有一个3 GB的Redis数据集和2 GB的可用内存,它将失败。   将overcommit_memory设置为1表示Linux放松并以更乐观的分配方式执行fork,这确实是你想要的Redis。   理解Linux虚拟内存如何工作以及overcommit_memory和overcommit_ratio的其他替代方案的一个很好的资源来自Red Hat Magazine,#34;了解虚拟内存"。请注意,本文有overcommit_memory反向的1和2配置值:请参阅proc(5)手册页,了解可用值的正确含义。

来源:http://redis.io/topics/faq