經過很長時間的修改我的服務器版本從1.0修改到3.6,從一個客戶端一個線程到現在的異步方式處理 網絡,不過在服務器軟件開發方面的經驗依然不足,希望園子裡面的服務器方面的專家些能給些建議:
先介紹一下:該服務器的客戶端分為PC客戶端和車載終端,以下稱作客戶端和終端。服務器的Session 部分需要分別保存客戶端和終端狀態。以下是我設計的服務器的網絡部分:
程序運行後通過運行HandleCar和HandleUser的StartListen函數啟動線程來分別接收來自終端和客戶 端的數據,終端收到一包數據後處理數據:
由於終端沒隔10秒發送一包數據,因此數據量很大,在AnylizeGpsData(state,bufData)中,要通過數 據庫裡面該終端所屬線路查找該線路的所有用戶(通過Session裡面的Socket),然後將數據轉發到客戶端 ,並將數據保存到數據庫。現在的處理是來一包數據就要去找在線用戶,估計這裡有問題。
現在程序運行起了,出現了一下問題:
1. 現在終端的連接數已經有220個(PC客戶端很少,可以忽略),當服務器運行1-2天內存就達1個多G, 而且運行中觀察發現時間越長占用內存越大。
2. 程序裡面通過基類的事件通知UI,及時得到上線離線等一些消息,在程序運行幾分鐘後UI就死掉( 線程安全已經考慮)。
3. 數據庫是用的SQL Server 2005,當時間越長SQL Server占內存越大,1-2天後內存也達到了1個多G ,和前面一樣時間越長占內存越大。
如前面所說,是否是下面原因引起:
1. 收到一包數據寫入數據庫一條數據不可避免,但是在轉發數據的時候,每次都查詢了數據庫,加重 了數據庫的負擔?
2. 當一個終端連接上來後創建對象時使用的反射,會不會加重內存負擔?
3. 現在的服務器要求是能使終端數量達到2000個,在設計方面應該怎麼改進?
4. 占用內存是怎麼產生的?如何清理內存?