如何提高服務器併發能力,理論依據、方法是什麼
吶,一臺服務器,到底能處理多少併發?1萬,10萬,一百一千萬?由什麼決定呢?
不用說,最終肯定是由硬件決定!更強的cpu、更大的內存、更高的帶寬、更高速的io設備……來一臺IBM大型機,再菜的鳥也能整到百萬併發
轉載請註明原著:博客園老鍾 https://www.cnblogs.com/littlecarry/
討論硬件沒有多大意義
我們要討論的事,普通固定硬件條件下,如何提升服務器的併發能力。
併發,也就是單位時間裏服務器處理的最大請求數,通常定義爲1秒時間內。
針對外部訪問,服務器的行爲概括爲:連接請求、處理請求
1、連接請求
基於NIO多路複用技術
NIO多路複用技術,可以讓上億的請求,同時連在一臺服務器管理
2、處理請求
儘量縮短每一個請求的執行時間
一個請求執行的時間越短,單位時間內能處理的請求就越多。一個請求的執行,可能涉及網絡IO、硬盤IO、內存的讀寫,縮短或屏蔽這些讀寫,將大大提升執行速度。
要提升服務器併發能力,就是要提升“連接請求”、“處理請求”的處理能力, 核心是找出他們的性能瓶頸、改善性能瓶頸
性能瓶頸包括:
1、操作系統的IO讀寫能力瓶頸
涉及:網絡IO、硬盤IO、內存等
提升方法:零拷貝、DMA、緩存等
2、系統資源瓶頸
涉及:線程數量、鎖競爭、內存申請釋放、系統參數配置等
提升方法:1)線程越多,操作系統切換線程上下文消耗越大,線程少,IO的阻塞可能導致系統空轉。通過實際調試分配合適的線程數量
2)鎖的種類很多,悲觀、樂觀,重入等等,選擇合適的鎖,能提升資源的競爭率。所有的鎖都是悲觀鎖,是不可取的。
3)內存合理的申請、釋放,能節約資源的消耗
4)系統參數、jvm參數,很多根據實際情況分配
3、代碼能力瓶頸
涉及:代碼架構、代碼邏輯、代碼對內存的操作等
小結:
性能瓶頸改善,主要針對處理請求的能力的提升,連接請求的能力也同步提升。
很多網上說nginx的併發量是2萬、5萬、6萬……,都是不對的,一是nginx的代碼架構,並沒有對併發量的約束,二是脫離了硬件。nginx的架構沒有約束“連接請求”,“處理請求”,就看你對性能瓶頸的改善,以及你的硬件了,這兩點提升了,併發佰億可能不是問題
當然,這裏還有一個“單機性能”的問題,不用切換線程的操作系統,執行當然最快。所以需要處理百萬級別的併發,分佈式處理效率纔是最高的
本文只是提供基本的理論思路,很多具體的方法不細說,得自行查詢