簡體   English   中英

Mono 下的 FileSystemWatcher:Linux 上的 CPU 負載過重

[英]FileSystemWatcher under Mono: Heavy CPU load on Linux

我訂閱目錄中的更改:

FileSystemWatcher watcher = new FileSystemWatcher(directory);
watcher.NotifyFilter = NotifyFilters.LastAccess;
watcher.Changed += OnChanged;
watcher.IncludeSubdirectories = includeSubdirectories;
watcher.EnableRaisingEvents = true;

大多數時候,這個 .NET 4.7 代碼工作正常,但是當它在 Debian 上的 mono 下運行時,在某些目錄上,我注意到以下行為:

  • CPU負載增加到250%(2.5核滿載)
  • 子線程的數量增加,它們會加載 CPU

這種情況無休止地持續下去,直到應用程序完全卡住。


UPD:額外的研究表明,沉重的 CPU 負載是由WatcherChangeTypes.Changed事件在被監視目錄內的每個子目錄上的無休止洪水引起的(每個目錄連續發生 1-2 個事件,當所有目錄都報告為已更改時,它會再次啟動)。


UPD:最小的錯誤示例

在 Mono 的技術常見問題解答中,您可以找到FileSystemWatcher 有哪些問題? 部分,它說在某些條件下

Mono 退回到輪詢目錄以進行更改,這遠非最佳。

通過實驗,我發現這些條件之一是:

被監視目錄總數超過4096個

可能有更多與文件數相關的條件,但我沒有滿足它們。


因此,如果滿足以下條件,您可能會遇到所描述的問題:

  1. 您在 Linux(或在 Docker 中)上的 Mono 6.8 下運行 .NET Framework 4.7 代碼
  2. 您使用System.IO.FileSystemWatcher遞歸監視目錄更改
  3. 您的NotifyFilter包括NotifyFilters .LastAccess
  4. find watched-directory -type d | wc -l find watched-directory -type d | wc -l命令返回超過 4096

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM