一台機器如果記憶體用完,在進行bgsave時,可能會報錯。錯誤資訊大概如下:
當執行redis的bgsave指令時,redis會fork一個程序把redis中的記憶體資料寫入磁盤。這樣的好處是,copy on write,有效的節省了記憶體占用。但是,bgsave時,如果有資料變更,一樣需要申請記憶體。當申請記憶體時,如果發現記憶體不夠,可能就會報上面的錯誤。
參數vm.overcommit_memory控制着linux的記憶體配置設定政策。
這個參數有三個值: 0 1 2
0 表示啟發式處理。會盡量減少swap的使用,root可以配置設定比一般使用者略多的記憶體。預設值。
1 表示一直允許overcommit。一般使用者科學計算。
2 表示不允許超過commitlimit值。根據vm.overcommit_ratio定義的值,允許配置設定超出實體記憶體加上交換記憶體的請求。vm.overcommit_ratio參數是一個百分比,加上記憶體量決定記憶體可以超量配置設定多少記憶體。例如,vm.overcommit_ratio值為50,而記憶體有1gb,那麼這意味着在記憶體配置設定請求失敗前,加上交換記憶體,記憶體将允許高達1.5gb的記憶體配置設定請求。
之是以允許申請大于記憶體的malloc,其中一個原因是,malloc後,并不一定馬上使用。
相關英文文檔閱讀
<a href="http://www.win.tue.nl/~aeb/linux/lk/lk-9.html#ss9.6" target="_blank">overcommit_memory</a>
<a href="http://www.win.tue.nl/~aeb/linux/lk/lk-9.html#ss9.6" target="_blank">overcommit and oom</a>
很簡單,按提示的操作(将vm.overcommit_memory 設為1)即可:
有三種方式修改核心參數,但要有root權限:
(1)編輯/etc/sysctl.conf ,改vm.overcommit_memory=1,然後sysctl -p 使配置檔案生效
(2)sysctl vm.overcommit_memory=1
(3)echo 1 > /proc/sys/vm/overcommit_memory
設定完後,可以通過 sysctl -n vm.overcommit_memory 驗證設定是否生效。
當linux發現記憶體不足時,會發生oom killer(oom=out-of-memory)。它會選擇殺死一些程序(使用者态程序,不是核心線程),以便釋放記憶體。
當oom-killer發生時,linux會選擇殺死哪些程序?選擇程序的函數是oom_badness函數(在mm/oom_kill.c中),該函數會計算每個程序的點數(0~1000)。點數越高,這個程序越有可能被殺死。每個程序的點數跟oom_score_adj有關,而且oom_score_adj可以被設定(-1000最低,1000最高)。
grep -i commit /proc/meminfo
看到commitlimit和committed_as參數。
commitlimit是一個記憶體配置設定上限,commitlimit = 實體記憶體 * overcommit_ratio(預設50,即50%) + swap大小
committed_as是已經配置設定的記憶體大小。