Redis啟動之後警告資訊解決方案集錦
一些有關Redis相關問題的解決方案。
第1個案例:當我們啟動了Redis伺服器之後,會看到3個警告,如果沒看到,那是很好的,但是我看到了。看到了就不能不管,所以就好好的解決一下。我把這三個警告的資訊了,大家可以有更直接的感覺。效果如下:
1)、第一個警告資訊提示:The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128
2)、第二個警告資訊提示: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.
這兩個問題的解決方案很簡單,晚上也有類似的解決方案。
解決:
//針對這兩個問題,都要修改/etc/sysctl.conf檔案,在檔案末尾加入以下兩句:
net.core.somaxconn= 1024
vm.overcommit_memory = 1
3)、第三個警告資訊提示:WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command ‘echo never > /sys/kernel/mm/transparent_hugepage/enabled‘ as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
這個問題不容易解決,我搞了好久才搞定的,所以必須記錄下來,否則以後想看看都不容易。
大家想瞭解跟多情況,可以查看該部落格 http://docs.Fedoraproject.org/en-US/Fedora/21/html/System_Administrators_Guide/sec-GRUB_2_over_Serial_Console.html#sec-Configuring_GRUB_2 。
第一種方式:
我們開始第三個問題的解決吧,如果你也是grub2的linux系統,請通過以下步驟關閉大記憶體頁面。
步驟一、 編輯 /etc/default/grub,在GRUB_CMDLINE_LINUX加入選項 transparent_hugepage=never
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora/swap rd.lvm.lv=fedora/root rhgb quiet transparent_hugepage=never"
GRUB_DISABLE_RECOVERY="true"
步驟二、 重建grub設定檔
[root@linux ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
步驟三、 重啟你的系統
至此大功告成,如果你使用的是grub,請把選項寫入grub.conf檔案就好了。
步驟四、查詢hugepage狀態
[root@linux ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
第二種方式:
[root@linux ~]$ grep Huge /proc/meminfo
AnonHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
解決了,還是很高興的。其實這三個警告資訊已經提供瞭解決辦法,有的是臨時方法,有的是永久方法,只是第三個警告不是那麼直接好解決。
第2個案例:Redis啟動Sentinel出現警告的解決
Redis 3.0.7版本啟動時出現警告的解決辦法
7283:M 12 Mar 12:13:33.749 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
7283:M 12 Mar 12:13:33.749 # Server started, Redis version 3.0.7
7283:M 12 Mar 12:13:33.749 # 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.
7283:M 12 Mar 12:13:33.749 * The server is now ready to accept connections on port 6379
第1個警告(WARNING: The TCP backlog setting of 511 ......)解決辦法
方法1: 臨時設定生效: sysctl -w net.core.somaxconn = 1024
方法2: 永久生效: 修改/etc/sysctl.conf檔案,增加一行
net.core.somaxconn= 1024
然後執行命令
sysctl -p
補充:
net.core.somaxconn是linux中的一個kernel參數,表示socket監聽(listen)的backlog上限。
backlog是socket的監聽隊列,當一個請求(request)尚未被處理或建立時,他會進入backlog。
而socket server可以一次性處理backlog中的所有請求,處理後的請求不再位於監聽隊列中。
當server處理請求較慢,以至於監聽隊列被填滿後,新來的請求會被拒絕。
所以說net.core.somaxconn限制了接收新 TCP 串連偵聽隊列的大小。
對於一個經常處理新串連的高負載 web服務環境來說,預設的 128 太小了。大多數環境這個值建議增加到 1024 或者更多。
第2個警告(WARNING overcommit_memory is set to 0! ......)同樣也有兩個解決辦法
方法1: 臨時設定生效: sysctl -w vm.overcommit_memory = 1
方法2: 永久生效: 修改/etc/sysctl.conf檔案,增加一行
vm.overcommit_memory = 1
然後執行命令
sysctl -p
補充:
overcommit_memory參數說明:
設定記憶體配置策略(可選,根據伺服器的實際情況進行設定)
/proc/sys/vm/overcommit_memory
可選值:0、1、2。
0, 表示核心將檢查是否有足夠的可用記憶體供應用進程使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用進程。
1, 表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何。
2, 表示核心允許分配超過所有實體記憶體和交換空間總和的記憶體
注意:redis在dump資料的時候,會fork出一個子進程,理論上child進程所佔用的記憶體和parent是一樣的,比如parent佔用的記憶體為8G,這個時候也要同樣分配8G的記憶體給child,如果記憶體無法負擔,往往會造成redis伺服器的down機或者IO負載過高,效率下降。所以這裡比較最佳化的記憶體配置策略應該設定為 1(表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何)。
https://www.bkjia.com/Linux/2018-02/150957.htm