2014-02-11 50 views
10

我測試了基於redis容器。 https://index.docker.io/u/dockerfile/redis/如何優化碼頭集裝箱的性能?

採用相同Redis的基準測試,Redis的服務器容器內運行慢得多,比上託管的操作系統,如下所示的實際統計中運行。 (第一個基準是碼頭集裝箱)

那麼,有沒有一種方法來優化碼頭集裝箱的性能?

[email protected]:/tmp$ redis-benchmark -p 49153 -q -n 100000 
PING (inline): 5607.27 requests per second 
PING: 6721.79 requests per second 
MSET (10 keys): 6085.69 requests per second 
SET: 6288.91 requests per second 
GET: 6627.78 requests per second 
INCR: 6454.11 requests per second 
LPUSH: 6449.12 requests per second 
LPOP: 5355.90 requests per second 
SADD: 6237.91 requests per second 
SPOP: 6794.40 requests per second 
LPUSH (again, in order to bench LRANGE): 6089.76 requests per second 
LRANGE (first 100 elements): 6000.24 requests per second 
LRANGE (first 300 elements): 4660.70 requests per second 
LRANGE (first 450 elements): 4276.79 requests per second 
LRANGE (first 600 elements): 3710.85 requests per second 

[email protected]:/tmp$ 
[email protected]:/tmp$ sudo /etc/init.d/redis-server start 
Starting redis-server: redis-server. 
[email protected]:/tmp$ redis-benchmark -q -n 100000 
PING (inline): 19357.34 requests per second 
PING: 19175.46 requests per second 
MSET (10 keys): 16697.28 requests per second 
SET: 19146.08 requests per second 
GET: 19175.46 requests per second 
INCR: 19135.09 requests per second 
LPUSH: 19168.10 requests per second 
LPOP: 14976.79 requests per second 
SADD: 16638.93 requests per second 
SPOP: 18079.91 requests per second 
LPUSH (again, in order to bench LRANGE): 18268.18 requests per second 
LRANGE (first 100 elements): 16136.84 requests per second 
LRANGE (first 300 elements): 11528.71 requests per second 
LRANGE (first 450 elements): 9237.88 requests per second 
LRANGE (first 600 elements): 8864.46 requests per second 

回答

8

容器似乎要慢一些,因爲你正在經歷一個額外的網絡層。

在這種情況下,不是直接連接到Redis,而是連接到Docker用戶區代理,該代理本身連接回容器(而不是通過本地接口,此連接通過接口veth)。

這增加了一點延遲(與例如10ms網頁生成相比不可測量;但如果你明白我的意思,50μs仍然快於150μs)。

如果你想要做一個更「蘋果對蘋果」的比較,你可以:在容器內

  • 運行Redis的基準測試(直接從容器內連接到Redis的);
  • 在另一臺機器上運行redis-benchmark(但請記住,您仍將爲端口轉換機制增加一個網絡層);
  • 在另一臺機器上運行redis-benchmark 使用像pipework這樣的機制爲容器提供一個具有(幾乎)零開銷的macvlan接口。
+0

實際上也應該添加從另一個容器連接到redis服務器的基準測試,因爲這是我們推薦的。 – SvenDowideit

+0

@jpetazzo在第二個項目中,我假設你說你從另一個主機連接時會得到可比的數字,而不管redis-server是在主機中的碼頭集裝箱內還是外部運行。在這兩種情況下,只有一個網絡層(主機網絡層或碼頭網絡層,而不是兩者) – Sajith

-1

容器的額外網絡層是您場景中的性能瓶頸,並且從碼頭到碼頭的通信不會有太多的幫助(有些優化適用,但是還有一些額外的開銷必須面對) 。

另外,在Redis服務器的相同容器中運行redis-benchmark會給你主機級的性能,但這不是你正在尋找的用例,可能你想知道可以通過dockerized redis服務器。

我們在Torusware做了一些測試,以評估dockerized應用程序的開銷,並且我們意識到容器的網絡層正在限制性能。

事實上,在同一主機上運行dockerized redis-benchmark和dockerized redis服務器,每秒只能實現38k GET和46k SET請求。

我們有一個解決方案,以非干擾方式加速此場景(在Docker和應用程序中都沒有任何變化)。這是我們的產品Speedus Plug &運行,一個高性能的套接字庫。

通過使用Redis + Speedus Lite docker(可在Docker註冊表中免費獲得),您將能夠將峯值時間(最壞情況)從大約1秒降到1毫秒以下。

此外,Redis + Speedus Lite將性能乘以2。SET爲5X(從46k TPS到113k TPS),乘以3X(從39k TPS到121k TPS)。

查詢this post in our blog瞭解更多詳情。

但是,如果您真的期待極高的性能,我們的Speedus Extreme Performance版本將使您的Redis服務器運行速度非常快。得益於我們的技術,dockerized redis服務器可以提供其他dockerized應用程序,每秒有717k SET請求和415k GET請求!

檢查details in this post