來自 Cloudflare 的開發人員
Cloudflare 使用 dm-crypt 來加密用於在 CDN 上快取內容的儲存裝置上的資料。 Dm-crypt 在區塊裝置層級運行,加密寫入 I/O 請求並解密讀取請求,充當區塊裝置和檔案系統驅動程式之間的層。
使用該套件評估 dm-crypt 的性能
起初,人們懷疑在核心密碼系統中使用了低效演算法。 但測試使用了最快的演算法 aes-xts,具有 256 個加密金鑰,其運行「cryptsetup benchmark」時的效能比測試 RAM 磁碟時獲得的結果高出兩倍多。 使用dm-crypt 標誌進行效能調整的實驗沒有產生結果:當使用「--perf-same_cpu_crypt」標誌時,效能甚至下降到136 MB/s,而當指定「--perf-submit_from_crypt_cpus」標誌時,它僅增加至 166 MB/秒。
深入分析操作邏輯發現,dm-crypt 並不像看上去那麼簡單——當FS 驅動收到寫入請求時,dm-crypt 並不會立即處理它,而是將其放入“kcryptd”隊列中,這使得不是立即解析,而是在方便的時候解析。 請求從佇列傳送到 Linux Crypto API 以執行加密。 但由於 Crypto API 使用非同步執行模型,加密也不會立即執行,而是繞過另一個佇列。 加密完成後,dm-crypt 可能會嘗試使用搜尋樹對掛起的寫入請求進行排序
讀取時,dm-crypt 首先向「kcryptd_io」佇列新增一個請求,以從磁碟機接收資料。 一段時間後,資料變得可用並被放置在“kcryptd”佇列中進行解密。
Kcryptd 向 Linux Crypto API 發送請求,後者非同步解密資訊。 請求並不總是經過所有佇列,但在最壞的情況下,寫入請求最多會進入佇列 4 次,讀取請求最多會進入佇列 3 次。 每次對隊列的命中都會導致延遲,這是 dm-crypt 性能顯著下降的關鍵原因。
使用隊列是因為需要在發生中斷的情況下工作。 2005 年,當 dm-crypt 目前基於佇列的操作模型實作時,Crypto API 還不是非同步的。 Crypto API轉為非同步執行模型後,本質上開始使用雙重保護。 也引入了佇列來節省內核堆疊的消耗,但在 2014 年增加佇列之後,這些最佳化就失去了相關性。 引入了額外的佇列“kcryptd_io”來克服大量請求到達時導致等待記憶體分配的瓶頸。 2015年,引入了額外的排序階段,因為多處理器系統上的加密請求可能會無序完成(而不是順序訪問磁碟,而是以隨機順序進行訪問,並且CFQ調度程序無法有效工作)。 目前,當使用SSD硬碟時,排序已經失去了意義,核心中不再使用CFQ調度器。
考慮到現代驅動器變得更快、更智能,對 Linux 核心中的資源分配系統進行了修訂,並重新設計了一些子系統,Cloudflare 工程師
因此,在測試 RAM 磁碟時,dm-crypt 的效能可以提高一倍以上 - 效能從 294 MB/s (2 x 147 MB/s) 增加到 640 MB/s,非常接近裸加密的效能(696 MB /秒)。
在真實伺服器上測試負載時,新實施顯示的效能非常接近在不加密的情況下運行的配置,並且在具有 Cloudflare 快取的伺服器上啟用加密對回應速度沒有影響。 未來,Cloudflare 計劃將準備好的補丁轉移到主 Linux 內核,但在此之前,它們需要重新設計,因為它們針對特定負載進行了優化,並且並未涵蓋所有應用領域,例如低端加密。 - 為嵌入式設備供電。
來源: opennet.ru