1. 程式人生 > >linux併發伺服器設計

linux併發伺服器設計

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