Linux kernel · Linux utilities

以 Linux kernel 效能工具 – perf 來分析探討硬體加密之瓶頸

在 前篇文章 有提到 Linux Kernel 密碼學演算法實作流程. 由此得知若由硬體輔助進行密碼學演算法運算 (offloading), 除了不需耗費 CPU 效能外, 也能加快運算速度.

前文也提到許多 ARM SoC 廠商都會將硬體加解密元件放入 SoC 中. 以 Beagleboard [1] 的 SoC – AM335x 為例, TI 有加入處理加解密的元件. 如下圖 [2]

圖片1.jpg

根據 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 % 左右.

2017-05-21_180122.png


2. OpenVPN

接著我們用 iperf3 來測量 OpenVPN 效能, 執行結果如下圖.

可以看到硬體加速的效能遠遠不及軟體運算.

這結果就怪了, OpenVPN 明明呼叫的是 OpenSSL 的 library 來進行加解密函式運算. 但出來的結果卻跟 OpenSSL 差很大.

未命名.png

Test Result Analysis:

分析前, 我們先來看一下 OpenVPN 啟動硬體加速後從底層到上層的執行流程, 如下圖

2017-05-21_181409.png

由流程以及 前篇文章 可知, 硬體加速和軟體運算的差異主要在 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" 上.

圖片2.png

“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

2017-05-28_125745.png

__copy_from_user 以組語來實作, 位於 arch/arm/lib/copy_from_user.S 並呼叫 arch/arm/lib/copy_template.S 下的巨集. 細節詳情可參考 [12][13]


而根據測試結果, 再trace OpenVPN 本身程式並搭配相關文件, 可將 OpenVPN 硬體加密詳細流程畫成下圖

2017-05-21_182927.png

可以看到瓶頸為 memory copy 這裡. 主要是因為 OpenVPN 的硬體加速實作呼叫太多 memory copy 的函式所造成. 其他人也有相關討論.

圖片3.png

雖然說可以透過調整 tun-mtu, fragment, mssfix… 等等的一些方法來優化 OpenVPN 效能, 但比起軟體運算, 效能還是會有所差異.

也許換一套 VPN tool 不失為一個好方法. 以 softether [14] 來說, 除了可以相容 OpenVPN protocol, 在硬體加速上也有傑出的效能. 是值得一試的 user space VPN tool.


心得:

想要調校系統, 除了瞭解運作原理外, 搭配合適的調校工具能協助盡早定位問題.

若原有方法因先天限制無法加強效能, 也要考慮是否更換方法以達到原本的目標.


ref:

[1] https://beagleboard.org/

[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

[6] http://www.edn.com/design/systems-design/4399714/3/Hardware-based-cryptography-offers-innovative-solution-for-security

[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

[11] http://events.linuxfoundation.org/sites/events/files/slides/Dma%20Optimization%20BayLibre%20Guillene%20v4.pdf

[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/

以 Linux kernel 效能工具 – perf 來分析探討硬體加密之瓶頸 有 “ 5 則迴響 ”

  1. SZ您好,不好意思,有些不了解的地方,

    1. 從圖上只能看出OpenVPN使用OpenSSL有3次Memory Copy的動作進到Kernel,但完全看不出OpenVPN有多次的Memory Copy行為,圖中完全無法體會出文字上的描述。

    2. OpenVPN使用哪一種加解密方式,以這個例子來說都是使用OpenSSL來做SW與HW加解密的對比,而要使用SW還是HW來做加解密,為什麼跟OpenVPN會有關係 ? (從圖上只能看出OpenVPN使用OpenSSL統一的介面來操作加解密, 理應OpenVPN跟硬體完全沒關係)

    1. 1. 抱歉, 因為圖太大, 不好畫, 所以拆成兩張圖. 紫色區塊代表的是 Test Result Analysis 下面那張圖. 它會不斷的從 userspace 送資料進 hardware component

      2. OpenVPN 跟硬體沒關係, 但 OpenVPN 預設使用 OpenSSL 來進行資料加解密[1]. 所以實際上會執行 OpenSSL ~

      有任何問題都歡迎寄信給我討論 😀

      [1]: https://en.wikipedia.org/wiki/OpenVPN

  2. SZ您好,
    所以您的意思是,紫色的區塊,如果OpenVPN選擇支持硬體加解密的話,OpenVPN內部的行為會比使用軟體加解密時,有更多的copy_from_user與copy_to_user的動作嗎 ?

    謝謝您

    1. 無法以一概全. 要看你的使用環境.

      以我的測試環境來說 OpenVPN 呼叫大量 copy_from_user 來進行交換記憶體的動作造成整體網路效能低落.

      但這結果不一定符合你使用的環境甚至是使用的軟體版本. 所以此篇分享著重於 “how to".

      你可以嘗試著找一套 profiling tool [1] 來分析 OpenVPN/ OpenSSL 的行為, 以結果來對照程式, 就會得到答案了 🙂

      [1]: https://en.wikipedia.org/wiki/List_of_performance_analysis_tools

發表迴響