From e034c31333f78e80487d65ea448fba45e350763d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Thu, 4 Apr 2024 17:20:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0SSD=E7=A1=AC=E7=9B=98?= =?UTF-8?q?=E8=87=AA=E5=8A=A8TRIM=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/nodes/node.go | 5 +++ internal/nodes/task_trim_disks.go | 74 +++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 internal/nodes/task_trim_disks.go diff --git a/internal/nodes/node.go b/internal/nodes/node.go index a9441b8..c012834 100644 --- a/internal/nodes/node.go +++ b/internal/nodes/node.go @@ -228,6 +228,11 @@ func (this *Node) Start() { stats.SharedHTTPRequestStatManager.Start() }) + // 硬盘TRIM任务 + goman.New(func() { + NewTrimDisksTask().Start() + }) + // 启动端口 err = sharedListenerManager.Start(nodeConfig) if err != nil { diff --git a/internal/nodes/task_trim_disks.go b/internal/nodes/task_trim_disks.go new file mode 100644 index 0000000..ea0d090 --- /dev/null +++ b/internal/nodes/task_trim_disks.go @@ -0,0 +1,74 @@ +// Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . + +package nodes + +import ( + "fmt" + "github.com/TeaOSLab/EdgeNode/internal/remotelogs" + executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec" + "github.com/shirou/gopsutil/v3/load" + "time" +) + +// TrimDisksTask trim ssd disks automatically +type TrimDisksTask struct { +} + +// NewTrimDisksTask create new task +func NewTrimDisksTask() *TrimDisksTask { + return &TrimDisksTask{} +} + +// Start the task +func (this *TrimDisksTask) Start() { + // execute once + err := this.loop() + if err != nil { + remotelogs.Warn("TRIM_DISKS", "trim disks failed: "+err.Error()) + } + + var ticker = time.NewTicker(7 * 24 * time.Hour) // 1 week + for range ticker.C { + // prevent system overload + for i := 0; i < 24; i++ { + stat, loadErr := load.Avg() + if loadErr == nil && stat != nil && stat.Load1 > 20 { + // wait load downgrade + time.Sleep(1 * time.Hour) + } else { + break + } + } + + // run the task + err = this.loop() + if err != nil { + remotelogs.Warn("TRIM_DISKS", "trim disks failed: "+err.Error()) + } + } +} + +// run the task once +func (this *TrimDisksTask) loop() error { + var nodeConfig = sharedNodeConfig + if nodeConfig == nil { + return nil + } + if !nodeConfig.AutoTrimDisks { + return nil + } + + trimExe, err := executils.LookPath("fstrim") + if err != nil { + return fmt.Errorf("'fstrim' command not found: %w", err) + } + + var cmd = executils.NewCmd(trimExe, "-a"). + WithStderr() + err = cmd.Run() + if err != nil { + return fmt.Errorf("'fstrim' execute failed: %s", cmd.Stderr()) + } + + return nil +}