redis單實例配置高併發

獲取服務器支持的最大文件描述符數(該 值會限制你的最大文件打開數,對咱們而言,關心的是可供打開的socket的數量)linux

linux機器可使用 ulimit 命令獲取你關心的一些指數redis

能夠看到支持的最大文件描述符數是4000數據庫

也能夠直接經過 ulimit -n 獲取文件描述符數windows

還能夠經過該命令修改最大文件描述符數api

在咱們線上機器系統配置文件對應位置爲:/etc/sysctl.conf,目前咱們線上機器配置的最大文件描述符數爲655350服務器

 

 

關於redis配置文件一些參數的理解:併發

daemonize no/yes    Redis默認不是以守護進程的方式運行,能夠經過該配置項修改,使用yes啓用守護進程(我我的是理解就是設置爲yes能夠支持後臺運行redis)app

port 6379    指定Redis監聽端口,默認端口爲6379socket

bind 127.0.0.1    綁定的主機地址tcp

timeout 300    當 客戶端閒置多長時間後關閉鏈接,若是指定爲0,表示關閉該功能

databases 16    設置數據庫的數量,默認數據庫爲0,可使用SELECT <dbid>命令在鏈接上指定數據庫id

maxclients 128     設置同一時間最大客戶端鏈接數,默認無限制,Redis能夠同時打開的客戶端鏈接數爲Redis進程能夠打開的最大文件描述符數,若是設置 maxclients 0,表示不做限制。當客戶端鏈接數到達限制時,Redis會關閉新的鏈接並向客戶端返回max number of clients reached錯誤信息(因此想要讓redis支持更多的鏈接數,須要將文件描述符數和maxclients同時設置的大一些,而最終的最大鏈接數取決於兩者較小的那個值)

 

 

經過以上兩種設置,貌似redis已經能夠支持大量的客戶端鏈接了,可是採用 redis-benchmark 進行壓力測試,會出現以下錯誤:

-- Could not connect to Redis at IP:PORT,Cannot assign requested address.

這是由於redis-benchmark的壓力測試時頻繁的連服務器,數據量較大的時候,因爲每次鏈接都在很短的時間內結束,致使不少的TIME_WAIT,以致於用光了可用的端口號,因此新的鏈接沒辦法綁定端口,即「Cannot assign requestedaddress」。

 

能夠經過 netstat -ant|grep TIME_WAIT 過濾出來大量的未關閉鏈接,效果大概是下邊這個樣子

 

這時,你須要讓系統知道對於這種TIME_WAIT的TCP鏈接應該快速回收,以釋放端口,供更多的客戶端能夠請求分配到端口並訪問咱們的redis

命令以下:

sysctl -w net.ipv4.tcp_timestamps=1     #開啓對於TCP時間戳的支持,若該項設置爲0,則下面一項設置不起做用

 

 

sysctl -w net.ipv4.tcp_tw_recycle=1      #表示開啓TCP鏈接中TIME-WAIT sockets的快速回收

 

執行後,利用 redis-benchmark 作壓力測試,不會再出現 Cannot assign requested address 這個錯誤

redis-benchmark 壓力測試命令:

redis-benchmark -h 127.0.0.1 -p 6379 -c 20000 -n 20000    (h對應參數爲ip,p對應參數爲端口,c對應參數爲併發鏈接數,n對應參數爲請求數量)

 

這時,你能夠看到高併發時 redis 對於不一樣操做的平均響應時長(只截取部分結果)

在xadtest這臺機器上測試20000併發鏈接數,20000個請求的效果數據如圖(能夠看到最長響應時長已經達到577ms,目前咱們線上服務器的平均響應時長爲110ms左右;PS:可能線上的服務器響應效果會好一些,可是有業務在跑,就沒作測試):

 

須要額外提一點:上邊提到要讓服務器快速關閉TIME_WAIT的TCP鏈接,會對系統設置作兩個修改

sysctl -w net.ipv4.tcp_timestamps=1

sysctl -w net.ipv4.tcp_tw_recycle=1

 

可是目前咱們線上服務器配置文件裏的內容爲:

 

#時間戳能夠避免序列號的卷繞。一個1Gbps的鏈路確定會遇到之前用過的序列號。時間戳可以讓內核接受這種「異常」的數據包。這裏須要將其關掉
net.ipv4.tcp_timestamps = 0    (與上述修改是有衝突存在的)

#開啓TCP鏈接複用功能,容許將time_wait sockets從新用於新的TCP鏈接(主要針對time_wait鏈接)
net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

貿然更改系統配置,是會影響咱們的線上服務的,測試操做請上測試機!!!

本文內容在類linux環境使用,不適用mac/windows 

後續若是涉及到redis集羣,會再作補充

相關文章
相關標籤/搜索