1. 程式人生 > >檔案監控效能問題【BUG】

檔案監控效能問題【BUG】

# 檔案監控效能問題【BUG】 背景:JAVA寫了一個資料夾目錄監控的程式,使用的是org.apache.commons.io.monitor 包,專案穩定運行了一個月,現場反饋,資料夾資料處理越來越慢,等到資料推送到前端要好幾分鐘,於是開始了尋找問題的路程。 ## 監控程式碼 [之前寫的檔案監控程式碼](https://www.cnblogs.com/chengzhihua/p/13384076.html) ## 問題發現 我在ApplicationRunner的實現類中重寫了run方法,列印了日誌 ```java @Override public void run(ApplicationArguments applicationArguments) throws Exception { log.info("監聽開始"); // 輪詢間隔 1 秒 long interval = TimeUnit.SECONDS.toMillis(1); // 建立過濾器 IOFileFilter directories = FileFilterUtils.and( FileFilterUtils.directoryFileFilter(), HiddenFileFilter.VISIBLE); IOFileFilter files = FileFilterUtils.and( FileFilterUtils.fileFileFilter(), FileFilterUtils.suffixFileFilter(fileEnd)); IOFileFilter filter = FileFilterUtils.or(directories, files); // 使用過濾器 FileAlterationObserver observer = new FileAlterationObserver(new File(baseDataSyncDir), filter); observer.addListener(new FileMonitor()); //建立檔案變化監聽器 FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer); // 開始監控 monitor.start(); log.info("監聽開始{}",baseDataSyncDir); } ``` 本地除錯,秒列印兩行日誌,但是放到現場執行,這兩行日誌相差三分鐘,在之後的fileCreate 監聽中也是發現大概三分鐘才能發現一批新資料,這就是導致資料推送不及時的原因。 在發現問題過後,我仔細想了下檔案監控的原理,到底是怎麼來監控檔案的呢,找了下原始碼看了下,果然,是迴圈處理所有檔案。FileAlterationObserver中的checkeNotify()方法,就是獲取所有的檔案,然後進行一個個的判斷。 ```java public void checkAndNotify() { Iterator var1 = this.listeners.iterator(); while(var1.hasNext()) { FileAlterationListener listener = (FileAlterationListener)var1.next(); listener.onStart(this); } File rootFile = this.rootEntry.getFile(); if (rootFile.exists()) { this.checkAndNotify(this.rootEntry, this.rootEntry.getChildren(), this.listFiles(rootFile)); } else if (this.rootEntry.isExists()) { this.checkAndNotify(this.rootEntry, this.rootEntry.getChildren(), FileUtils.EMPTY_FILE_ARRAY); } Iterator var5 = this.listeners.iterator(); while(var5.hasNext()) { FileAlterationListener listener = (FileAlterationListener)var5.next(); listener.onStop(this); } } ``` ## 分析問題 問題出現的原因:由於程式在處理了檔案之後,並沒有將檔案進行刪除處理,而是將資料移動到當前目錄的子目錄中,但是子目錄依舊在程式監控的根目錄下,這就導致根目錄下的資料量越來越大,進而引發了專案檔案監控處理一次需要三分鐘,也就是說會隨著檔案資料量的逐漸增加,處理一次需要的時間也會逐漸增加,最終會導致程式崩潰。 ## 解決方案 1.在處理完檔案之後,將檔案刪除。 2.處理完檔案之後,將檔案移動到不在監控資料夾下 ## BUG感悟 不是所有的bug在本地都可以復現,在線上出現問題的時候,不要懷疑是偶然情況,預定難以解決的問題的時候,先大致分析下問題所在,找不到問題原因就打日誌,縮小問題範圍,結合原始碼進行分析。