2012-07-24 71 views
3

我希望減少Web服務器爲給定查詢從API服務器請求/接收數據的完整時間。加快API響應時間

假設MySQL是瓶頸,我將API服務器數據庫更新爲Cassandra,但仍然保持完整時間。可能是別的東西是我無法弄清楚的瓶頸。

環境:

Number of Request Estimated per minute: 100 
Database: MySQl/Cassandra 
Hardware: EC2 Small 
Server Used: Apache HTTP 

當前觀察:

Cassandra Query Response Time: .03 Secs 
Time between request made and response received: 4 Secs 

要求:

Time between request made and response received: 1 Secs 

底線:我們如何減少在這種情況下完成所需的時間?

隨意問如果需要更多的細節。謝謝

+1

你在哪裏測量請求和響應之間的時間?在Web服務器日誌中?監視服務器上的軟件?客戶端在同一臺機器上?客戶端在同一網絡上?或者是世界另一端的客戶? – 2012-07-24 02:36:20

+0

你如何將你的後端連接到Apache? – 2012-07-24 02:36:55

+0

您是使用單個請求還是對其應用負載來衡量Web性能?如果您申請的是負載,請求的速率是多少,以及您如何生成負載? – 2012-07-24 02:38:33

回答

2

從聊天總結:

  • 環境:
    • 運行在一個小的Amazon EC2實例(1個虛擬CPU,1.7GB RAM)
    • Web服務器就是Apache
    • 100個工作線程
    • Python正在使用Pylons(暗示WSGI)
    • 測試客戶端在EC2中
  • 測試:
    • 1.8K請求,單個線程
      • 未知CPU成本
      • 卡桑德拉請求時間:0.079s(傳播0.048-> 0.759)
      • MySQL的請求時間:0.169s (傳播0.047-> 1.52)
    • 10K請求,多個線程
      • CPU在90%運行
      • 卡桑德拉請求時間:2.285s(傳播0.102-> 6.321)
      • MySQL的請求時間:7.879s(傳播0.831-> 14.065)

觀察:100個線程可能是很多在您的小型EC2實例上太多。請記住,每個線程都會產生一個佔用內存和資源的Python進程 - 即使沒有做任何事情。減少線程減少:

  • 內存競爭(和內存分頁殺死性能)
  • CPU緩存未命中
  • CPU爭
  • DB爭

建議:你應該目標是隻運行儘可能多的線程來最大限度地利用CPU(但是如果它們在內存或o上最大化,則會減少)其他資源)。運行更多線程會增加開銷並降低吞吐量。

觀察:單線程模式下的最佳性能時間爲每個請求提供0.05 CPU-seconds的可能最佳成本。假設有一些延遲(等待IO),你的CPU成本可能會低很多)。假設CPU是您架構中的瓶頸,那麼您的EC2服務器上可能每秒只能進行20-40次事務處理,只需調整線程。

建議:使用標準的Python分析器來分析系統(當以最佳線程數運行時)。分析器將指示CPU花費最多的時間。區分等待(即數據庫返回,以便磁盤讀取或寫入數據)與代碼固有的CPU成本之間的區別。

  • 如果您的固有CPU成本很高:您可以降低成本嗎?如果這不在你的代碼中,你可以通過做一些不同的事情來避免代碼路徑嗎?緩存?使用另一個庫?
  • 哪裏有延遲:給定您的單線程結果,延遲不一定是壞假設 CPU可以服務的另一個請求。實際上,通過計算,您可以粗略地瞭解您需要的線程數:(總時間/(總時間 - 等待時間)) 但是,請檢查以確認,在Python正在等待時,DB(例如)isn努力回報結果。

其他想法:考慮測試工具如何提供HTTP請求 - 它這樣做的一樣快,因爲它可以(如嘗試同時打開10K TCP套接字?)如果是這樣,這可能是歪曲你的結果。使用不同的加載模式和工具可能會更好。

0

卡桑德拉在高負載下運行速度更快,平均時間3-4秒,在世界各個角落都可以。