2009-11-13 16 views
6

我們已經將我們的rails應用程序部署到了EC2。在我們的設置中,我們在循環DNS後面的小實例上有兩個代理。這些運行nginx負載平衡器的動態增長和縮小的Web服務器場。每個網絡服務器也運行nginx和mongrels集羣。這裏的nginx負責靜態內容和負載平衡的雜種。EC2中的SSL緩慢

無論如何,我們的點擊量是HTTPS。我們有2個代理服務器負責SSL。我注意到,這些實例的網絡吞吐量僅限於60 Mbps左右。相比之下,在測試中,我可以通過常規的HTTP始終在小實例上獲得700+ Mbps的速度。事實上,這與我在大型實例中得到的結果是一樣的。類似於正確比例的人在their testing中得到的結果。 (亞馬遜表示,一個小型的網絡I/O「適度」,而一個大型網絡I/O則「高」。如果我必須推測,我認爲這只是他們說每個物理盒共享一個網卡的小實例。我不確定這是否意味着一個大的專用網絡接口,但我懷疑它。)

在測試中,我能夠得到一個大型實例獲得約250 Mbps的SSL。這對我說,CPU或其他資源是瓶頸。但是,我們的監控圖並未顯示我們的代理上的CPU特別繁忙。

我的問題是:

  1. 是我對SSL是慢,由於CPU正確的,我們的圖形監控是錯誤的本能?或者可能有其他資源是限制因素嗎?
  2. 我們是否應該花費額外的成本並將代理放在高CPU實例上?或者只是添加更多的小型實例會更好嗎?
  3. 我們應該將SSL終端卸載到Web服務器上嗎?然而,這又帶來了另外一個問題:我們如何在我們的應用程序中獲得客戶端IP地址?現在我們的代理將它設置在X-FORWARDED-FOR標頭中,但是如果它不解密SSL,顯然這是不可能的。

我很想聽聽任何類似的設置。我們用Elastic Load Balancer修改了一下,但我認爲這基本上使我們處於上述#3的相同情況。有沒有其他人轉向ELB,並發現它值得嗎?

回答

4

您是否使用nginx提供的SSL會話緩存?這可以幫助nginx節省週期,不斷重新編譯加密。請參閱http://wiki.nginx.org/NginxHttpSslModule#ssl_session_cache

您使用哪些監控來確定您的cpu使用情況? SSL通常非常耗費CPU資源。

我會將SSL代理保留爲指定層,這樣您可以將ssl的協商成本與其他問題分開進行擴展。

-2

SSL正在變慢: - true,那麼任何正常的HTTP請求HTTPSSL,會比較慢。

嘗試創建一個類似的設置,在本地局域網中,您有3個mongrel_clust和2個Web服務器。 並使用curl加載器進行檢查,併發送約5k個請求。

如果一切都很好,那很好。 可能你會更加努力與EC2傢伙。

0

我在Apache上使用SSL,它處理在Small Windows EC2實例上訪問Subversion存儲庫的權限。在測試中,我發現HTTPS訪問速度比HTTP慢得多,但這正是顯而易見的原因,正如你所期望的那樣,加密/解密不是一個即時過程。

如果你的CPU指標是正確的,你沒有看到過多的負載,那麼暗示帶寬是限制因素;然而,我真的不明白爲什麼你能夠在HTTP實例上獲得700+ Mbps的速度,而HTTPS實例上只有60Mbps。除非測試條件實際上並不完全相同,當然,HTTPS實例中還有其他內容,您還沒有考慮到...

較大的實例當然會比Smalls獲得更好的主機帶寬份額 - 它們爭奪資源的次數更少。由於內部EC2網絡是千兆以太網,假設在同一節點上沒有其他大型實例正在提出類似的帶寬需求,則在大型實例上看到700Mbps是可行的。爲了從一個小實例中解脫出來,你必須非常幸運地能夠在一個非常輕載的主機中運行。在這種情況下,不能保證你會保持這個性能水平 - 只要其他Smalls上線,你可用帶寬的份額就會開始下降。

我認爲這本質上是一個小實例帶寬問題 - 添加更多Smalls不一定會有很大幫助,因爲您無法控制它們啓動的主機;但是,大型實例可以獲得更大的帶寬分區,因此可能具有更一致的容量可用性。