日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

提高QPS方法基本思路

發布時間:2023/12/15 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 提高QPS方法基本思路 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

提高QPS方法淺談

最近看了一篇博文,題目是 《天池中間件大賽dubboMesh優化總結(qps從1000到6850)》,點擊鏈接,對其中筆者優化RPC鏈路,提高QPS的過程非常感興趣,所以就想寫一篇這樣的文章。主要就以下幾點談談如何提高QPS:

  • QPS含義
  • 高QPS的核心思想
  • 常見手段

QPS含義

Queries per second (QPS) is a common measure of the amount of search traffic an information retrieval system, such as a search engine or a database, receives during one second. —— [ 維基百科 ]

簡單的來說,就是每秒能夠響應的請求,并以此作為系統處理能力的標準。一般QPS的獲取,正如其定義一樣,需要通過壓測工具進行實際的壓力測試計算,這是從結果的角度來看。但是換個思路,特別是我們需要提高QPS值的時候,我們就要思考怎么樣提高,影響QPS的因素到底是什么,能否從數學上有一個比較準確的定義和描述,這個時候,我們的思路就會被打開。

QPS,顧名思義,從描述我們可以下一個基本的定義:

QPS = 1000ms/執行RT,當然,這是單核單線程QPS。

擴充到多線程:

QPS = 1000ms/執行RT*線程數 其中執行RT=thread avg waitTime + thread avg executeTime

至于線程數,選什么值好呢?一般來說,使用線程直接目的就是最大化CPU資源,所以 在一個執行RT內,我們理想可以并行的線程數是

n = 執行RT/thread avg executeTime=1+waitTime/executeTime

但是往往存在上下文線程開銷、同線程之間資源切換損耗,并且我們CPU的利用率并不是100%。所以假設我們把線程開銷等等計算到 executeTime中,定義cpu%表示cpu利用率。
最后,我們的QPS的定性描述

QPS= 1000ms/執行RT*(執行RT/thread avg executeTime) *cpu%= (1000ms/thread avg executeTime) * cpu%

所以,我們要提高一個服務系統的QPS,需要降低這個鏈路當中 executeTime以及提高cpu利用率。

高QPS的核心思想

繼續上文的結論,要提高一個服務的QPS,我們需要實現兩個指標:
降低這個鏈路的 executeTime,以及提高cpu利用率。
降低鏈路的executeTime 自然而然,我們把一個鏈路的同步調用,分成好幾段,原來需要經過三步才能拿到的返回結果,我們只需要經過一步就能拿到結果,那么自然我們的性能就會提高很多。
至于提高cpu利用率。說到底其實就是一點,不要在計算的時候,老進行什么IO、網絡讀寫,要計算就好好的計算,專人負責專事。
把這兩點歸納到一起,其實際就是一種SEDA思想

SEDA 

SEDA,即將原先由一個線程完成的任務,分割為相對獨立的多個階段。每個階段由專用的一組線程負責執行,階段之間用隊列交互。

將SEDA思想融入的比較完美的地方,首先想要的便是 一直被大家所推崇的高性能IO通信 netty, 使用的異步非阻塞的Reactor線程模型

如圖使用多組不同的線程池,
1.第一個NIO線程池,Acceptor pool接受dispatcher來的客戶端連接,完成auth、login、以及握手。
2.第二個NIO線程池,接替前一個結果,完成后續的IO讀寫

這樣,系統的每一個比較耗時的環節,都有一組人在并行處理,環節之間通過NIO非阻塞通信,極大降低了等待時間,提高了利用率。所以在相同的時間內,使用SEDA思想設計,將能響應更多的請求。

disruptor無鎖設計

很快,使用SEDA,我們就會發現一個問題,不同的stage之間通過隊列來交互,并且在多線程環境下,入隊與出隊必然存在鎖控制,并且隊列為了起到緩存的作用,那么總會存在一定的數據,隊列持有一定的數據,從全局的角度來看,這是一個cpu并沒有被使用的場景,因為數據被緩沖在隊列里。另外當消費者速度較快的情形下,可能出現 多個不同的消費者相互競爭同類型的資源。所以disruptor 提出了一種無鎖設計,干掉隊列,在同樣情形下,把能把各個stage之間聯系的隊列去掉,用一種統一的數據結構來代替,統一的數據結構,可以使用統一的線程組,這樣系統的壓力也比較均勻。
disruptor的研究與解讀還需要慢慢品味,此處就不予以展開。

常見手段

1.異步化

即非阻塞,化繁為簡,拿到你需要處理的資源后盡快回復。適用于事務處理場景,且無需對上游返回數據場景。fature callback這種模式,從數據角度來說,是一種偽異步。

2.無鎖設計

本質上是要降低鎖沖突,而無鎖設計最佳的體現就在于MVVC思想,避免或者使用互斥資源,所以基于數據版本的樂觀鎖 有效的減少了互斥資源的范圍,優點不言而喻。

3.batch處理

批量查詢、批量commit,基本上操作慢速設備或者不能并行化的對象或者資源時,使用batch 永遠是最好的手段。

4.副本設計

使用cache、靜態化等手段,其核心思想在于 提前將結果準備好,實現的難點數據的更新。


總結

以上是生活随笔為你收集整理的提高QPS方法基本思路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。