1. 程式人生 > >兩臺機器實現QPS3000的服務優化

兩臺機器實現QPS3000的服務優化

服務流程:

     輸入為一句話, 分詞、匹配百科詞條,讀redis過濾、從redis讀詞條summary資訊、返回

 

需求:

     業務方的峰值QPS為3000

 

按照之前相關百科的一套邏輯: 單機tornado服務程序數4個

模擬10個併發,壓測的QPS為332, 響應時間為30ms

$siege -c10 -r5000 -f urls.lst

Transactions:               10000 hits
Availability:              100.00 %
Elapsed time:               30.05 secs
Data transferred:            3.31 MB
Response time:                0.03 secs
Transaction rate:          332.78 trans/sec
Throughput:                0.11 MB/sec
Concurrency:                9.75
Successful transactions:       10000
Failed transactions:               0
Longest transaction:            0.65
Shortest transaction:            0.00

模擬20個併發

$siege -c20 -r5000 -f urls.lst

Transactions:               20000 hits
Availability:              100.00 %
Elapsed time:               58.39 secs
Data transferred:            6.72 MB
Response time:                0.06 secs
Transaction rate:          342.52 trans/sec
Throughput:                0.12 MB/sec
Concurrency:               19.77
Successful transactions:       20000
Failed transactions:               0
Longest transaction:            0.41
Shortest transaction:            0.00

壓測的QPS跟剛才幾乎差不多,但是響應時間已經上升到了60ms,可見,此時服務已經處理不過來了,大量的請求是處理等待狀態的, 然而20個併發在業務方來說應該還算少的

 

優化策略:

第一步:  

先增加服務程序數, 將單機的服務程序從4提高到10  

壓測:

$siege -c20 -r5000 -f urls.lst

QPS為700, 此時的response time是30ms

Transactions:               20000 hits
Availability:              100.00 %
Elapsed time:               28.26 secs
Data transferred:            6.72 MB
Response time:                0.03 secs
Transaction rate:          707.71 trans/sec
Throughput:                0.24 MB/sec
Concurrency:               19.47
Successful transactions:       20000
Failed transactions:               0
Longest transaction:            0.35
Shortest transaction:            0.00

第二步: 

減少詞表的數量

詞表是百科所有詞條的title和詞條id的對映關係, 總量為2300w,因為這個需求只要求PV大於75000的才返回結果,所以詞表也按照這個條件進行過濾, 過濾後,詞表只剩下了13w

再次壓測:

$siege -c20 -r5000 -f urls.lst

可以看到QPS提高到了1081, response time降低到了20ms

Transactions:               20000 hits
Availability:              100.00 %
Elapsed time:               18.50 secs
Data transferred:            5.84 MB
Response time:                0.02 secs
Transaction rate:         1081.08 trans/sec
Throughput:                0.32 MB/sec
Concurrency:               19.67
Successful transactions:       20000
Failed transactions:               0
Longest transaction:            0.09
Shortest transaction:            0.00

第三步:

對query做快取

因為query都是短文字,根據業務方的反饋,會存在大量的重複的query, 所以對query做快取肯定會起到效果

具體策略:

      對query分詞,分詞後拼接,並計算md5值作為快取的key, query對應的返回結果作為value快取到redis中

      因為有快取,所以這個壓測不太好測,而且我們暫時也沒有線上真實的資料,所以這裡無法給出壓測的結果,但是效果應該會很好

 

目前可以大概預估下, 加了快取後,單機的QPS應該能到1500, 那麼部署兩臺機器就可以滿足需求了