開源項目 OpenHarmony 是每個人的 OpenHarmony
蔣衛峰
深圳開鴻數字產業發展有限公司
OS內核開發工程師
iperf3主要的功能是測試基于特定路徑的帶寬,在客戶端和服務器端建立連接(三次握手)后,客戶端發送一定大小的數據報并記下發送的時間,或者客戶端在一定的時間內發送數據并記下發送的總數據。帶寬的大小等于發送的總數據除以發送的總時間。對服務器端來說,在連接建立時間內,接收的總數據除以所花時間即為服務器端所測得的帶寬。
iperf3測試UDP的性能時,客戶端可以指定UDP數據流的速率。客戶端發送數據時,將根據客戶提供的速率計算數據報發送之間的時延,客戶還可以指定發送數據報的大小。每個發送的數據報包含一個ID號,用來唯一地標識該報文。服務器端則根據該ID號來確定數據報丟失和亂序。當把UDP報文大小設置可以將整個報文放入IP層的包(packet)內時,那么UDP所測得的報文丟失數據即為IP層包的丟失數據。這提供了一個有效的測試包丟失情況的方法。數據報傳輸延遲抖動(Jitter)的測試由服務器端完成,客戶發送的報文數據包含有發送時間戳,服務器端根據該時間信息和接收到報文的時間戳來計算傳輸延遲抖動。傳輸延遲抖動反映傳輸過程中是否平滑。由于它是一個相對值,所以并不需要客戶端和服務器端時間同步。
由上介紹我們可以知道iperf3的功能增加了操作系統網絡度量的能力,而攜帶Liteos_A內核的OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)操作系統目前還不支持這個功能,特此嘗試把iperf3移植到支持Liteos_A內核的OpenHarmony操作系統中,并作此文分享一些心得。
二、iperf3移植過程
iperf3可以運行在Linux和Windows平臺下,其使用了標準的POSIX接口,因此將iperf3移植到Liteos_A上,目前Liteos_A支持用戶態和內核態的命令,這個也造成了移植的很大困難,所以以下將2種添加命令的方式都記錄下,供讀者參考。
1.確定庫的類型
OpenHarmony有如下幾種目標類型:
executable: 生成可執行文件,對于Liteos_A,在目錄/bin下可以找到可執行文件
shared_library: 生成.dll或.so動態鏈接庫、對于Liteos_A,在目錄/lib或者 /usr/lib下可以找到動態庫
static_library: 生成.lib或.a靜態鏈接庫
group: 生成依賴關系組
根據以上幾種類型的描述可知,將iperf3移植成executable類型的組件最為合適。
2.添加庫到工程中
將源碼下載到Linux下并解壓,執行./configure,生成iperf_config.h,將iperf3的源碼拷貝到OpenHarmony代碼庫中合適的位置,如下將iperf3添加到/third_party目錄下。 ? 需要注意的是非內核態的庫不能添加到內核的目錄下,不然編譯和調試過程中相關的頭文件可能找不到。在/vendor/廠商名/產品型號/config.json中的某一子系統下添加組件。 ? ? 在 /build/lite/components/子系統名.json中添加組件,如下: ? ? 3.編寫配置BUILD.gn ? 移植的iperf3代碼目錄下需要提供一個gn文件,指明需要編譯的代碼。此文件可以通過import組件模板函數。一方面,很多引用到的頭文件需要逐個添加到系統BUILD.GN中去,import組件模板函數可以省去很多麻煩;另一方面,頭文件有多個,最終還很難確定是哪一個,使用系統配置好的組件模板函數,可以自動匹配。
4.程序啟動入口:將三方庫添加到shell命令
1) 內核態的shell功能不符合POSIX標準,僅供調試使用,本文特記錄下其添加命令的方法,此方法分為靜態和動態兩種方式,添加方式如下:
① 命令源代碼包含如下頭文件
#include "shell.h" #include "shcmd.h"
② 靜態注冊命令方式
第一步:調用SHELLCMD_ENTRY(l, cmdType, cmdKey, paraNum, cmdHook),在源文件最后增加這個調用即可。
第二步:在鏈接選項中添加鏈接該新增命令項參數。
即在kernel/liteos_a/tools/build/mk/liteos_tables_ldflags.mk中增加相應選項,SHELLCMD_ENTRY的第一個參數前加-u。
此方法添加的shell,在代碼編譯階段就已編譯進去了,其實現原理是利用了編譯器的section特性(也是代碼模塊化的重要手段),將所有shell命令相關功能都放在一段連續的地址空間,將SHELLCMD_ENTRY宏一層層展開,即可得到下面原型。
LOS_HAL_TABLE_BEGIN(g_shellcmd, shellcmd); //段的起始tag LOS_HAL_TABLE_END(g_shellcmdEnd, shellcmd); //段的結束tag SHELLCMD_ENTRY(l,cmdType,cmdKey,paraNum,cmdHook)
如下是編譯后生成的map文件中shell段的部分,可以觀察到已經通過此方法加入的shell命令。
③ 動態注冊命令方式
此類方式是在代碼運行階段動態的注冊,osCmdReg本身是一個函數,在命令初始化的源代碼增加此函數調用。
UINT32 osCmdReg(CmdT ype cmdType, CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc)函數原型在/kernel/liteos_a/shell/full/src/base/shcmd.c 可以找到,基本原理是將動態注冊的shell命令加入到動態shell命令鏈表空間。
2)用戶態的shell不用手動添加
添加目標的方式為executable,將程序下載到目標板上,在/bin目錄下找到可執行的文件,只要在串口助手中輸入 ./bin/可執行文件名,內核即可動態加載可執行的文件(或者輸入exec /bin/可執行文件名)。
三、iperf3使用方式介紹
使用iperf3測試時必須將一臺主機設置為客戶端,一臺主機設置為服務器。在Linux環境或者Windows或者OpenHarmony shell交互窗口輸入iperf3 -h可以獲取iperf3的幫助信息。以下介紹幾種常見的使用方式:
1.iperf3測試TCP
在默認的情況下,iperf3客戶端與指定的監聽5201端口的iperf3服務器建立一個TCP會話。
服務端:iperf3 -s 客戶端:iperf3 -c 服務器IP (默認測試10秒),使用t來設置測試時間,單位是秒。 例如:iperf3 -c 192.168.99.74 -t 20運行結果如下: ? 2.iperf3測試UDP iperf3測試UDP性能時,客戶端可以指定UDP數據流的速率??蛻舳税l送數據時,將根據客戶端提供的速率計算數據報發送之間的時延。 客戶端還可以指定發送數據報的大小。每個發送的數據報包含一個ID號,用來唯一標識報文,服務器端根據該ID號來確定數據報丟失和亂序。
當把UDP報文大小設置可以將整個報文放入IP層的包(packet)內時,那么UDP所測得的報文丟失數據即為IP層包的丟失數據,這提供了一個有效的測試包丟失情況的方法。
數據報傳輸延遲抖動(Jitter)的測試由服務器端完成,客戶發送的報文數據包含有發送時間戳,服務器端根據該時間信息和接收到報文的時間戳來計算傳輸延遲抖動。傳輸延遲抖動反映傳輸過程中是否平滑。由于它是一個相對值,所以并不需要客戶端和服務器端時間同步。測試過程如下:
服務端:iperf3 -s -p 6868 (設定服務端監聽6868端口) Liteos_A shell客戶端:./bin/iperf3 -c 172.17.5.159 -p 6868 -u -b 100M測試結果: ? - Jitter(延時變化):用iperf3 UDP測試來量度 - 數據報丟失:用iperf3 UDP測試來量度
- 帶寬:通過TCP測試來量度
3.反向帶寬測試
服務端使用的命令不變,客戶端需要加上參數-R,在幫助信息中,可以看到-R的信息是run in reverse mode (server sends, client receives)
服務端:iperf3 -s -p 6868 客戶端:./bin/iperf3 -c 172.17.5.159 -p 6868 -u -b 100M -R測試結果如下: ? 4.同步雙向帶寬測試 客戶端加上命令參數 -bidir
服務端:iperf3 -s -p 6868 客戶端:./bin/iperf3 -c 172.17.5.159 -p 6868-u-b100M-bidir測試結果如下: ?
四、注意事項和遇到的問題及解決方法
1. Hi3516有三種下載程序的方式:串口、USB、網口轉USB。推薦使用USB來下載程序,使用串口來調試程序。
2. DevEco Device Tool工具使用USB燒錄Hi3516DV300鏡像時失敗,怎么解決? ? 解決措施: 出現這個問題,主要是因為開發者將Device Tool工具安裝在系統盤符,在燒錄大文件時會因為沒有權限導致失敗,可以根據以下操作解決: ●在Windows平臺找到安裝目錄,如圖。鼠標右鍵,選中屬性。 ●?依次操作,步驟5將紅框中兩個選項都勾選上。 ? ? 3. Hi3516如果攜帶操作系統是支持Linux內核的OpenHarmony,第一次下載時,需要格式化,下載完成后,系統啟動到boot,就不會引導整個系統應用程序,這時需要點擊如下菜單,然后重新拔插USB才能進入整個系統。 ? ? 4. 在編寫.gn文件時,如果三方組件為executable,那么第三方庫代碼中需要有唯一個入口main函數,最終生成一個可執行的命令。 5. iperf有大版本1,2,3,目前最新的是iperf3,不同的版本間命令參數不同,工作機制有所不同,所以在測試時,服務端和客戶端要求使用相同的大版本。例如iperf3服務端不支持iperf的-u,-命令。 6. 在使用iperf3進行測試過程中,需要關閉防火墻,不然可能不能進行正常測試,可以提前使用ping測試一下網絡是否已通。 7. 公司網絡端的控制也會對測試造成影響,如果測試中發現發送和接收到的數據一直是0,則可能是網絡控制端進行了控制,在拔掉外網絡的情況,測試出來的結果就會很穩定。 8. Hi3516主板作為服務端,輸入iperf3 -s,然后在PC機上啟動客戶端進行測試,發現根本不能進行正常測試,原因也是公司網絡控制導致,解決辦法是將要測試的兩個網絡接口,接到同一交換機下,然后拔掉外網的網線,可以進行正常測試;或者需要IT開發權限,當然如果不是在公司特定網絡環境下,這個現象是不會出現的。 9. Hi3516需要設置網絡才能進行測試,可以使用命令ifconfig來設置,例如: ifconfig eth0?172.17.5.253 netmask 255.255.254.0 gateway 172.17.4.1 10. MSS在OpenHarmony的底層LWIP不支持,在iperf_connect函數中調用getsockopt(test->ctrl_sck, IPPROTO_TCP, TCP_MAXSEG, &opt, &len),會通過系統調用到達kernel層中的/kernel/liteos_a/compat/posix/src/socket.c, 最終走到底層LWIP的lwip_getsockopt_impl接口,在level IPPROTO_TCP下,對于分支TCP_MAXSEG,沒有實現,解決辦法是先屏蔽iperf3對此處的操作。同樣在調用setsockopt(s, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(opt))時,SO_SNDBUF分支在LWIP也未實現,先屏蔽此處,將發送緩沖區設置成和接收緩沖區同樣的大小。 11. Liteos_A未實現延時刪除,所以調用unlink時會出錯,目前處理是先屏蔽此處。 12. Liteos_A對fprintf的實現也不如Linux,Windows好,所以對help命令輸出到stdout上,長字串顯示不出來,解決辦法是使用fputs替換fprintf。
五、總結
本文從iperf3的工作原理、移植過程、使用方式、注意事項四個方面介紹了將iperf3移植到支持Liteos_A內核的OpenHarmony操作系統中的方法,希望本篇文章對開發者有所幫助。 關于OpenHarmony內核的內容,之前我還介紹了內核對象隊列的算法、OpenHarmony LiteOS-M內核事件的運作機制,以及內核IPC機制數據結構,感興趣的讀者可以點擊閱讀:《OpenHarmony——內核對象隊列之算法詳解(上)》、《OpenHarmony——內核對象隊列之算法詳解(下)》、《OpenHarmony——內核對象事件之源碼詳解》、《OpenHarmony——內核IPC機制數據結構解析》。
-
OpenHarmony
+關注
關注
25文章
3744瀏覽量
16473
原文標題:OpenHarmony Liteos_A內核之iperf3移植心得
文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論