作者 | beyondma 責編 | 張文
來源 | CSDN 博客
頭圖 | CSDN 下載自視覺中國
最近筆者遇到這樣一個相對比較疑難的事件,某個在 Linux 下運行的殺毒軟件啟動後,在某些情況下 CPU 佔用率會持續升高,而且在交易量較高的情況下極易復現。而奇怪的是,我們之前已經對於殺毒軟件的 CPU 使用率進行了上限限定。出現這樣異常事件表明:殺毒軟件並沒有執行之前設定的資源佔用控制策略,CPU 使用率始終持續異常偏高。
分析下來這個事件還是很有借鑑意義的。
由於此事件涉及一些敏感信息,具體不便公開的細節就不透露了,僅把可以公開的情況梳理一下,供各位讀者參考。
首先我們先明確一下鉤子(hook)函數的概念,簡單來講這就是一類改變其它函數行為的函數。舉個簡單的例子,我每次進入會議室的時候都是直接推開門然後進入的,但是現在我在進入門之前要先向向會議室主持人申請,得到許可才能進入,那麼向主持人申請的動作就被 attatch 到了進入會議室這個動作上了,整個過程就可以簡單的理解為 hook。
我們知道在 Linux 下想改變系統的行為,需要代碼運行的內核態。比如 kprobe、fsnotify 等機制,提供了 root 用戶 hook 到內核代碼的權限,並最終將自己的代碼段 attach 到內核調用中。
CPU 使用率過高的原因分析
經確認這款殺毒軟件的 CPU 佔用率控制模型如下圖,其守護模塊會定時判斷 agent 資源使用情況,如果超標則將釋放掃描模塊使用的 CPU 與內存資源。
但是具體分析下來,這樣的機制在 IO 頻繁的系統上存在缺陷,具體原因掃描模塊在內核態下執行時下無法釋放 CPU 資源。
分析過程如下:
經確認殺毒軟件 agent 在行為監測時,在進程將文件加載到內存前,會使用 hook 技術對於 open 等系統調用進行 attach,確定加載的文件不含惡意代碼後,才允許進程加載該文件。因此在 Linux 內核找到系統調用的 attatch 機制的相關代碼進行分析。
1. 系統調用中 sys_open 函數,使用 fsnotify 機制對於 attach 注入到 sys_open 函數的進程進行回調通知。(具體代碼位置在 kernel/open.c)
2. attach 到 sys_open 的代碼執行過程始終是處於內核態中的,同時 Linux 的 fsnotify 機制也會加內核鎖,在內核鎖解鎖前該進程無法釋放 CPU,不能被打斷。(具體代碼位置在 kernel/fsnotify.c)
殺毒軟件掃描模塊 attach 內核函數的機制與 fsnotify 類似,因此其掃描模塊在進行行為檢測時會在內核態執行且不能被打斷,而在系統中原本就有大量 IO 操作的情況下,守護模塊將失效。
在 POC 測試時,該殺毒軟件在文件掃描時其 CPU 佔用率始終不高,這其中的原因是由於在掃描文件時該殺毒軟件全部運行於用戶態下,不存在內核態運行的情況,因此守護模塊可正常調節 CPU 使用情況。
解決方案淺析
先說一下實測結論:在加入 attach 延時操作後,IO 吞吐量巨幅下降。經訪照該殺毒軟件的機制進行實測模擬,在內核 sys_open 函數 attach 加入延時操作,觀察對於系統 IO 的影響。
在加入將內核 sys_open 延時一倍的操作後,我在華為的在鯤鵬 4C/8G 的平臺實測上,每秒鐘文件打開、關閉文件操作的次數,由每秒 867次 的峰值下降到了 72 次,出現了 90%以上的下降。這可能與內核鎖的雪崩效應有關。
經確認,在之前的版本之所以沒有出現問題,是由於當守護進程在確認 CPU 調節失效後會對自身 agent 進行整體自毀操作(modelu_exit),因此不會觸發類似於 CPU 佔用率持續升高的案例。
那麼針對這樣的機制具體的解決方案如下:
對於內核態代碼執行,加入全局併發數限制,對於所有執行在內核態的掃描線程,進行全局併發鎖限制,具體併發數的設置還需要進行進一步測試後得出結果,在鯤鵬 4C/8G 的平臺上測試最大併發數設置為 4 基本不會對系統正常調用產生影響,建議先將系統 CPU 個數設定為最大併發數,進行測試。
對於對於內核態代碼執行加入每秒執行次數限制,對於所有執行在內核態的掃描線程,進行全局的執行次數限制,加入執行令牌,每秒執行次數不應該大於最大 IO 數量的 10%,在此方案下也可避免對於系統正常調用的影響。
加入掃描任務調度機制:避免在內核態執行耗時的掃描任務,只是快速收到系統的 open 調用指令後,將相關的掃描任務加入調試隊列,就立刻返回,在用戶態統一執行掃描任務,也可避免由於代碼長時間運行於內核態造成的問題。
聲明:本文為作者獨立觀點,不代表 CSDN 立場。
程序員如何避免陷入“內卷”、選擇什麼技術最有前景,中國開發者現狀與技術趨勢究竟是什麼樣?快來參與「2020 中國開發者大調查」,更有豐富獎品送不停!
轉載請超鏈接註明:頭條資訊 » Linux 下殺毒軟件 CPU 佔用率為何持續升高
免責聲明 :非本網註明原創的信息,皆為程序自動獲取互聯網,目的在於傳遞更多信息,並不代表本網贊同其觀點和對其真實性負責;如此頁面有侵犯到您的權益,請給站長發送郵件,並提供相關證明(版權證明、身份證正反面、侵權鏈接),站長將在收到郵件24小時內刪除。