mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-05 17:40:26 +08:00
优化磁盘速度检查
This commit is contained in:
@@ -485,7 +485,7 @@ func (this *MemoryStorage) startFlush() {
|
|||||||
statCount = 0
|
statCount = 0
|
||||||
|
|
||||||
// delay some time to reduce load if needed
|
// delay some time to reduce load if needed
|
||||||
if !fsutils.DiskIsFast {
|
if !fsutils.DiskIsFast() {
|
||||||
loadStat, err := load.Avg()
|
loadStat, err := load.Avg()
|
||||||
if err == nil && loadStat != nil {
|
if err == nil && loadStat != nil {
|
||||||
if loadStat.Load1 > 10 {
|
if loadStat.Load1 > 10 {
|
||||||
|
|||||||
@@ -64,11 +64,21 @@ func CheckDiskIsFast() (speedMB float64, isFast bool, err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
isFast = speedMB > 120
|
isFast = speedMB > 150
|
||||||
|
|
||||||
|
if speedMB > 1000 {
|
||||||
|
DiskSpeed = SpeedExtremelyFast
|
||||||
|
} else if speedMB > 150 {
|
||||||
|
DiskSpeed = SpeedFast
|
||||||
|
} else if speedMB > 60 {
|
||||||
|
DiskSpeed = SpeedLow
|
||||||
|
} else {
|
||||||
|
DiskSpeed = SpeedExtremelySlow
|
||||||
|
}
|
||||||
|
calculateDiskMaxWrites()
|
||||||
|
|
||||||
if speedMB > DiskSpeedMB {
|
if speedMB > DiskSpeedMB {
|
||||||
DiskSpeedMB = speedMB
|
DiskSpeedMB = speedMB
|
||||||
DiskIsFast = isFast
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -8,9 +8,33 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
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 (
|
var (
|
||||||
DiskIsFast bool
|
DiskSpeed = SpeedLow
|
||||||
DiskSpeedMB float64
|
DiskMaxWrites int32 = 32
|
||||||
|
DiskSpeedMB float64
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -38,17 +62,14 @@ func init() {
|
|||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func DiskIsFast() bool {
|
||||||
|
return DiskSpeed == SpeedExtremelyFast || DiskSpeed == SpeedFast
|
||||||
|
}
|
||||||
|
|
||||||
var countWrites int32 = 0
|
var countWrites int32 = 0
|
||||||
|
|
||||||
const MaxWrites = 32
|
|
||||||
const MaxFastWrites = 128
|
|
||||||
|
|
||||||
func WriteReady() bool {
|
func WriteReady() bool {
|
||||||
var count = atomic.LoadInt32(&countWrites)
|
return atomic.LoadInt32(&countWrites) < DiskMaxWrites
|
||||||
if DiskIsFast {
|
|
||||||
return count < MaxFastWrites
|
|
||||||
}
|
|
||||||
return count <= MaxWrites
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func WriteBegin() {
|
func WriteBegin() {
|
||||||
@@ -58,3 +79,18 @@ func WriteBegin() {
|
|||||||
func WriteEnd() {
|
func WriteEnd() {
|
||||||
atomic.AddInt32(&countWrites, -1)
|
atomic.AddInt32(&countWrites, -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func calculateDiskMaxWrites() {
|
||||||
|
switch DiskSpeed {
|
||||||
|
case SpeedExtremelyFast:
|
||||||
|
DiskMaxWrites = 256
|
||||||
|
case SpeedFast:
|
||||||
|
DiskMaxWrites = 128
|
||||||
|
case SpeedLow:
|
||||||
|
DiskMaxWrites = 32
|
||||||
|
case SpeedExtremelySlow:
|
||||||
|
DiskMaxWrites = 16
|
||||||
|
default:
|
||||||
|
DiskMaxWrites = 16
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
func TestWrites(t *testing.T) {
|
func TestWrites(t *testing.T) {
|
||||||
var a = assert.NewAssertion(t)
|
var a = assert.NewAssertion(t)
|
||||||
|
|
||||||
for i := 0; i < fsutils.MaxWrites+1; i++ {
|
for i := 0; i < int(fsutils.DiskMaxWrites); i++ {
|
||||||
fsutils.WriteBegin()
|
fsutils.WriteBegin()
|
||||||
}
|
}
|
||||||
a.IsFalse(fsutils.WriteReady())
|
a.IsFalse(fsutils.WriteReady())
|
||||||
|
|||||||
Reference in New Issue
Block a user