redis 寫磁盤出錯 Can’t save in background: fork: Cannot allocate memory (轉)


查看 Redis 日志

發現系統在頻繁報錯:

[26641] 18 Dec 04:02:14 * 1 changes in 900 seconds. Saving…

[26641] 18 Dec 04:02:14 # Can’t save in background: fork: Cannot allocate memory

 

 

在小內存的進程上做一個fork,不需要太多資源,但當這個進程的內存空間以G為單位時,fork就成為一件很恐怖的操作。何況在16G內存的主機上fork 14G內存的進程呢?肯定會報內存無法分配的。更可氣的是,越是改動頻繁的主機上fork也越頻繁,fork操作本身的代價恐怕也不會比假死好多少。

找到原因之后,直接修改內核參數vm.overcommit_memory = 1

Linux內核會根據參數vm.overcommit_memory參數的設置決定是否放行。

  1.  如果 vm.overcommit_memory = 1,直接放行
  2. vm.overcommit_memory = 0:則比較 此次請求分配的虛擬內存大小和系統當前空閑的物理內存加上swap,決定是否放行。
  3. vm.overcommit_memory = 2:則會比較 進程所有已分配的虛擬內存加上此次請求分配的虛擬內存和系統當前的空閑物理內存加上swap,決定是否放行。
 
 
Arch linux設置vm.overcommit_memory 方法

永久性修改內核參數

/etc/sysctl.conf文件里面加入或者直接刪除也可以,因為它缺省值就是0

vm.overcommit_memory = 0

運行使之生效

#sysctl -p


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM