在 前篇文章 有提到 Linux Kernel 密碼學演算法實作流程. 由此得知若由硬體輔助進行密碼學演算法運算 (offloading), 除了不需耗費 CPU 效能外, 也能加快運算速度.
前文也提到許多 ARM SoC 廠商都會將硬體加解密元件放入 SoC 中. 以 Beagleboard [1] 的 SoC – AM335x 為例, TI 有加入處理加解密的元件. 如下圖 [2]
根據 TI 官方文件 [3] 來設定, 即可開始測試.
Test Environment:
- TI AM3352 1GHz
- DDR3 512 MB
- Kernel 4.1
- Cryptodev driver 1.7
- OpenVPN 2.3.4-5+deb8u1
- iperf-3.1.2
- OpenSSL 1.0.1k-3+deb8u2 with cryptodev enabled
- 100Mbit Ethernet
Test case:
1. OpenSSL
OpenSSL 本身即提供測試指令, 以測試 aes-128-cbc 運算指令如下:
openssl speed -evp aes-128-cbc
OpenSSL 執行結果如下圖.
可以看到硬體加速的效能遠遠海放軟體運算. 除此之外, CPU usage 也少了 1x % 左右.
2. OpenVPN
接著我們用 iperf3 來測量 OpenVPN 效能, 執行結果如下圖.
可以看到硬體加速的效能遠遠不及軟體運算.
這結果就怪了, OpenVPN 明明呼叫的是 OpenSSL 的 library 來進行加解密函式運算. 但出來的結果卻跟 OpenSSL 差很大.
Test Result Analysis:
分析前, 我們先來看一下 OpenVPN 啟動硬體加速後從底層到上層的執行流程, 如下圖
由流程以及 前篇文章 可知, 硬體加速和軟體運算的差異主要在 kernel space. 所以使用 kernel profiling tool 來對兩者進行分析.
關於 kernel profiling tool, 內建在 kernel source 中的 perf 是一套相當不錯的工具. 位於 tools/perf/.
perf 使用步驟如下:
1. 開啟 kernel configuration – PERF_EVENTS
2. 進入 tools/perf 編譯 perf
note: 如果沒有修改過 kernel , 可直接透過 apt-get install linux-tools 安裝 perf
3. 使用指令 “perf record “ 分別在軟體運算以及硬體加密程式環境下執行, 並將結果分別存成檔案 跟 .
4. 使用指令 “perf diff " 來比對兩者差異
其他詳細操作設定可參考 [4][5].
透過 perf diff 比對後, 如下圖可得知使用硬體加密相對於軟體運算花了許多時間在 “copy_from_user" 上.
“copy_from_user" 目的是將 user space 的資料拷貝到 kernel space. 若成功則回傳 0
√ copy_from_user 運作原理
copy_from_user 位於 “arch/arm/include/asm/uaccess.h" 中. 如下圖可知, 實作會判斷系統是否有開啟 MMU. 若為沒有 MMU 的系統 (e.g. uclinux) 則是直接執行 memcpy 函式. 若為具備 MMU 的系統, 會先透過 access_ok 函式判斷是否為有效位址, 再進行呼叫 __copy_from_user
__copy_from_user 以組語來實作, 位於 arch/arm/lib/copy_from_user.S 並呼叫 arch/arm/lib/copy_template.S 下的巨集. 細節詳情可參考 [12][13]
而根據測試結果, 再trace OpenVPN 本身程式並搭配相關文件, 可將 OpenVPN 硬體加密詳細流程畫成下圖
可以看到瓶頸為 memory copy 這裡. 主要是因為 OpenVPN 的硬體加速實作呼叫太多 memory copy 的函式所造成. 其他人也有相關討論.
雖然說可以透過調整 tun-mtu, fragment, mssfix… 等等的一些方法來優化 OpenVPN 效能, 但比起軟體運算, 效能還是會有所差異.
也許換一套 VPN tool 不失為一個好方法. 以 softether [14] 來說, 除了可以相容 OpenVPN protocol, 在硬體加速上也有傑出的效能. 是值得一試的 user space VPN tool.
心得:
想要調校系統, 除了瞭解運作原理外, 搭配合適的調校工具能協助盡早定位問題.
若原有方法因先天限制無法加強效能, 也要考慮是否更換方法以達到原本的目標.
ref:
[2] http://www.ti.com/lsds/ti/processors/sitara/arm_cortex-a8/am335x/overview.page
[3] http://processors.wiki.ti.com/index.php/Linux_Core_Crypto_User_Guide
[4] https://perf.wiki.kernel.org/index.php/Main_Page
[5] http://wiki.csie.ncku.edu.tw/embedded/perf-tutorial
[7] http://www.design-reuse.com/articles/36013/cryptography-hardware-platform-for-socs.html
[8] http://comments.gmane.org/gmane.network.openvpn.devel/9937
[9] http://events.linuxfoundation.org/sites/events/files/slides/HWACC_FOR_NFV_fix_v2.pdf
[10] http://www.slideshare.net/BrunoCastelucci/open-ssl-hwaccelbrunocastelucciptbr
[12] https://www.kernel.org/doc/gorman/html/understand/understand007.html
[13] http://blog.rongpmcu.com/copy_from_userfen-xi/
[14] https://www.softether.org/
SZ您好,不好意思,有些不了解的地方,
1. 從圖上只能看出OpenVPN使用OpenSSL有3次Memory Copy的動作進到Kernel,但完全看不出OpenVPN有多次的Memory Copy行為,圖中完全無法體會出文字上的描述。
2. OpenVPN使用哪一種加解密方式,以這個例子來說都是使用OpenSSL來做SW與HW加解密的對比,而要使用SW還是HW來做加解密,為什麼跟OpenVPN會有關係 ? (從圖上只能看出OpenVPN使用OpenSSL統一的介面來操作加解密, 理應OpenVPN跟硬體完全沒關係)
讚讚
1. 抱歉, 因為圖太大, 不好畫, 所以拆成兩張圖. 紫色區塊代表的是 Test Result Analysis 下面那張圖. 它會不斷的從 userspace 送資料進 hardware component
2. OpenVPN 跟硬體沒關係, 但 OpenVPN 預設使用 OpenSSL 來進行資料加解密[1]. 所以實際上會執行 OpenSSL ~
有任何問題都歡迎寄信給我討論 😀
[1]: https://en.wikipedia.org/wiki/OpenVPN
讚讚
SZ您好,
所以您的意思是,紫色的區塊,如果OpenVPN選擇支持硬體加解密的話,OpenVPN內部的行為會比使用軟體加解密時,有更多的copy_from_user與copy_to_user的動作嗎 ?
謝謝您
讚讚
無法以一概全. 要看你的使用環境.
以我的測試環境來說 OpenVPN 呼叫大量 copy_from_user 來進行交換記憶體的動作造成整體網路效能低落.
但這結果不一定符合你使用的環境甚至是使用的軟體版本. 所以此篇分享著重於 “how to".
你可以嘗試著找一套 profiling tool [1] 來分析 OpenVPN/ OpenSSL 的行為, 以結果來對照程式, 就會得到答案了 🙂
[1]: https://en.wikipedia.org/wiki/List_of_performance_analysis_tools
讚讚
了解了,謝謝您
讚讚