redis在實踐中的一些常見問題以及優化思路


1、fork耗時導致高並發請求延時

RDB和AOF的時候,其實會有生成RDB快照,AOF rewrite,耗費磁盤IO的過程,主進程fork子進程 fork的時候,子進程是需要拷貝父進程的空間內存頁表的,也是會耗費一定的時間的 一般來說,如果父進程內存有1個G的數據,那么fork可能會耗費在20ms左右,如果是10G~30G,那么就會耗費20 * 10,甚至20 * 30,也就是幾百毫秒的時間 info stats中的latest_fork_usec,可以看到最近一次form的時長 redis單機QPS一般在幾萬,fork可能一下子就會拖慢幾萬條操作的請求時長,從幾毫秒變成1秒 優化思路 fork耗時跟redis主進程的內存有關系,一般控制redis的內存在10GB以內,slave -> master,全量復制

2、AOF的阻塞問題

redis將數據寫入AOF緩沖區,單獨開一個現場做fsync操作,每秒一次

但是redis主線程會檢查兩次fsync的時間,如果距離上次fsync時間超過了2秒,那么寫請求就會阻塞

everysec,最多丟失2秒的數據

一旦fsync超過2秒的延時,整個redis就被拖慢

優化思路

優化硬盤寫入速度,建議采用SSD,不要用普通的機械硬盤,SSD,大幅度提升磁盤讀寫的速度

3、主從復制延遲問題

主從復制可能會超時嚴重,這個時候需要良好的監控和報警機制

在info replication中,可以看到master和slave復制的offset,做一個差值就可以看到對應的延遲量

如果延遲過多,那么就進行報警

4、主從復制風暴問題

如果一下子讓多個slave從master去執行全量復制,一份大的rdb同時發送到多個slave,會導致網絡帶寬被嚴重占用

如果一個master真的要掛載多個slave,那盡量用樹狀結構,不要用星型結構

5、vm.overcommit_memory

0: 檢查有沒有足夠內存,沒有的話申請內存失敗 1: 允許使用內存直到用完為止 2: 內存地址空間不能超過swap + 50% 如果是0的話,可能導致類似fork等操作執行失敗,申請不到足夠的內存空間 cat /proc/sys/vm/overcommit_memory echo "vm.overcommit_memory=1" >> /etc/sysctl.conf sysctl vm.overcommit_memory=1

6、swapiness

cat /proc/version,查看linux內核版本 如果linux內核版本<3.5,那么swapiness設置為0,這樣系統寧願swap也不會oom killer(殺掉進程) 如果linux內核版本>=3.5,那么swapiness設置為1,這樣系統寧願swap也不會oom killer 保證redis不會被殺掉 echo 0 > /proc/sys/vm/swappiness echo vm.swapiness=0 >> /etc/sysctl.conf

7、最大打開文件句柄

ulimit -n 10032 10032 自己去上網搜一下,不同的操作系統,版本,設置的方式都不太一樣

8、tcp backlog

cat /proc/sys/net/core/somaxconn echo 511 > /proc/sys/net/core/somaxconn

 


免責聲明!

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



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