頭條資訊 - 為您提供最新最全的新聞資訊,每日實時更新

Linux 下殺毒軟件 CPU 佔用率為何持續升高

科技數碼 CSDN

作者 | beyondma  責編 | 張文

來源 | CSDN 博客

頭圖 | CSDN 下載自視覺中國

Linux 下殺毒軟件 CPU 佔用率為何持續升高

最近筆者遇到這樣一個相對比較疑難的事件,某個在 Linux 下運行的殺毒軟件啟動後,在某些情況下 CPU 佔用率會持續升高,而且在交易量較高的情況下極易復現。而奇怪的是,我們之前已經對於殺毒軟件的 CPU 使用率進行了上限限定。出現這樣異常事件表明:殺毒軟件並沒有執行之前設定的資源佔用控制策略,CPU 使用率始終持續異常偏高。

分析下來這個事件還是很有借鑑意義的。

由於此事件涉及一些敏感信息,具體不便公開的細節就不透露了,僅把可以公開的情況梳理一下,供各位讀者參考。

首先我們先明確一下鉤子(hook)函數的概念,簡單來講這就是一類改變其它函數行為的函數。舉個簡單的例子,我每次進入會議室的時候都是直接推開門然後進入的,但是現在我在進入門之前要先向向會議室主持人申請,得到許可才能進入,那麼向主持人申請的動作就被 attatch 到了進入會議室這個動作上了,整個過程就可以簡單的理解為 hook。

我們知道在 Linux 下想改變系統的行為,需要代碼運行的內核態。比如 kprobe、fsnotify 等機制,提供了 root 用戶 hook 到內核代碼的權限,並最終將自己的代碼段 attach 到內核調用中。

CPU 使用率過高的原因分析

經確認這款殺毒軟件的 CPU 佔用率控制模型如下圖,其守護模塊會定時判斷 agent 資源使用情況,如果超標則將釋放掃描模塊使用的 CPU 與內存資源。

Linux 下殺毒軟件 CPU 佔用率為何持續升高

但是具體分析下來,這樣的機制在 IO 頻繁的系統上存在缺陷,具體原因掃描模塊在內核態下執行時下無法釋放 CPU 資源。

分析過程如下:

經確認殺毒軟件 agent 在行為監測時,在進程將文件加載到內存前,會使用 hook 技術對於 open 等系統調用進行 attach,確定加載的文件不含惡意代碼後,才允許進程加載該文件。因此在 Linux 內核找到系統調用的 attatch 機制的相關代碼進行分析。

1. 系統調用中 sys_open 函數,使用 fsnotify 機制對於 attach 注入到 sys_open 函數的進程進行回調通知。(具體代碼位置在 kernel/open.c)

Linux 下殺毒軟件 CPU 佔用率為何持續升高

2. attach 到 sys_open 的代碼執行過程始終是處於內核態中的,同時 Linux 的 fsnotify 機制也會加內核鎖,在內核鎖解鎖前該進程無法釋放 CPU,不能被打斷。(具體代碼位置在 kernel/fsnotify.c)

Linux 下殺毒軟件 CPU 佔用率為何持續升高

殺毒軟件掃描模塊 attach 內核函數的機制與 fsnotify 類似,因此其掃描模塊在進行行為檢測時會在內核態執行且不能被打斷,而在系統中原本就有大量 IO 操作的情況下,守護模塊將失效。

Linux 下殺毒軟件 CPU 佔用率為何持續升高

在 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小時內刪除。
加載中...