mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-05 01:20:26 +08:00
84 lines
1.6 KiB
Go
84 lines
1.6 KiB
Go
|
|
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||
|
|
|
||
|
|
package caches
|
||
|
|
|
||
|
|
import (
|
||
|
|
teaconst "github.com/TeaOSLab/EdgeNode/internal/const"
|
||
|
|
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
||
|
|
"sync/atomic"
|
||
|
|
"time"
|
||
|
|
)
|
||
|
|
|
||
|
|
const (
|
||
|
|
minOpenFilesValue int32 = 2
|
||
|
|
maxOpenFilesValue int32 = 65535
|
||
|
|
|
||
|
|
modSlow int32 = 1
|
||
|
|
modFast int32 = 2
|
||
|
|
)
|
||
|
|
|
||
|
|
type MaxOpenFiles struct {
|
||
|
|
step int32
|
||
|
|
maxOpenFiles int32
|
||
|
|
ptr *int32
|
||
|
|
ticker *time.Ticker
|
||
|
|
mod int32
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewMaxOpenFiles(step int32) *MaxOpenFiles {
|
||
|
|
if step <= 0 {
|
||
|
|
step = 2
|
||
|
|
}
|
||
|
|
var f = &MaxOpenFiles{
|
||
|
|
step: step,
|
||
|
|
maxOpenFiles: 2,
|
||
|
|
}
|
||
|
|
if teaconst.DiskIsFast {
|
||
|
|
f.maxOpenFiles = 32
|
||
|
|
}
|
||
|
|
f.ptr = &f.maxOpenFiles
|
||
|
|
f.ticker = time.NewTicker(1 * time.Second)
|
||
|
|
goman.New(func() {
|
||
|
|
for range f.ticker.C {
|
||
|
|
var mod = atomic.LoadInt32(&f.mod)
|
||
|
|
switch mod {
|
||
|
|
case modSlow:
|
||
|
|
// we decrease more quickly, with more steps
|
||
|
|
if atomic.AddInt32(f.ptr, -step*2) <= 0 {
|
||
|
|
atomic.StoreInt32(f.ptr, minOpenFilesValue)
|
||
|
|
}
|
||
|
|
case modFast:
|
||
|
|
if atomic.AddInt32(f.ptr, step) >= maxOpenFilesValue {
|
||
|
|
atomic.StoreInt32(f.ptr, maxOpenFilesValue)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// reset mod
|
||
|
|
atomic.StoreInt32(&f.mod, 0)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
return f
|
||
|
|
}
|
||
|
|
|
||
|
|
func (this *MaxOpenFiles) Fast() {
|
||
|
|
if atomic.LoadInt32(&this.mod) == 0 {
|
||
|
|
this.mod = modFast
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (this *MaxOpenFiles) Slow() {
|
||
|
|
atomic.StoreInt32(&this.mod, modSlow)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (this *MaxOpenFiles) Max() int32 {
|
||
|
|
if atomic.LoadInt32(&this.mod) == modSlow {
|
||
|
|
return 0
|
||
|
|
}
|
||
|
|
|
||
|
|
var v = atomic.LoadInt32(this.ptr)
|
||
|
|
if v <= minOpenFilesValue {
|
||
|
|
return minOpenFilesValue
|
||
|
|
}
|
||
|
|
return v
|
||
|
|
}
|