持續監控檔案變化時使用filepath遇坑,填坑記....持續更新
最近在做個處理日誌的功能,首先就是要把日誌檔案的變化掃描出來,之前看過相關實現方法,有如下兩種主流的方式:
//第一種
Listfunc(path string, f os.FileInfo, err error){}
filepath.Walk(path, Listfunc){}
//第二種
files,_ := ioutil.ReadDir(path)
for file := range files{
if file.IsDir(){
}else{
}
}
我在實際開發中面對的是不斷增加的多個檔案下的多份日誌檔案,唯一的判定標識是日誌檔案字尾,整個日誌空間不到800M左右會遠端轉儲備份。
----x1
-x1_標識.log (最大10M,10M後轉儲成帶時間戳的日誌檔案)
-x1_標識_2018-1-18.log
----x2
-x2_標識.log
這樣的場景下,我選擇了loop filepath.Walk的方案,在loop頻率設定3分鐘的情況下穩定跑了大概2周了。可是最近幾天業務量大了,為了更快的得到日誌變化的內容,把loop頻率設定成了3s。在跑了1個晚上後出現了panic。
於是,我使用pprof檢視了3s場景下半天內的heap資料,發現heap持續增長。使用pprof -alloc_space檢視了下記憶體分配情況,顯示如下:
ROUTINE ======================== os.(*File).readdirnames in C:/Go/src/os/dir_unix.go
4.24GB 4.60GB (flat, cum) 56.78% of Total
. . 43:}
. . 44:
. . 45:func (f *File) readdirnames(n int) (names []string, err error) {
. . 46: // If this file has no dirinfo, create one.
. . 47: if f.dirinfo == nil {
25MB 25MB 48: f.dirinfo = new(dirInfo)
. . 49: // The buffer must be at least a block long.
2.91GB 2.91GB 50: f.dirinfo.buf = make([]byte, blockSize)
. . 51: }
. . 52: d := f.dirinfo
. . 53:
. . 54: size := n
. . 55: if size <= 0 {
. . 56: size = 100
. . 57: n = -1
. . 58: }
. . 59:
1.31GB 1.31GB 60: names = make([]string, 0, size) // Empty with room to grow.
. . 61: for n != 0 {
. . 62: // Refill the buffer if necessary
看來這種遍歷檔案路徑的方式在資源消耗上存在很大問題。
突然想起來謝大Beego配套的Bee工具貌似也有檔案變化感知的功能,準備嘗試其中的fsnotify來解決我的問題,明天有會議,計劃週六動手試試。有結果了繼續更新。
相關文章
- Flutter踩坑日記(持續更新...)Flutter
- vmware+ubuntu 踩坑記錄,持續更新Ubuntu
- React SSR重構踩坑記錄(持續更新)React
- vue+elementUI專案的踩坑~~持續更新VueUI
- Xcode10更新的那些坑(持續更新)XCode
- Laravel 軟刪除所有坑 - 持續更新Laravel
- 前端開發踩坑日誌(持續更新。。。)前端
- Android開發踩坑及最佳實踐(工作踩坑記錄 持續更新...)Android
- uniapp 使用pinpa 持續化更新APP
- Flutter實際專案開發中踩坑大合集(持續更新..)Flutter
- 使用 Jenkins 配置 iOS 持續整合踩坑實錄JenkinsiOS
- git使用、持續更新中Git
- 實時數倉-持續更新
- JVM(持續更新。。。)JVM
- FastApi持續更新ASTAPI
- 軟考筆記 --- 持續更新筆記
- 持續整合、持續部署、持續交付、持續釋出
- pytorch分散式訓練注意事項/踩坑總結 - 持續更新PyTorch分散式
- 持續整合、持續交付與持續部署
- 【持續更新...】ligerGrid 學習筆記筆記
- 【持續更新...】ECharts學習筆記Echarts筆記
- 【持續更新...】Nginx 學習筆記Nginx筆記
- Java 學習筆記(持續更新)Java筆記
- 彙編筆記(持續更新中)筆記
- Xcode 技巧 持續更新XCode
- Blender 雕刻 持續更新
- clion小白使用技巧(持續更新中)
- JiaoZiVideoPlayer使用說明(持續更新中...)IDE
- 持續整合持續部署持續交付_持續整合與持續部署之間的真正區別
- 日常工作筆記(持續更新中。。)筆記
- Web命令執行筆記(持續更新)Web筆記
- 【持續更新...】Microsoft SSIS 學習筆記ROS筆記
- 《CSS世界》閱讀筆記,持續更新CSS筆記
- 對持續整合、 持續交付、持續部署和持續釋出的介紹
- Pycharm快捷鍵持續更新PyCharm
- MySql報錯(持續更新)MySql
- leetcode題解【持續更新】LeetCode
- LevOJ平臺 - 持續更新
- AnimalController 學習 持續更新Controller