2012-08-01 97 views
17

我們正在部署一個僅使用redis作爲數據存儲的大型Web應用程序。我注意到我們的redis master的基準測試在EC2上每秒大約8000次交易,遠遠低於專用硬件上的基準測試。Redis服務器的最佳EC2設置

我知道在像EC2這樣的虛擬機上運行Redis會有性能損失,但我會喜歡在EC2上的生產環境中部署Redis的人的一些指示,指出EC2設置對於哪些EC2設置最有效更多來自redis。

謝謝。

+0

什麼是基準測試的EC2實例類型?基準測試的機器是什麼?它位於哪裏?性能(CPU,負載平均,內存利用率,網絡流量)與服務器(redis和運行基準測試)一樣嗎?最後,redis服務器上的磁盤IO速率是多少? – 2013-04-30 08:05:29

+0

可能想看看這個:http://redis.io/topics/latency本文還討論了虛擬化環境,XEN管理程序和EC2 – 2013-05-01 08:18:12

+0

考慮對託管的redis使用elasticache:https://aws.amazon。 com/elasticache/ – JDiMatteo 2017-07-20 04:04:34

回答

37

EC2可能不是在虛擬化硬件上運行Redis的最佳環境,但它非常受歡迎,並且在此平臺上有許多關於從Redis獲得最佳性能的知識點。

我是http://redis.io/topics/benchmarkshttp://redis.io/topics/latency的作者之一,涵蓋了我在下面介紹的大部分主題。這只是要點的總結。

虛擬化收費

它不是具體到EC2,但在虛擬機上運行(在最大支持吞吐量項)時的Redis是顯著慢。這是由於基本操作的事實,Redis不會爲處理客戶端連接(如memcached或其他高效的鍵/值存儲)所需的epoll/read/write系統調用增加很多開銷。系統調用通常在虛擬機上更昂貴,並且它們是Redis活動的重要組成部分(特別是在基準測試中)。在這種情況下,與裸機相比,最大吞吐量下降50%並不罕見。

當然,這也取決於管理程序的質量。對於EC2,使用Xen。

標杆狀況良好

基準可能會非常棘手,尤其是在像EC2的平臺。經常被遺忘的一點是確保基準客戶端和服務器的適當配置。例如,不要在CPU不足的微型實例(可能會被亞馬遜限制)上運行redis-benchmark,而針對Redis服務器。兩臺機器對於獲得最佳的最大吞吐量同樣重要。

實際上,評估Redis的性能,你需要:

  • 運行Redis的基準測試本地(同一臺機器不是在服務器上),假設你有一個以上的虛擬CPU核心。

  • 運行Redis的基準測試遠程(從不同的虛擬機),一臺機器,其QoS配置等同於服務器機器

所以,你可以評估和比較的機器和網絡的性能上。

在EC2上,您將獲得使用第二代M3實例(或高內存或集羣計算實例)的最佳結果,因此您可以從HVM(硬件虛擬化)中受益,而不必依賴較慢的半虛擬化。

叉問題

這不是具體到EC2,但Xen的:分叉大的過程可以在Xen上很慢(它看起來更好地與KVM)。對於Redis來說,如果您打算使用持久性,這是一個大問題:兩個持久性選項(RDB或AOF)都要求主線程分叉並啓動背景保存或重寫過程。

在某些情況下,分叉延遲可以將Redis事件循環凍結幾秒鐘。 Redis實例管理的內存越多,延遲越多。

在EC2上,一定要使用啓用了HVM的實例(M3,高內存,集羣),這將緩解問題。然後,如果您的內存要求很大,並且您的應用程序可以容忍它,請考慮在同一臺計算機上運行幾個較小的Redis實例,並分割您的數據。它可以將由於分叉操作而引起的延遲降低到可接受的水平。

持久性配置

這是一個關鍵點,從Redis的獲得良好的性能(無論在VM和裸機)。所以請花時間仔細閱讀http://redis.io/topics/persistence

如果您使用RDB,請記住內存複製寫入機制將在保存後臺進程分離後開始複製頁面。因此,您需要確保Redis本身有足夠的內存,並且還需要一定的餘量來應對COW。額外內存的數量取決於您的工作量。你在實例中寫得越多,你需要的額外內存就越多。

請注意寫入文件也可能會消耗一些內存(因爲文件系統緩存),所以在Redis後臺保存期間,您需要考慮Redis內存,COW開銷和轉儲文件的大小。

運行Redis服務器的機器絕不能交換。如果確實如此,結果將是災難性的。與其他一些商店相反,Redis不是虛擬內存友好型的。

在Linux中,一定要設置合理的系統參數:vm.overcommit_memory = 1和vm.swappiness = 0(或者非常低的值)。不要使用舊的內核版本:它們在執行低swappiness時非常糟糕(導致在寫入大文件時交換)。

如果您使用AOF,請查看fsync選項。這是寫入操作的原始性能和持久性之間的折衷。你需要做出選擇並定義一個策略。

您還需要熟悉EC2存儲選項。在某些虛擬機上,您可以在臨時存儲和EBS之間進行選擇。在其他一些人中,你只有EBS。

臨時存儲速度通常更快,您可能會比使用EBS時遇到的問題更少,但在磁盤故障或主機重新啓動等情況下,您可以輕鬆地丟失數據...您可以想象將RDB快照置於臨時存儲,然後將結果文件複製到EBS目錄,作爲性能和穩健性之間的折衷。

EBS是遠程存儲:它可能吃掉分配給VM的標準網絡帶寬,並影響Redis的最大吞吐量。如果您打算使用EBS,請考慮選擇「EBS優化」選項以在標準網絡和存儲鏈路之間建立QoS。

最後,對於性能要求較高的EC2實例,非常常見的設置是取消激活主設備上的持久性,並且僅在從設備實例上激活它。數據可能不太安全,但可以防止主服務器上出現很多潛在的延遲問題。

+0

Redis實驗室在這裏也有一些關於此的說法:http://redislabs.com/blog/5-tips-for-running-redis-over-aws – Mulkave 2014-09-05 14:58:15