26. 匯流排鎖檢測與處理¶
- 版權所有:
© 2021 Intel Corporation
- 作者:
Fenghua Yu <fenghua.yu@intel.com>
Tony Luck <tony.luck@intel.com>
26.1. 問題¶
分割鎖是其運算元跨越兩個快取行的任何原子操作。由於運算元跨越兩個快取行,並且操作必須是原子的,因此係統會在CPU訪問兩個快取行時鎖定匯流排。
匯流排鎖透過對回寫(WB)記憶體的分割鎖定訪問或對非WB記憶體的任何鎖定訪問來獲得。這通常比快取行內的原子操作慢數千個週期。它還會擾亂其他核心的效能,並使整個系統癱瘓。
26.2. 檢測¶
英特爾處理器可能支援以下一種或兩種硬體機制來檢測分割鎖和匯流排鎖。一些AMD處理器也支援匯流排鎖檢測。
26.2.1. 用於分割鎖檢測的#AC異常¶
從Tremont Atom CPU開始,當嘗試分割鎖操作時,分割鎖操作可能會引發對齊檢查(#AC)異常。
26.2.2. 用於匯流排鎖檢測的#DB異常¶
某些CPU能夠在使用者指令獲取匯流排鎖並執行後,透過#DB陷阱通知核心。這允許核心終止應用程式或強制執行節流。
26.3. 軟體處理¶
核心#AC和#DB處理程式基於核心引數“split_lock_detect”處理匯流排鎖。以下是不同選項的摘要
split_lock_detect= |
#AC 用於分割鎖 |
#DB 用於匯流排鎖 |
off |
不執行任何操作 |
不執行任何操作 |
warn (預設) |
核心OOPs 警告每個任務一次,新增延遲,新增同步以防止多個核心並行執行分割鎖。sysctl split_lock_mitigate 可用於避免延遲和同步。如果同時支援這兩個特性,則在#AC中發出警告 |
警告每個任務一次並繼續執行。 |
fatal |
核心OOPs 向用戶傳送SIGBUS。如果同時支援這兩個特性,則在#AC中致命錯誤 |
向用戶傳送SIGBUS。 |
ratelimit:N (0 < N <= 1000) |
不執行任何操作 |
將匯流排鎖速率限制為每個系統範圍內每秒N個匯流排鎖,並警告匯流排鎖。 |
26.4. 用法¶
檢測和處理匯流排鎖可能會在各個領域找到用法
對於構建整合即時系統的即時系統設計人員來說,這至關重要。這些系統在某些核心上執行硬即時程式碼,並在其他核心上執行“不受信任”的使用者程序。硬即時不能承受來自不受信任的程序的任何匯流排鎖,從而損害即時效能。迄今為止,設計人員一直無法部署這些解決方案,因為他們無法阻止“不受信任”的使用者程式碼生成分割鎖和匯流排鎖,從而阻止硬即時程式碼在匯流排鎖定時訪問記憶體。
它對於通用計算也很有用,可以防止訪客或使用者應用程式透過執行帶有匯流排鎖的指令來降低整個系統的速度。
26.5. 指導¶
26.5.1. off¶
停用分割鎖和匯流排鎖的檢查。如果存在以低速率觸發這些事件的舊應用程式,從而不需要緩解,則此選項可能很有用。
26.5.2. warn¶
當檢測到匯流排鎖時,會發出警告,從而可以識別違規應用程式。這是預設行為。
26.5.3. fatal¶
在這種情況下,匯流排鎖是不被允許的,並且該程序將被殺死。
26.5.4. ratelimit¶
指定系統範圍內的匯流排鎖速率限制N,其中 0 < N <= 1000。 這允許每秒高達N個匯流排鎖的速率。 當匯流排鎖速率超過限制時,透過匯流排鎖#DB異常捕獲的任何任務都會透過強制睡眠進行節流,直到速率再次低於限制。
在可以容忍最小影響,但必須防止最終的拒絕服務攻擊的情況下,這是一種有效的緩解措施。 它允許識別違規程序並分析它們是惡意的還是隻是編寫不良。
選擇 1000 的速率限制允許匯流排每秒鎖定最多約七百萬個週期(假設每個匯流排鎖有 7000 個週期)。 在 2 GHz 處理器上,這將大約是 0.35% 的系統減速。