引入redis代理是否一定會降低redis服務效能?
從我們的直觀感受來講,對於任何服務,只要在中間增加了一層,肯定會對服務效能造成影響。那麼到底會影響什麼呢?在考察一個服務效能的時候,有兩個最重要的指標,那就是吞吐和延遲。吞吐定義為服務端單位時間內能處理的請求數,延遲定義為客戶端從發出請求到收到請求的耗時。中間環節的引入我們首先想到的就是那會增加處理時間,這就會增加服務的延遲,於是順便我們也會認為吞吐也會下降。從單個使用者的角度來講,事實確實如此,我完成一個請求的時間增加了,那麼我單位時間內所能完成的請求量必定就減少了。然而站在服務端的角度來看,雖然單個請求的處理時間增加了,但是總的吞吐就一定會減少嗎?
接下來我們就來對redis來進行一系列的測試,利用redis自帶的redis-benchmark,分別對set和get命令;單個傳送和批量傳送;直連redis和連線redis代理
專案 | 內容 |
---|---|
CPU | AMD Ryzen 7 1700X Eight-Core Processor 3.775GHz |
記憶體 | 16GB DDR4 3000 |
OS | x86_64 GNU/Linux 4.10.0-42-generic #46~16.04.1-Ubuntu |
redis | 版本3.2.9,埠7200 |
predixy | 版本1.0.2,埠7600 |
八個測試命令
測試命令 | 命令列 |
---|---|
redis set | redis-benchmark -h xxx -p 7200 -t set -r 3000 -n 40000000 |
predixy set | redis-benchmark -h xxx -p 7600 -t set -r 3000 -n 40000000 |
redis get | redis-benchmark -h xxx -p 7200 -t get -r 3000 -n 40000000 |
predixy get | redis-benchmark -h xxx -p 7600 -t get -r 3000 -n 40000000 |
redis 批量set | redis-benchmark -h xxx -p 7200 -t set -r 3000 -n 180000000 -P 20 |
predixy 批量set | redis-benchmark -h xxx -p 7600 -t set -r 3000 -n 180000000 -P 20 |
redis 批量get | redis-benchmark -h xxx -p 7200 -t get -r 3000 -n 420000000 -P 20 |
predixy 批量get | redis-benchmark -h xxx -p 7600 -t get -r 3000 -n 220000000 -P 20 |
以上8條命令採取redis-benchmark預設的50個併發連線,資料大小為2位元組,指定3000個key,批量測試時一次傳送20個請求。依次間隔2分鐘執行以上命令,每一個測試完成時間大約4分鐘。最後得到下圖的總體結果:
眼花繚亂是不是?左邊的縱軸表示CPU使用率,右邊的縱軸表示吞吐。其中redis used表示redis總的CPU使用率,redis user表示redis CPU使用者態使用率,redis sys表示redis CPU核心態使用率,其它類推。先別擔心分不清裡面的內容,下面我們會一一標出數值來。在這圖中總共可以看出有八個凸起,依次對應我們上面提到的八個測試命令。
1 redis set測試
2 predixy set測試
3 redis get測試
4 predixy get測試
5 redis 批量set測試
6 predixy 批量set測試
7 redis 批量get測試
8 predixy 批量get測試
圖片還是不方便看,我們總結為表格:
測試\指標 | redis used | redis user | redis sys | predixy used | predixy user | predixy sys | redis qps | predixy qps |
---|---|---|---|---|---|---|---|---|
redis set | 0.990 | 0.247 | 0.744 | 0 | 0 | 0 | 167000 | 3 |
predixy set | 0.475 | 0.313 | 0.162 | 0.986 | 0.252 | 0.734 | 174000 | 174000 |
redis get | 0.922 | 0.180 | 0.742 | 0 | 0 | 0 | 163000 | 3 |
predixy get | 0.298 | 0.195 | 0.104 | 0.988 | 0.247 | 0.741 | 172000 | 172000 |
redis批量set | 1.006 | 0.796 | 0.21 | 0 | 0 | 0 | 782000 | 3 |
predixy批量set | 0.998 | 0.940 | 0.058 | 0.796 | 0.539 | 0.256 | 724000 | 724000 |
redis批量get | 1 | 0.688 | 0.312 | 0 | 0 | 0 | 1708000 | 3 |
predixy批量get | 0.596 | 0.582 | 0.014 | 0.999 | 0.637 | 0.362 | 935000 | 935000 |
看到前四個的結果如果感到驚訝不用懷疑是自己看錯了或者是測試結果有問題,這個結果是無誤的。根據這個結果,那麼可以回答我們最初提出的疑問,增加了代理之後並不一定會降低服務整體的吞吐!雖然benchmark並不是我們的實際應用,但是redis的大部分應用場景都是這樣的,併發的接受眾多客戶端的請求,處理然後返回。
為什麼會是這樣的結果,看到這個結果後我們肯定想知道原因,這好像跟我們的想象不太一樣。要分析這個問題,我們還是從測試的資料來入手,首先看測試1的資料,redis的CPU使用率幾乎已經達到了1,對於單執行緒程式來說,這意味著CPU已經跑滿了,效能已經達到了極限,不可能再提高了,然而這時redis的吞吐卻只有167000。測試2的redis吞吐都比它高,並且我們明顯能看出測試2裡redis的CPU使用率還不如測試1的高,測試2裡redis CPU使用率只有0.475。為什麼CPU使用率降低了吞吐反而卻還高了呢?仔細對比一下兩個測試的資料,可以發現在測試1裡,redis的CPU大部分都花在了核心態,高達0.744,而使用者態只有0.247,CPU執行在核心態時雖然我們不能稱之為瞎忙活,但是卻無助於提升程式的效能,只有CPU執行在使用者態才可能提升我們的程式效能,相比測試1,測試2的redis使用者態CPU使用率提高到了0.313,而核心態CPU則大幅下降至0.162。這也就解釋了為什麼測試2的吞吐比測試1還要高。當然了,我們還是要繼續刨根問底,為什麼測試2裡經過一層代理predixy後,redis的CPU使用情況發生變化了呢?這是因為redis接受一個連線批量的傳送命令過來處理,也就是redis裡所謂的pipeline。而predixy正是利用這一特性,predixy與redis之間只有一個連線(大多數情況下),predixy在收到客戶端的請求後,會將它們批量的通過這個連線傳送給redis處理,這樣一來就大大降低了redis用於網路IO操作的開銷,而這一部分開銷基本都是花費在核心態。
對比測試1和測試2,引入predixy不僅直接提高了吞吐,還帶來一個好處,就是redis的CPU使用率只有一半不到了,這也就意味著如果我再把剩下的這一半CPU用起來還可以得到更高的吞吐,而如果沒有predixy這樣一層的話,測試1結果告訴我們redis的CPU利用率已經到頭了,吞吐已經不可能再提高。
測試3和測試4說明的問題與測試1和測試2一樣,如果我只做了這四個測試,那麼看起來好像代理的引入完全有助於提升我們的吞吐嘛。正如上面所分析的那樣,predixy提升吞吐的原因是因為採用了批量傳送手段。那麼如果客戶端的使用場景就是批量傳送命令,那結果會如何呢?
於是有了後面四個測試,後面四個測試給我們的直接感受就是太震撼了,吞吐直接提升幾倍甚至10倍!其實也正是因為redis批量模式下效能非常強悍,才使得predixy在單命令情況下改進吞吐成為可能。當然到了批量模式,從測試結果看,predixy使得服務的吞吐下降了。
具體到批量set時,直連redis和通過predixy,redis的CPU使用率都滿了,雖然採用predixy使得redis的使用者態CPU從0.796提高到了0.940,但是吞吐卻不升反降,從782000到724000,大約下降了7.4%。至於為什麼使用者態CPU利用率提高了吞吐卻下降了,要想知道原因就需要分析redis本身的實現,這裡我們就不做詳細探討。可以做一個粗糙的解釋,在redis CPU跑滿的情況下,不同的負載情況會使得使用者態和核心態的使用率不同,而這其中有一種分配情況會是吞吐最大,而使用者態使用率高於或者低於這種情況時都會出現吞吐下降的情況。
再來看批量get,直連redis時吞吐高達1708000,而通過predixy的話就只有935000了,下降了45%!就跟納了個人所得稅上限一般。看到這,剛剛對predixy建立的美好形象是不是又突然覺得要坍塌了?先別急,再看看其它指標,直連redis時,redis CPU跑滿;而通過predixy時redis CPU只用了0.596,也就是說redis還有四成的CPU等待我們去壓榨。
寫到這,既然上面提到批量get時,通過predixy的話redis並未發揮出全部功力,於是就想著如果全部發揮出來會是什麼情況呢?我們繼續增加兩個測試,既然單個predixy在批量的情況下造成了吞吐下降,但是給我們帶來了一個好處是redis還可以提升的餘地,那麼我們就增加predixy的處理能力。因此我們把predixy改為三執行緒,再來跑一遍測試6和測試8。
兩個測試的整體結果如下。
三執行緒predixy批量set
三執行緒predixy批量get
測試\指標 | redis used | redis user | redis sys | predixy used | predixy user | predixy sys | redis qps | predixy qps |
---|---|---|---|---|---|---|---|---|
predixy pipeline set | 1.01 | 0.93 | 0.07 | 1.37 | 0.97 | 0.41 | 762000 | 762000 |
predixy pipeline get | 0.93 | 0.85 | 0.08 | 2.57 | 1.85 | 0.72 | 1718000 | 1718000 |
原本在單執行緒predixy的批量set測試中,predixy和redis的CPU都已經跑滿了,我們覺得吞吐已經達到了極限,但是實際結果顯示在三執行緒predixy的批量set測試中,吞吐還是提高了,從原來的724000到現在的76200,與直連的782000只有2.5%的差距。多執行緒和單執行緒的主要差別在於單執行緒時predixy與redis只有一個連線,而三執行緒時有三個連線。
而對於三執行緒predixy的批量get測試,不出我們所料的吞吐得到了極大的提升,從之前的935000直接飆到1718000,已經超過了直連的1708000。
最後,我們來總結一下,我們整個測試的場景比較簡單,只是單純的set、get測試,並且資料大小為預設的2位元組,實際的redis應用場景遠比這複雜的多。但是測試結果的資料依舊可以給我們一些結論。代理的引入並不一定會降低服務的吞吐,實際上根據服務的負載情況,有時候引入代理反而可以提升整個服務的吞吐,如果我們不計較代理本身所消耗的資源,那麼引入代理幾乎總是一個好的選擇。根據我們上面的分析,一個最簡單實用的判斷原則,看看你的redis CPU使用情況,如果花費了太多時間在核心態,那麼考慮引入代理吧。
相關推薦
引入redis代理是否一定會降低redis服務效能?
從我們的直觀感受來講,對於任何服務,只要在中間增加了一層,肯定會對服務效能造成影響。那麼到底會影響什麼呢?在考察一個服務效能的時候,有兩個最重要的指標,那就是吞吐和延遲。吞吐定義為服務端單位時間內能處理的請求數,延遲定義為客戶端從發出請求到收到請求的耗時。中間環
降低Redis內存占用
服務器 硬件 1、降低redis內存占用的優點 1、有助於減少創建快照和加載快照所用的時間 2、提升載入AOF文件和重寫AOF文件時的效率 3、縮短從服務器進行同步所需的時間 4、無需添加額外的硬件就可以讓redis存貯更多的數據回到頂部2、短結構 Redis為列表、集合、散列、有序集合提供
redis代理集群(Twemproxy)(1)
配置信息 tom -- entos 視頻 time get 宕機 問題: redis主從+哨兵模式只解決了讀的分布式操作,大大提高了性能;但是寫操作,只有主主機器才能進行,從機器無法進行寫操作。此時,Twemproxy也就出現了。 這個模式單純的安裝有些復雜,需要引入很多的
Redis持久化磁盤IO方式及其帶來的問題 有Redis線上運維經驗的人會發現Redis在物理內存使用比較多,但還沒有超過實際物理內存總容量時就會發生不穩定甚至崩潰的問題,有人認為是基於快照方式持
發出 != hot server 磁盤io loaddata set 自動 選擇 轉自:http://blog.csdn.net/kaosini/article/details/9176961 一、對Redis持久化的探討與理解 redis是一個支持持久化的內存數據庫
redis 代理工具Predixy安裝部署
redis proxy 安裝部署 predixy PredixyPredixy 是一款高性能全特征redis代理,支持redis-sentinel和redis-cluster特性高性能並輕量級支持多線程多平臺支持:Linux、OSX、BSD、Windows(Cygwin)支持Redis Sen
Nginx+Tomcat反向代理之負載均衡,redis存放session,keepalived暫未搭建
註意 image 依次 shutdown 占用 securecrt moni secure memcache 由於公司特定機器還未申請到位,本人之前對這一塊也不是很了解,所以前期需要先探路的原因,直接在阿裏雲上申請了一臺測試機,這裏部署的所有服務及操作全部在一臺機器上,經過
為什麽分布式一定要有Redis?
查找 情況 超過 切換 做了 數據庫 基礎 dia ESS 本文圍繞以下幾點進行闡述: 為什麽使用 Redis 使用 Redis 有什麽缺點 單線程的 Redis 為什麽這麽快 Redis 的數據類型,以及每種數據類型的使用場景 Redis 的過期
通過Python利用ADSL伺服器和tinyproxy構建資料自己的動態代理IP池,用django+redis做web服務 (優化版)
代理池初始版:https://blog.csdn.net/MeteorCountry/article/details/82085238 上一篇文章中所搭建的代理池在使用過程中出現了點小問題,代理池中莫名的多出了一些無效代理,檢查日誌後返現是在更新代理 池時舊的代理IP沒有刪除成功,就添加了新
通過Python利用ADSL伺服器和tinyproxy構建資料自己的動態代理IP池,用django+redis做web服務,提供IP介面
應公司業務需求需要在一些地方使用代理,要求連通率高,速度快,最主要的還要便宜,對比多家供應商後,最後還是決定自購撥號服務搭建代理IP池。 需要配置:1.一臺或多臺adsl伺服器(用以提供IP,可網上購買,通過ssh同域名連線)2.一臺正常固定IP伺服器擁來搭建IP代理池。(統一配置:python
Redis在什麼時候會超越MongoDB?
在NoSQL資料庫中,Redis和MongoDB都是非常受歡迎的選擇。他們分享一些重要的效能,如速度和資料組織方式,都是對開發者有益的,但是Redis在什麼情況下能超越MongoDB呢?這實際上取決於儲存的資料型別和性質,以及它將如何在應用程式中使用。 MongoDB是有優
唯品會大規模 Redis Cluster 的生產實踐
分享大綱 本次分享內容如下: 1、生產應用場景2、儲存架構演變3、應用最佳實踐4、運維經驗總結 關於這4部分的內容介紹: 第1、2部分:介紹redis cluster在唯品會的生產應用場景,以及儲存架構的演變。第3部分:redis cluster的穩定性,應用成熟度,踩到過
掃盲,為什麼分散式一定要有Redis?
考慮到絕大部分寫業務的程式設計師,在實際開發中使用 Redis 的時候,只會 Set Value 和 Get Value 兩個操作,對 Redis 整體缺乏一個認知。所以我斗膽以 Redis 為題材,對 Redis 常見問題做一個總結,希望能夠彌補大家的知識盲點。 本文
為什麼分散式一定要有redis?
1、為什麼使用redis分析:博主覺得在專案中使用redis,主要是從兩個角度去考慮:效能和併發。當然,redis還具備可以做分散式鎖等其他功能,但是如果只是為了分散式鎖這些其他功能,完全還有其他中介軟體(如zookpeer等)代替,並不是非要使用redis。因此,這個問題主要從效能和併發兩個角度去答。回答:
centos7環境配置haproxy實現mysql資料庫和redis代理伺服器
centos7環境配置haproxy實現mysql資料庫代理 我們通常會碰到這樣的業務場景: b主機和c資料庫在同一個內網,a主機不能直接訪問c資料庫,我們可以通過在b主機上搭建代理讓a訪問c資料庫,我們使用haproxy來幹這個事情 安裝haproxy yum insta
為什麼分散式一定要有redis,redis的一些優缺點
1、為什麼使用redis分析:博主覺得在專案中使用redis,主要是從兩個角度去考慮:效能和併發。當然,redis還具備可以做分散式鎖等其他功能,但是如果只是為了分散式鎖這些其他功能,完全還有其他中介軟體(如zookpeer等)代替,並不是非要使用redis。因此,這個問題主
redis整合java可能會出現的問題
1,SocketTimeoutException連線超時 redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
阿裏Java面試題剖析:了解什麽是 redis 的雪崩和穿透?redis 崩潰之後會怎麽樣?
amp 可能 沒有 國內 shadow 互聯網 限流 http 用戶 面試原題 了解什麽是 redis 的雪崩和穿透?redis 崩潰之後會怎麽樣?系統該如何應對這種情況?如何處理 redis 的穿透?面試官心理分析其實這是問到緩存必問的,因為緩存雪崩和穿透,是緩存最大的兩
你知道CPU結構也會影響Redis效能嗎?
啦啦啦,我是賣身不賣藝的二哈,ε=(´ο`*)))唉錯啦(我是開車的二哈),我又來了,鐵子們一起開車呀! 今天來分析下CPU結構對Redis效能會有影響嗎? 在進行Redis效能分析的時候,通常我們會考慮下面這些方面,如: 1. 縮短 key 的長度 2.
redis 中的配置文件redis.conf 相關配置信息
redis.conf redis配置文件 知識點有點分散,一點一點記錄把:(嘿,這需要極大耐性呢)1、需要註意:當相關配置中的內存大小需要指定時,通過可能指定的格式為 1k 、 5GB、4M等,大小寫可以不區分。2、Redis 默認不是守護進程的方式進行,可以通過該配置項修改,使用 yes 啟用守護進