C 高效能大容量SOCKET併發(四) 快取設計

2021-09-22 13:15:57 字數 2700 閱讀 7988

原文:

c#高效能大容量socket併發(四):快取設計

在編寫服務端大併發的應用程式,需要非常注意快取設計,快取的設計是乙個折衷的結果,需要通過併發測試反覆驗證。有很多服務程式是在啟動時申請足夠的記憶體空間,避免在執行期間再申請空間,這種是固定空間申請。還有一種是在執行期間動態增長的快取設計,隨著執行動態申請記憶體,這種事動態空間申請。這兩種機制各有優劣,固定空間申請優點是效率高,執行穩定,缺點是對應用場景具有限制;動態空間申請優點是能適應更好的應用場景,缺點是效率相對低一些,併發數降一些;這種效能下降不是太明顯,畢竟申請釋放記憶體的效率net是有優化的,具體需要根據應用場景設計。

在c#版iocp中我們結合了固定快取設計和動態快取設計,其中服務端支援連線數使用了固定快取設計(asyncsocketusertokenpool),根據程式啟動時設定的最大連線數申請固定個數的物件。其中接收資料快取(dynamicbuffermanager m_receivebuffer)、傳送資料列表(asyncsendbuffermanager m_sendbuffer)是隨著接收資料大小動態增長。

固定快取設計

固定快取設計我們需要建立乙個列表進行,並在初始化的時候加入到列表中,實現非常簡單,列出**供參考。

public class asyncsocketusertokenpool

public void push(asyncsocketusertoken item)

lock (m_pool)

}public asyncsocketusertoken pop()

}public int count

}}

初始化加入列表的**如下:
public void init()

}

動態快取設計

動態快取是隨著資料量大小動態增長,申請的內存在執行過程中重複利用,不釋放,這樣對記憶體只進行讀寫,不進行申請和釋放,整體效能較高,因為記憶體申請釋放比讀寫的效率低很多,因為申請釋放記憶體需要進行加鎖,進行系統核心和使用者切換,因此使用動態快取可以降低核心和使用者態切換,提高效能。動態快取的**如下:

public class dynamicbuffermanager

//存放記憶體的陣列

public int datacount //寫入資料大小

public dynamicbuffermanager(int buffersize)

public int getdatacount() //獲得當前寫入的位元組數

public int getreservecount() //獲得剩餘的位元組數

public void clear(int count) //清理指定大小的資料

else

datacount = datacount - count;}}

public void writebuffer(byte buffer, int offset, int count)

else //緩衝區空間不夠,需要申請更大的記憶體,並進行移位

}public void writebuffer(byte buffer)

public void writeshort(short value, bool convert)

byte tmpbuffer = bitconverter.getbytes(value);

writebuffer(tmpbuffer);

}public void writeint(int value, bool convert)

byte tmpbuffer = bitconverter.getbytes(value);

writebuffer(tmpbuffer);

}public void writelong(long value, bool convert)

byte tmpbuffer = bitconverter.getbytes(value);

writebuffer(tmpbuffer);

}public void writestring(string value) //文字全部轉成utf8,utf8相容性好

}

非同步傳送列表

非同步傳送列表是在動態快取的基礎上加了乙個列表管理,記錄每個包的位置資訊,並提供管理函式,**示例如下:

namespace socketasyncsvr

public class asyncsendbuffermanager

}private listm_sendbufferlist;

private sendbufferpacket m_sendbufferpacket;

public asyncsendbuffermanager(int buffersize)

public void startpacket()

public void endpacket()

public bool getfirstpacket(ref int offset, ref int count)

public bool clearfirstpacket()

public void clearpacket()

}}

高效能大併發伺服器 1

典型伺服器結構 網路i o 伺服器高效能程式設計技術 資料庫 高併發問題 1.超出資料庫連線數 乙個資料庫最多同時連線10個當伺服器1000個請求,則有990個失敗。2.超出時限 資料庫併發連線數為10,1s中最多處理1000個請求,當有10000個請求,則會出現0 10s等待。解決方案 1.應用佇...

設計高效能大併發WEB系統架構注意點

設計高效能大併發web系統架構注意點 第01 大型架構的演進之路 第02 上 分布式快取 第02 下 分布式快取 第03 分布式訊息佇列 第04 分布式資料儲存 第05 分布式服務框架 第06 高效能系統架構 第07 高可用系統架構 第08 系統的安全架構 第09 架構實戰案例分析 系統的垂直伸縮,...

高效能MySql之併發控制

剛買了一本高效能mysql這本書,順便做個筆記記錄學習的足跡。一 共享鎖和排它鎖 mysql的鎖系統 shared lock和exclusive lock 共享鎖和排他鎖,也叫讀鎖和寫鎖,即write lock和read lock 讀鎖是共享的,或者說是相互不阻塞的 寫鎖是排他的,乙個寫鎖會阻塞其他...