一種高并發平臺服務器的數據處理的方法
【專利摘要】本發明涉及對物聯網后臺服務器的數據的高并發處理。本發明將接收到字節型數據通過JNI接口發送給服務器內置的動態連接庫的收發單元,由其將當前數據存入空閑數據緩沖區當填滿后,將其標記為飽和并空閑處理單元發送處理通知;對應處理單元讀取數據并將當前數據緩沖區鎖定,以及將自身狀態標記為忙;然后調用并行指令進行數據處理并將處理結果存入結果緩沖區,處理完畢后,將當前數據緩沖區標記為空閑,以及將自身狀態標記為空閑;收發單元讀取處理結果,并通過JNI接口將其發送給服務器的物理量數據庫。本發明能顯著提高SSH架構的物聯網后臺服務器的數據處理能力,既使用了java語言的良好網絡能力,又利用了服務器CPU本身的處理能力。
【專利說明】
一種高并發平臺服務器的數據處理的方法
技術領域
[0001] 本發明涉及物聯網技術領域,具體涉及對物聯網后臺服務器的數據的高并發處 理。
【背景技術】
[0002] 目前,對于物聯網設備,人們普遍關心的是終端的采集和發送功能,由于終端的微 控制器處理能力比較弱,一般只做些簡單分析,后臺服務器由于有大量終端進行通信,它也 只是對數據進行處理后進行存儲,并以適當方式向用戶顯示。
[0003] 對于物聯網后臺服務器的架構,一般采用SSH(struts2+spring+hibernate)架構, 即利用java語言良好的網絡性能,實現對大量的連接進行高并發處理,即通過java語言所 編寫的網絡數據接口接收物聯網采集端發送的數據后,通過調動java語言的JVM( java虛擬 機)的相關函數對接收的字節型數據進行高并發處理并存入物聯網后臺服務器的預設物理 量數據庫中,得到能用于用戶顯示的處理結果。而物聯網采集端的數據一般的特點是采用 單字節,雙字節或整型數表示物理量,當SSH架構的物聯網后臺服務器通過網絡數據接口接 收到物聯網采集端發送的數據后,需要將收到的字節型數據轉換成浮點數,然后做浮點數 的系數乘法,最后基于偏移量的加法操作等數據處理才能變成真正的物理量(可直接用于 向用戶顯示),以雙字節為例,基于java語言實現對接收數據進行數據處理時,通過調動 java語言的JVM的相關函數實現轉換、系數相乘和偏移量處理得到物理量,即:
[0004] 物理量
*系數+偏移量
[0005] 對于java語言,它的優勢在于跨平臺和網絡性能,但數據處理,尤其高并發數據處 理是其弱項,當涉及高并發數據,大數據量到來時,其數據的處理更是系統的瓶頸。
【發明內容】
[0006] 本發明的發明目的在于:為了克服采用SSH架構的物聯網后臺服務器在基于java 語言對接收數據進行數據處理,得到對應的真實物理量時,java語言的處理能力不足的技 術問題,提供一種高并發平臺服務器的數據處理的方法,既能使用java語言的良好網絡能 力,又能提高平臺服務器的處理能力。
[0007] 本發明的一種高并發平臺服務器的數據處理的方法,包括下列步驟:
[0008] 當SSH架構的物聯網后臺服務器通過網絡數據接口(由java語言編程實現)接收到 物聯網采集端發送的數據后,將表示物理量的字節型數據通過JNI接口(Java Native Interface,java本地接口)發送給物聯網后臺服務器內置的動態連接庫,優選的,動態連接 庫基于C語言編程實現;其中,動態鏈接庫包括收發單元、數據緩沖區、處理單元和結果緩沖 區,且處理單元和數據緩沖區的初始狀態為空閑;
[0009] 收發單元通過JNI接口接收字節型數據,并選擇狀態為空閑的數據緩沖區存入接 收的字節型數據,同時將當前訪問的數據緩沖區鎖定,當數據填滿后,收發單元將當前訪問 的緩沖區標記為飽和,并向狀態為空閑的處理單元發送數據處理通知;
[0010] 收到數據處理通知的處理單元從狀態為飽和的數據緩沖區讀出數據,并將當前訪 問的數據緩沖區鎖定,以及將自身狀態標記為忙;處理單元調用并行指令進行數據處理并 將處理結果存入結果緩沖區;數據處理完畢后,將當前訪問的數據緩沖區標記為空閑,以及 將自身狀態標記為空閑;收發單元讀取結果緩沖區的處理結果,并通過JNI接口將處理結果 發送給物聯網后臺服務器的物理量數據庫。
[0011] 本發明的主要思想是把數據由單個處理變為成批處理,將采用SSH架構的物聯網 后臺服務器的數據處理通過調用并行指令進行數據處理(如將字節型數據轉換成浮點數, 對浮點數的系數相乘,基于偏移量的加法操作等),例如調用SIMD(匯編中的單指令多數據) 指令對接收的字節型數據進行數據處理。X86或X64架構是一款功能強大的處理器,Intel或 AMD的主流處理器都支持SSE(Streaming S頂D Extension,流式SHTO擴展)的指令集,因此 可以采用SSE指令完成對字節型數據的數據處理,從而顯著提高物聯網后臺服務器的數據 處理能力。以SSE指令為例,其涉及的數據處理的并行指令序列如下表所示:
[0013] 綜上所述,由于采用了上述技術方案,本發明的有益效果是:顯著提高SSH架構的 物聯網后臺服務器的數據處理能力,既使用了 java語言的良好網絡能力,又利用了服務器 CHJ本身的處理能力。
【具體實施方式】
[0014] 為使本發明的目的、技術方案和優點更加清楚,下面結合實施方式,對本發明作進 一步地詳細描述。
[0015]首先,在采用SSH架構的物聯網后臺服務器(服務器使用X86或X64的平臺,能夠將 大量的物聯網數據(字節型數據)存入數據緩沖區)中內置由C語言編程實現的動態連接庫。 該動態連接庫包括1個收發單元、n個數據緩沖區(可基于當前處理對象實時調整數據緩沖 區的個數)、m個處理單元(可以根據處理器個數調整)和1個結果緩沖區(隊列的形式,對處 理結果實行先進先出),且n>m>l。具體實現時,收發單元、處理單元以線程的方式實現,為 了便于后續描述,將收發單元、處理單元用收發線程、處理線程來表述,其初始狀態均置為 空閑。
[0016]本發明中,網絡數據接口(基于java編程實現)收到字節型數據后,并不直接處理, 而是通過JNI接口發給動態連接庫的收發線程,收發線程在狀態為空閑的數據緩沖區中隨 機選擇一個作為當前訪問數據緩沖區,將當前接收的字節型數據存入當前訪問數據緩沖區 直到被飽和,此時將當前訪問數據緩沖區的狀態標記為飽和,同時向空閑狀態的處理線程 發送數據處理通知消息。在收發線程訪問一個數據緩沖區時,需將其鎖定,即除當前操作的 線程外,限制其他線程對當前訪問數據緩沖區的訪問。
[0017] 收到數據處理通知消息的處理線程,則首先對飽和狀態的數據緩沖區加鎖,禁止 其它線程訪問,然后調用并行指令處理,對于X86或X64平臺的服務器,可以使用MMX或SSE指 令來并行進行數據處理,數據處理完成后,將處理結果存入結果緩沖區,并給當前數據緩沖 區解鎖,同時標記其狀態為空閑。
[0018] 最后,由收發線程將結果緩沖區的數據基于先進先出的讀取順序讀出并通過JNI 接口存入物聯網后臺服務器的物理量數據庫。
[0019] 在使用X86或64位平臺(物聯網后臺服務器)的SSE指令進行數據處理時,由于java 的跨平臺特性,SSH高并發架構可以是windows平臺也可以是linux平臺,而C語言編寫的動 態連接庫在windows下是dll格式,在linux下是so格式,其均能通過JNI接口供java層調用。 SSE指令可以是獨立的匯編文件也可以嵌入到C語言之中。指令的格式可以是intel格式也 可以是AT&T格式,取決于所使用的系統和編譯器。
[0020] 實施例
[0021] 以linux平臺為例,選用是64位Ubuntu,版本為12.04,開發工具為eclipse 4.3,C 語言編譯器用的是gCC(linux下的C編譯器),版本為4.8.4。數據處理對象以車聯網的CAN (Controller Area Network)總線為例,車載0BD終端(以下簡稱終端)將原始的CAN報文信 息發到物聯網后臺服務器(以下簡稱服務器),報文內容符合SAE J1939-71協議,下表給出 了以發動機溫度和油壓兩條報文示例。
[0024] 在以上兩個報文中,每個報文有8個字節,第一個報文中字節1和2分別為冷卻劑溫 度和燃料溫度,都為單字節表示的物理量,字節3和4為雙字節表示的發動機溫度。第二個報 文都是單字節表示的油壓。這兩個報文有8個字節需要處理。
[0025] 首先java中的minaServer( java中常用的網絡通信框架)通過NioSocketAcceptor ()方法創建一個非阻塞的物聯網后臺服務器端的socket,并調用bindO方法監聽8011端口 接收車載終端的socket請求。
[0026]在Socket連接建立后,服務器的業務邏輯線程(服務器的現有處理線程)將接收到 的報文保存到阻塞隊列BlockingQueue〈Byte>中。
[0027] 服務器中的數據處理線程池中的消費者線程INFODeal(服務器的現有處理線程) 的實例獲取阻塞隊列中的報文數據并通過JNI接口調用動態鏈接庫進行數據解析。JNI模塊 中的交互類Datalnteract中的4個本地方法:
[0028] (1)數據傳遞:將數組buf (用于存放表示物理量的字節型數據)傳遞給底層c語言 處理,即將字節型數據傳遞給基于C語言編程實現的動態鏈接庫;
[0029] (2)初始化:根據終端連接數(size)返回buffer長度,buffer的長度可調;
[0030] (3)結果讀取:從結果緩沖區讀取處理結果;
[0031] (4)退出:服務器關閉時釋放底層分配的緩沖區空間。
[0032] 本實施例中,動態鏈接庫設置8個數據緩沖區,6個處理線程,每個數據緩沖區有8 個單元隊列,每個單元隊列對應CAN報文中對應的字節,各單元隊列的長度可自適應確定, 本實施例中將單元隊列的長度設置為4096,即各單元隊列中的數據由4096個字節組成,每 個字節所對應的終端記錄在預設數組中。通過JNI接口,對服務器通過網絡數據接口傳過來 的字節型數據,由動態連接庫的接收線程將其依次存入各個對應的單元隊列中,當單元數 據達到4096時,接收線程標記該數據緩沖區的狀態為飽和,同時加鎖后通知狀態為空閑的 處理線程來處理。以處理發動機油溫的字節為例,將報文1的第3和4字節對應的單元隊列 (分別稱為canEE_3和canEE_4隊列)依次讀入SSE指令的XMM寄存器中,系數和偏移量也讀到 XMM寄存器中,然后啟動SSE指令進行數據處理。數據處理過程中,將canEE_3和canEF_4的4 個字節分別讀入寄存器單元xmmO和xmml中,然后用punpcklbw指令將其拼接成4個短整型 數,再用punpcklwd指令將其擴展成4個整型數,接著由cvtdq2ps指令轉換成浮點數,最后進 行浮點數乘法和加法操作。
[0033] 完成一次4個字節型數據的數據處理后,可循環向xmmO和xmml中讀入,直到單元隊 列中的字節型數據處理完畢。
[0034]對于單字節物理量,可以將xmml清空,然后操作方式同上述方式一致;對于整型數 物理量,須將高16位數據按照上述方式拼接后,再使用punpcklwd指令與低16位拼接,其余 操作都是一樣。
[0035]數據處理后的處理結果存放在結果緩沖區,等待java函數來取,即通過JNI接口將 處理結果讀取到物理數據庫中。
[0036]性能比較:
[0037] 服務器配置為:CPU(AMD Athon 4核)、內存(8G)、操作系統(Ubuntu 12.04)、應用 軟件(t〇mcat7.0)。在進行數據處理時,共選取15-20條CAN報文,平均每個終端每秒發送132 個字節的數據,在模擬多個終端測試時,性能對比如下:
[0039] 從上表可知,當終端數超過2000以后,使用純java方式的CPU的使用率維持在20% 左右,但此時丟包嚴重,很多數據沒有來的及處理。因此若只采用java方式處理,則當終端 數超過2000個時,系統就開始出現丟包情況,但CPU的利用率卻只停留在20 %左右,這是因 為java中的浮點數運算要通過java虛擬機來做,要調用大量其它資源,造成CPU的較長時間 的等待,而且多核的功能沒有發揮出來。而發明的方案中,java只負責網絡接收,數據處理 由C+SSE指令完成,同時設置有多個數據緩沖區,并分配了多處理線程來執行對字節型數據 的數據處理,可以充分使用CPU的功能,即使終端數目達到10000,系統依然能夠處理。同時, 本發明的方案還有較強的擴展能力,如果終端太多處理不過來,則可以增加 CHJ的核數或個 數,增大數據緩沖區來完成,可以根據核數分配多個處理線程進行數據處理,充分利用系統 的性能。
[0040] 以上所述,僅為本發明的【具體實施方式】,本說明書中所公開的任一特征,除非特別 敘述,均可被其他等效或具有類似目的的替代特征加以替換;所公開的所有特征、或所有方 法或過程中的步驟,除了互相排斥的特征和/或步驟以外,均可以任何方式組合。
【主權項】
1. 一種高并發平臺服務器的數據處理的方法,其特征在于,包括下列步驟: 當SSH架構的物聯網后臺服務器通過網絡數據接口接收到物聯網采集端發送的數據 后,將表示物理量的字節型數據通過JNI接口發送給物聯網后臺服務器內置的動態連接庫; 所述動態鏈接庫包括:收發單元、數據緩沖區、處理單元和結果緩沖區;其中,處理單元 和數據緩沖區的初始狀態為空閑; 收發單元通過JNI接口接收字節型數據,并選擇狀態為空閑的數據緩沖區存入接收的 字節型數據,同時將當前訪問的數據緩沖區鎖定,當數據填滿后,收發單元將當前訪問的緩 沖區標記為飽和,并向狀態為空閑的處理單元發送數據處理通知; 收到數據處理通知的處理單元從狀態為飽和的數據緩沖區讀出數據,并將當前訪問的 數據緩沖區鎖定,以及將自身狀態標記為忙;處理單元調用并行指令進行數據處理并將處 理結果存入結果緩沖區;數據處理完畢后,將當前訪問的數據緩沖區標記為空閑,以及將自 身狀態標記為空閑; 收發單元讀取結果緩沖區的處理結果,并通過JNI接口將處理結果發送給物聯網后臺 服務器的物理量數據庫。2. 如權利要求1所述的方法,其特征在于,所述動態連接庫基于C語言編程實現。3. 如權利要求1或2所述的方法,其特征在于,動態連接庫的處理單元通過調用匯編中 的單指令多數據S頂D指令執行數據處理。
【文檔編號】G06F9/38GK105912306SQ201610225491
【公開日】2016年8月31日
【申請日】2016年4月12日
【發明人】魯曉軍
【申請人】電子科技大學