原文:
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 讀鎖是共享的,或者說是相互不阻塞的 寫鎖是排他的,乙個寫鎖會阻塞其他...