linux併發伺服器設計
阿新 • • 發佈:2018-11-06
linux 併發伺服器:
http://blog.csdn.net/ygl840455828ygl/article/details/52438167
http://www.2cto.com/os/201309/245280.html
http://www.cnblogs.com/venow/archive/2012/11/22/2779667.html
http://blog.csdn.net/turkeyzhou/article/details/8609360
1 背景簡介
H330S模組整合海興HXE110/HXE310電錶後出現批量無法上線,問題原因在於3G晶片異常(在此不做詳細描述),由於客戶現場電錶大部分已經安裝,考慮拆裝成本問題需要遠端升級。
3G晶片支援foat遠端升級,通過控制晶片或主機向3G晶片下發AT指令,啟用ppp撥號同時繫結併發伺服器IP和埠,3G晶片會主動連線併發FTP伺服器進行報文互動升級。WINDOWS版本併發伺服器已開發,由於客戶現場大部分為LINUX伺服器,所以要求開發出LINUX平臺下用於H330S升級伺服器程式。
2 整體框架說明
2.1 裝置關係圖
主要有ZTE主站抄表控制系統,通過網頁伺服器控制電錶系統和MCU版本升級程式下發,電錶HXE310、HXE110安裝覆蓋整個國家,FTP伺服器為LINUX虛擬機器,頻寬和記憶體配置良好位於能源公司機房。
2.2 升級基本流程
如下圖所示,從主站上匯入MCU升級程式並觸發MCU升級事件,主站會下發MCU升級包到電錶主控晶片MCU,電錶靠3G晶片上網傳輸資料。MCU升級完成後重啟裝置同時檢測3G晶片版本,若非指定版本則控制3G晶片升級,下發FTP 伺服器IP和埠,3G晶片自動與FTP服務程式進行連線升級,資料中斷有重連機制。
3 Linux伺服器程式設計
3.1 需求說明
1.升級3G晶片併發數量理論值1000個
2.與3G晶片資料包互動穩定採用TCP/IP模型
3.執行環境中CPU 2核以上,記憶體高於1G,上行頻寬高於2M
3.2 伺服器模型選型
3.2.1 Select
Select實現I/O埠複用是通過輪詢檢測I/O事件實現,檔案描述符由於機制限制為1024直接限制併發數,I/O事件檢測有三種讀事件、寫事件、異常事件。分別對應讀、寫、異常三個字符集。
#include <sys/select.h>
int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);
3.2.2 Epoll
Epoll I/O多路複用技術是在2.6核心中提出的,是之前的select和poll的增強版本。相對於select和poll來說,epoll更加靈活,沒有描述符限制。epoll使用一個檔案描述符管理多個描述符,將使用者關係的檔案描述符的事件存放到核心的一個事件表中,這樣在使用者空間和核心空間的copy只需一次。
兩種工作模式如下:
LT模式:當epoll_wait檢測到描述符事件發生並將此事件通知應用程式,應用程式可以不立即處理該事件。下次呼叫epoll_wait時,會再次響應應用程式並通知此事件。
ET模式:當epoll_wait檢測到描述符事件發生並將此事件通知應用程式,應用程式必須立即處理該事件。如果不處理,下次呼叫epoll_wait時,不會再次響應應用程式並通知此事件。
ET模式在很大程度上減少了epoll事件被重複觸發的次數,因此效率要比LT模式高。epoll工作在ET模式的時候,必須使用非阻塞套介面,以避免由於一個檔案控制代碼的阻塞讀/阻塞寫操作把處理多個檔案描述符的任務餓死。
未採用原因是由於短時間內未調通,該模式最優。不支援windows,linux核心2.6以上,移植性差。
3.2.3 執行緒池
1.程序中建立執行緒的限制
預設情況下,一個執行緒的棧要預留1M的記憶體空間,而一個程序中可用的記憶體空間只有2G,所以理論上一個程序中最多可以開2048個執行緒,但是記憶體當然不可能完全拿來作執行緒的棧,所以實際數目要比這個值要小。
2.資源消耗及要求過高,包括記憶體及處理器,執行緒建立與銷燬,資源分配與釋放在實現上比較麻煩
3.短期除錯未實現,未採用
3.3 FTP服務程式框架
3.3.1 TCP/IP建立連線
流程圖如下:
Step1:ftp server主函初始化
Step2:ftp server建立TCP/IP服務端模型
Step:3:3G modem與FTP進行TCP/IP三次握手
Step4:建立連線後按foat協議棧協議互動升級
3.3.2 FTP SERVER實現
Step1:入參檢測,具體格式如下
./gserver 4 10.0.25.151 5050 500 H330S_V2H.00.23.bin modem_success.xls
arg1: Service program of the executable (./gserver)
arg2: Output log level set(default 4)
arg3: Server ip address (eg. xxx.xxx.xxx.xxx) , note that 127.0.0.1 is not allowed
arg4: Server port for upgrade service(eg. 8031), note that this port must be different from the one used by DMS
arg5: The maximum number of access(eg. 50), note that this parameter is affected by the network bandwidth and CPU computing performance
arg6: Upgrade file name (eg. H330S_V2H.00.23.bin)
arg7: The upgrade log file(eg. modem_success.xls) , module's upgrading log will be append to this file
Step2:程式初始化
Set_print_log:設定列印級別,0-4一共五個級別,對除錯資訊,過程資訊,錯誤提示,異常資訊,重要日誌做出區分。
loadUpdateFiles:載入升級檔案到記憶體,先建立副本檔案,後將副本匯入到記憶體。以共享記憶體方式實現多個事件讀取升級檔案,保證原檔案不被破壞。
Malloc(events):初始化events全域性結構體,該結構體的功能是儲存所有單個連線客戶端的重要屬性,包括套接字,ip,port,sn,imei,開始時間,結束時間等
Step3:建立TCP/IP伺服器端模型,等待客戶端連線
略
Step4:while迴圈檢測接入客戶端
Select:從讀寫字符集檢測事件,帶阻塞。包含三種字符集,讀事件、寫事件、異常事件
Accept:新接入客戶端,將fd寫入讀字符集和寫字符集
Recv:非新接入客戶端,呼叫協議棧函式處理業務,若為升級完成指示0X14,從讀寫字符集中刪除客戶端fd
3.3.3 守護程序實現
Step1:手動遠端到ftp 伺服器執行./runstart.sh &後臺執行
Step2:若指令碼或程式已經執行,提示已經執行或請執行runstop.sh停止程式後再次執行
Step3:若程式執行失敗,埠被佔用,大量連線未釋放導致繫結失敗,執行runstop.sh
Step4:while迴圈檢測,120s檢測一次若程式異常退出,無可執行程式程序則嘗試執行,若失敗等120s再次嘗試。若程式正常執行,則跳過