再談高效能Web伺服器,MemoryPool的作用

2022-01-11 16:57:42 字數 1090 閱讀 9030

在以往使用c#實現scoket伺服器中,通常遇到乙個問題就是記憶體占用高,gc次數頻繁,導致處理能力直線下降

其主要原因是在處理socket請求時,大量的申請,複製記憶體,為了解決這個問題,net core 2.1引入了span,memory,memorypool操作型別

其主要目的是能夠像c/c++一樣,使用指標去訪問,釋放記憶體,提供一種高效能,可復用的記憶體處理方式

在kestrel 2.1中,就使用了span,memory,memorypool處理socket請求,這也是kestrel 2.1效能強大的原因之一

memorypool是乙個抽象類,提供了以下幾個方法供使用

public

static memorypoolshared //獲取全域性共享的預設記憶體池

public

abstract

int maxbuffersize //每次可獲取的最大記憶體大小

public

void

dispose(); //釋放記憶體池,申請的記憶體也一併釋放

public

abstract imemoryownerrent(int minbuffersize = -1

); //申請乙個記憶體塊,可以指定最小大小,預設為-1自動分配

protected

abstract

void dispose(bool disposing);

申請到記憶體塊 imemoryowner後,可以通過該介面獲取memory, memory其實就是span的工廠

span的操作方式以及效能跟array差不多,它是一種記憶體檢視的表達方式,包含了目標記憶體的開始位置,記憶體長度

我們操作的span時,首先將index加上start位置,然後再從對應的memory的位置獲取資料

memory與span都是struct型別,jit編譯後,其對應真實的記憶體塊,其讀取也是通過記憶體指標直接操作,效能上跟c/c++是一樣的

memory在釋放後將會return回memorypool中,memorypool將會重新分配記憶體塊,實現記憶體的復用

所以net core 2.1的memory與span型別,非常適合開發高效能web伺服器,遊戲伺服器

專案 高效能web伺服器

reacotr模式本質上來講,他要求主線程 i o處理單元 只負責監聽檔案描述符上是否有事件發生,有的話就立即將該事件通知工作執行緒 邏輯單元 除此之外,主線城不做任何其他實質性的工作。讀寫資料,接受新的連線,以及處理客戶請求均在工作執行緒中完成。使用同步i o模型 epoll wait為例 實現的...

OpenResty安裝(高效能web伺服器)

openresty 參考資料 官方 github openresty最佳實踐 安裝openresty 預設安裝路徑如下 usr local openresty openresty,也被稱為 ngx openresty 是乙個基於 nginx 的核心web應用程式伺服器,它包含了大量的第三方的ngin...

Nginx高效能WEB伺服器詳解

與root 功能的差別 案例 3 正規表示式 regular expression 匹配location 字尾匹配 匹配任何字尾檔名gif jpg jpeg png css js ico m3u8 ts結尾的請求 ts 檔案匹配m3u8 檔案匹配nginx.conf 配置資訊location gif...