1. 程式人生 > >linux並發服務器設計

linux並發服務器設計

per html tail dset 綁定 屬性 jpg 一次 激活

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再次嘗試。若程序正常運行,則跳過

linux並發服務器設計