执行定时任务时自动根据负载进行延后执行

This commit is contained in:
GoEdgeLab
2024-04-12 21:13:19 +08:00
parent ca43d119e4
commit 35c57bf070
8 changed files with 35 additions and 13 deletions

View File

@@ -10,6 +10,7 @@ import (
"github.com/TeaOSLab/EdgeNode/internal/goman" "github.com/TeaOSLab/EdgeNode/internal/goman"
"github.com/TeaOSLab/EdgeNode/internal/remotelogs" "github.com/TeaOSLab/EdgeNode/internal/remotelogs"
"github.com/TeaOSLab/EdgeNode/internal/utils/fasttime" "github.com/TeaOSLab/EdgeNode/internal/utils/fasttime"
fsutils "github.com/TeaOSLab/EdgeNode/internal/utils/fs"
"github.com/TeaOSLab/EdgeNode/internal/utils/kvstore" "github.com/TeaOSLab/EdgeNode/internal/utils/kvstore"
"testing" "testing"
"time" "time"
@@ -78,6 +79,8 @@ func (this *KVIPList) init() error {
}) })
for range this.cleanTicker.C { for range this.cleanTicker.C {
fsutils.WaitLoad(15, 16, 1*time.Hour)
deleteErr := this.DeleteExpiredItems() deleteErr := this.DeleteExpiredItems()
if deleteErr != nil { if deleteErr != nil {
remotelogs.Error("IP_LIST_DB", "clean expired items failed: "+deleteErr.Error()) remotelogs.Error("IP_LIST_DB", "clean expired items failed: "+deleteErr.Error())

View File

@@ -8,6 +8,7 @@ import (
"github.com/TeaOSLab/EdgeNode/internal/goman" "github.com/TeaOSLab/EdgeNode/internal/goman"
"github.com/TeaOSLab/EdgeNode/internal/remotelogs" "github.com/TeaOSLab/EdgeNode/internal/remotelogs"
"github.com/TeaOSLab/EdgeNode/internal/utils/dbs" "github.com/TeaOSLab/EdgeNode/internal/utils/dbs"
fsutils "github.com/TeaOSLab/EdgeNode/internal/utils/fs"
"github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/Tea"
"os" "os"
"path/filepath" "path/filepath"
@@ -167,9 +168,11 @@ ON "` + this.itemTableName + `" (
}) })
for range this.cleanTicker.C { for range this.cleanTicker.C {
err := this.DeleteExpiredItems() fsutils.WaitLoad(15, 16, 1*time.Hour)
if err != nil {
remotelogs.Error("IP_LIST_DB", "clean expired items failed: "+err.Error()) deleteErr := this.DeleteExpiredItems()
if deleteErr != nil {
remotelogs.Error("IP_LIST_DB", "clean expired items failed: "+deleteErr.Error())
} }
} }
}) })

View File

@@ -11,6 +11,7 @@ import (
"github.com/TeaOSLab/EdgeNode/internal/trackers" "github.com/TeaOSLab/EdgeNode/internal/trackers"
"github.com/TeaOSLab/EdgeNode/internal/utils" "github.com/TeaOSLab/EdgeNode/internal/utils"
byteutils "github.com/TeaOSLab/EdgeNode/internal/utils/byte" byteutils "github.com/TeaOSLab/EdgeNode/internal/utils/byte"
fsutils "github.com/TeaOSLab/EdgeNode/internal/utils/fs"
"github.com/TeaOSLab/EdgeNode/internal/utils/kvstore" "github.com/TeaOSLab/EdgeNode/internal/utils/kvstore"
"github.com/TeaOSLab/EdgeNode/internal/zero" "github.com/TeaOSLab/EdgeNode/internal/zero"
"github.com/cockroachdb/pebble" "github.com/cockroachdb/pebble"
@@ -287,6 +288,8 @@ func (this *KVTask) Start() error {
this.cleanTicker = utils.NewTicker(24 * time.Hour) this.cleanTicker = utils.NewTicker(24 * time.Hour)
goman.New(func() { goman.New(func() {
for this.cleanTicker.Next() { for this.cleanTicker.Next() {
fsutils.WaitLoad(15, 16, 1*time.Hour)
var tr = trackers.Begin("METRIC:CLEAN_EXPIRED") var tr = trackers.Begin("METRIC:CLEAN_EXPIRED")
err := this.CleanExpired() err := this.CleanExpired()
tr.End() tr.End()

View File

@@ -13,6 +13,7 @@ import (
"github.com/TeaOSLab/EdgeNode/internal/trackers" "github.com/TeaOSLab/EdgeNode/internal/trackers"
"github.com/TeaOSLab/EdgeNode/internal/utils" "github.com/TeaOSLab/EdgeNode/internal/utils"
"github.com/TeaOSLab/EdgeNode/internal/utils/dbs" "github.com/TeaOSLab/EdgeNode/internal/utils/dbs"
fsutils "github.com/TeaOSLab/EdgeNode/internal/utils/fs"
"github.com/TeaOSLab/EdgeNode/internal/zero" "github.com/TeaOSLab/EdgeNode/internal/zero"
"github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/types" "github.com/iwind/TeaGo/types"
@@ -209,6 +210,8 @@ func (this *SQLiteTask) Start() error {
this.cleanTicker = utils.NewTicker(24 * time.Hour) this.cleanTicker = utils.NewTicker(24 * time.Hour)
goman.New(func() { goman.New(func() {
for this.cleanTicker.Next() { for this.cleanTicker.Next() {
fsutils.WaitLoad(15, 16, 1*time.Hour)
var tr = trackers.Begin("METRIC:CLEAN_EXPIRED") var tr = trackers.Begin("METRIC:CLEAN_EXPIRED")
err := this.CleanExpired() err := this.CleanExpired()
tr.End() tr.End()

View File

@@ -6,7 +6,7 @@ import (
"fmt" "fmt"
"github.com/TeaOSLab/EdgeNode/internal/remotelogs" "github.com/TeaOSLab/EdgeNode/internal/remotelogs"
executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec" executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec"
"github.com/shirou/gopsutil/v3/load" fsutils "github.com/TeaOSLab/EdgeNode/internal/utils/fs"
"runtime" "runtime"
"time" "time"
) )
@@ -31,15 +31,7 @@ func (this *TrimDisksTask) Start() {
var ticker = time.NewTicker(2 * 24 * time.Hour) // every 2 days var ticker = time.NewTicker(2 * 24 * time.Hour) // every 2 days
for range ticker.C { for range ticker.C {
// prevent system overload // prevent system overload
for i := 0; i < 24; i++ { fsutils.WaitLoad(15, 24, 1*time.Hour)
stat, loadErr := load.Avg()
if loadErr == nil && stat != nil && stat.Load1 > 15 {
// wait load downgrade
time.Sleep(1 * time.Hour)
} else {
break
}
}
// run the task // run the task
err = this.loop() err = this.loop()

View File

@@ -9,6 +9,7 @@ import (
"github.com/TeaOSLab/EdgeNode/internal/goman" "github.com/TeaOSLab/EdgeNode/internal/goman"
"github.com/TeaOSLab/EdgeNode/internal/remotelogs" "github.com/TeaOSLab/EdgeNode/internal/remotelogs"
"github.com/TeaOSLab/EdgeNode/internal/utils/fasttime" "github.com/TeaOSLab/EdgeNode/internal/utils/fasttime"
fsutils "github.com/TeaOSLab/EdgeNode/internal/utils/fs"
"github.com/TeaOSLab/EdgeNode/internal/utils/kvstore" "github.com/TeaOSLab/EdgeNode/internal/utils/kvstore"
"github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/types" "github.com/iwind/TeaGo/types"
@@ -94,6 +95,8 @@ func (this *DAUManager) Init() error {
// clean expires items // clean expires items
goman.New(func() { goman.New(func() {
for range this.cleanTicker.C { for range this.cleanTicker.C {
fsutils.WaitLoad(15, 16, 1*time.Hour)
err := this.CleanStats() err := this.CleanStats()
if err != nil { if err != nil {
remotelogs.Error("DAU_MANAGER", "clean stats failed: "+err.Error()) remotelogs.Error("DAU_MANAGER", "clean stats failed: "+err.Error())

View File

@@ -140,3 +140,13 @@ func calculateDiskMaxWrites() {
DiskMaxWrites = 4 DiskMaxWrites = 4
} }
} }
// WaitLoad wait system load to downgrade
func WaitLoad(maxLoad float64, maxLoops int, delay time.Duration) {
for i := 0; i < maxLoops; i++ {
stat, err := load.Avg()
if err == nil && stat.Load1 > maxLoad {
time.Sleep(delay)
}
}
}

View File

@@ -6,6 +6,7 @@ import (
fsutils "github.com/TeaOSLab/EdgeNode/internal/utils/fs" fsutils "github.com/TeaOSLab/EdgeNode/internal/utils/fs"
"github.com/iwind/TeaGo/assert" "github.com/iwind/TeaGo/assert"
"testing" "testing"
"time"
) )
func TestWrites(t *testing.T) { func TestWrites(t *testing.T) {
@@ -20,6 +21,10 @@ func TestWrites(t *testing.T) {
a.IsTrue(fsutils.WriteReady()) a.IsTrue(fsutils.WriteReady())
} }
func TestWaitLoad(t *testing.T) {
fsutils.WaitLoad(100, 1, 1 * time.Minute)
}
func BenchmarkWrites(b *testing.B) { func BenchmarkWrites(b *testing.B) {
b.RunParallel(func(pb *testing.PB) { b.RunParallel(func(pb *testing.PB) {
for pb.Next() { for pb.Next() {