platform: Improve oom-killer
This commit is contained in:
@@ -15,6 +15,8 @@ import (
|
||||
|
||||
type OOMReporter interface {
|
||||
WriteReport(memoryUsage uint64) error
|
||||
WriteDraft(memoryUsage uint64) error
|
||||
DiscardDraft() error
|
||||
}
|
||||
|
||||
func RegisterService(registry *boxService.Registry) {
|
||||
@@ -29,6 +31,7 @@ type Service struct {
|
||||
timerConfig timerConfig
|
||||
adaptiveTimer *adaptiveTimer
|
||||
lastReportTime atomic.Int64
|
||||
draftCancelled atomic.Bool
|
||||
}
|
||||
|
||||
func NewService(ctx context.Context, logger log.ContextLogger, tag string, options option.OOMKillerServiceOptions) (adapter.Service, error) {
|
||||
@@ -81,3 +84,37 @@ func (s *Service) writeOOMReport(memoryUsage uint64) {
|
||||
s.logger.Info("OOM report saved")
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Service) writeOOMDraft(memoryUsage uint64) {
|
||||
if s.draftCancelled.Load() {
|
||||
return
|
||||
}
|
||||
reporter := service.FromContext[OOMReporter](s.ctx)
|
||||
if reporter == nil {
|
||||
return
|
||||
}
|
||||
err := reporter.WriteDraft(memoryUsage)
|
||||
if s.draftCancelled.Load() {
|
||||
reporter.DiscardDraft()
|
||||
return
|
||||
}
|
||||
if err != nil {
|
||||
s.logger.Warn("failed to write OOM draft: ", err)
|
||||
} else {
|
||||
s.logger.Warn("OOM draft saved")
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Service) discardOOMDraft() {
|
||||
s.draftCancelled.Store(true)
|
||||
reporter := service.FromContext[OOMReporter](s.ctx)
|
||||
if reporter == nil {
|
||||
return
|
||||
}
|
||||
err := reporter.DiscardDraft()
|
||||
if err != nil {
|
||||
s.logger.Warn("failed to discard OOM draft: ", err)
|
||||
} else {
|
||||
s.logger.Info("OOM draft discarded")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,6 +83,7 @@ func (s *Service) Close() error {
|
||||
if isLast {
|
||||
C.stopMemoryPressureMonitor()
|
||||
}
|
||||
s.discardOOMDraft()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -100,6 +101,7 @@ func goMemoryPressureCallback(status C.ulong) {
|
||||
sample := readMemorySample(policyModeNetworkExtension)
|
||||
for _, s := range services {
|
||||
s.logger.Warn("memory pressure: critical, usage: ", byteformats.FormatMemoryBytes(sample.usage))
|
||||
s.writeOOMDraft(sample.usage)
|
||||
s.adaptiveTimer.notifyPressure()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user