7e3e94a08a
Add a comprehensive performance monitoring system that collects CPU, memory, swap, load average, network IO, and GPU stats. Provides both a REST API for the UI and a Prometheus /metrics endpoint. Backend changes: - New internal/perf package with configurable interval-based stats collection - GPU monitoring via LACT (Unix socket) and nvidia-smi fallback on Linux - Ring buffer (internal/ring) for time-series stat storage - Prometheus /metrics endpoint with all system and GPU metrics - Moved LogMonitor to internal/logmon package - New PerformanceConfig for hot-reloadable monitoring settings - REST /api/performance endpoint replacing SSE streaming UI changes: - New Performance page with real-time charts for CPU, memory, GPU, and network - Reusable PerformanceChart component - LLAMA_SWAP_URL environment variable support - Improved capture dialog display Other: - Example Grafana dashboard for Prometheus metrics - monitor-test standalone binary - Config schema and example updates fixes #596
45 lines
746 B
Go
45 lines
746 B
Go
package ring
|
|
|
|
import "testing"
|
|
|
|
const benchCap = 600 // matches default MaxAge/Every (1min / 100ms)
|
|
|
|
func BenchmarkBuffer_PushNoWrap(b *testing.B) {
|
|
for b.Loop() {
|
|
buf := NewBuffer[int](b.N + 1)
|
|
for i := range b.N {
|
|
buf.Push(i)
|
|
}
|
|
}
|
|
}
|
|
|
|
func BenchmarkBuffer_PushWrap(b *testing.B) {
|
|
buf := NewBuffer[int](benchCap)
|
|
b.ResetTimer()
|
|
for i := range b.N {
|
|
buf.Push(i)
|
|
}
|
|
}
|
|
|
|
func BenchmarkBuffer_Slice(b *testing.B) {
|
|
buf := NewBuffer[int](benchCap)
|
|
for i := range benchCap {
|
|
buf.Push(i)
|
|
}
|
|
b.ResetTimer()
|
|
for range b.N {
|
|
_ = buf.Slice()
|
|
}
|
|
}
|
|
|
|
func BenchmarkBuffer_PushAndSlice(b *testing.B) {
|
|
buf := NewBuffer[int](benchCap)
|
|
b.ResetTimer()
|
|
for i := range b.N {
|
|
buf.Push(i)
|
|
if i%benchCap == 0 {
|
|
_ = buf.Slice()
|
|
}
|
|
}
|
|
}
|