platform: Improve oom-killer

This commit is contained in:
世界
2026-04-22 01:52:05 +08:00
parent a20f5fd7b6
commit cd4a4e6229
3 changed files with 120 additions and 4 deletions
+37
View File
@@ -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")
}
}
+2
View File
@@ -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()
}
}