我从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
并按照建议重新启动但无法正常工作。我不知道该做什么。有人有想法吗?
答案 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)手册页,了解可用值的正确含义。