mirror of
				https://github.com/TeaOSLab/EdgeNode.git
				synced 2025-11-04 07:40:56 +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