Files
EdgeNode/internal/utils/fs/status.go

127 lines
2.5 KiB
Go
Raw Normal View History

2024-07-27 15:42:50 +08:00
// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cloud .
package fsutils
import (
2023-10-07 09:39:37 +08:00
"encoding/json"
2024-07-27 15:42:50 +08:00
"os"
"time"
teaconst "github.com/TeaOSLab/EdgeNode/internal/const"
2024-05-11 09:23:54 +08:00
"github.com/TeaOSLab/EdgeNode/internal/utils/goman"
2023-10-01 14:11:48 +08:00
"github.com/iwind/TeaGo/Tea"
2023-10-07 09:39:37 +08:00
"github.com/shirou/gopsutil/v3/load"
)
2023-08-02 11:34:14 +08:00
type Speed int
func (this Speed) String() string {
switch this {
case SpeedExtremelyFast:
return "extremely fast"
case SpeedFast:
return "fast"
case SpeedLow:
return "low"
case SpeedExtremelySlow:
return "extremely slow"
}
return "unknown"
}
const (
SpeedExtremelyFast Speed = 1
SpeedFast Speed = 2
SpeedLow Speed = 3
SpeedExtremelySlow Speed = 4
)
var (
DiskSpeed = SpeedLow
DiskSpeedMB float64
)
2023-10-07 09:39:37 +08:00
var IsInHighLoad = false
var IsInExtremelyHighLoad = false
const (
highLoad1Threshold = 20
extremelyHighLoad1Threshold = 40
)
func init() {
if !teaconst.IsMain {
return
}
// test disk
goman.New(func() {
2023-10-07 09:39:37 +08:00
// load last result from local disk
var countTests int
2023-10-07 09:39:37 +08:00
cacheData, cacheErr := os.ReadFile(Tea.Root + "/data/" + diskSpeedDataFile)
if cacheErr == nil {
var cache = &DiskSpeedCache{}
err := json.Unmarshal(cacheData, cache)
if err == nil && cache.SpeedMB > 0 {
DiskSpeedMB = cache.SpeedMB
DiskSpeed = cache.Speed
countTests = cache.CountTests
2023-10-07 09:39:37 +08:00
}
}
if countTests < 12 {
// initial check
_, _, _ = CheckDiskIsFast()
// check every one hour
var ticker = time.NewTicker(1 * time.Hour)
var count = 0
for range ticker.C {
_, _, err := CheckDiskIsFast()
if err == nil {
count++
if count > 24 {
return
}
}
}
}
})
2023-10-07 09:39:37 +08:00
// check high load
goman.New(func() {
2023-10-07 09:39:37 +08:00
var ticker = time.NewTicker(5 * time.Second)
for range ticker.C {
stat, _ := load.Avg()
IsInExtremelyHighLoad = stat != nil && stat.Load1 > extremelyHighLoad1Threshold
IsInHighLoad = stat != nil && stat.Load1 > highLoad1Threshold && !DiskIsFast()
}
})
}
2023-08-02 11:34:14 +08:00
func DiskIsFast() bool {
return DiskSpeed == SpeedExtremelyFast || DiskSpeed == SpeedFast
}
2023-08-04 16:32:15 +08:00
func DiskIsExtremelyFast() bool {
2023-10-01 14:11:48 +08:00
// 在开发环境下返回false以便于测试
if Tea.IsTesting() {
return false
}
2023-08-04 16:32:15 +08:00
return DiskSpeed == SpeedExtremelyFast
}
// 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 {
if stat.Load1 > maxLoad {
time.Sleep(delay)
} else {
return
}
}
}
}