diff --git a/cmd/internal/storage/influxdb/influxdb.go b/cmd/internal/storage/influxdb/influxdb.go index a651e54a85..695b6b1dca 100644 --- a/cmd/internal/storage/influxdb/influxdb.go +++ b/cmd/internal/storage/influxdb/influxdb.go @@ -68,6 +68,8 @@ const ( serMemorySwap string = "memory_swap" // Size of memory mapped files in bytes serMemoryMappedFile string = "memory_mapped_file" + // Size of socket memory in bytes + serMemorySocket string = "memory_socket" // Working set size serMemoryWorkingSet string = "memory_working_set" // Total active file size @@ -258,6 +260,8 @@ func (s *influxdbStorage) memoryStatsToPoints( points = append(points, makePoint(serMemorySwap, stats.Memory.Swap)) // Size of memory mapped files in bytes points = append(points, makePoint(serMemoryMappedFile, stats.Memory.MappedFile)) + // Size of socket memory in bytes + points = append(points, makePoint(serMemorySocket, stats.Memory.Socket)) // Working Set Size points = append(points, makePoint(serMemoryWorkingSet, stats.Memory.WorkingSet)) // Total Active File Size diff --git a/cmd/internal/storage/influxdb/influxdb_test.go b/cmd/internal/storage/influxdb/influxdb_test.go index 455a23564a..e889beebd7 100644 --- a/cmd/internal/storage/influxdb/influxdb_test.go +++ b/cmd/internal/storage/influxdb/influxdb_test.go @@ -259,6 +259,7 @@ func TestContainerStatsToPoints(t *testing.T) { assertContainsPointWithValue(t, points, serMemoryRss, stats.Memory.RSS) assertContainsPointWithValue(t, points, serMemorySwap, stats.Memory.Swap) assertContainsPointWithValue(t, points, serMemoryMappedFile, stats.Memory.MappedFile) + assertContainsPointWithValue(t, points, serMemorySocket, stats.Memory.Socket) assertContainsPointWithValue(t, points, serMemoryUsage, stats.Memory.Usage) assertContainsPointWithValue(t, points, serMemoryWorkingSet, stats.Memory.WorkingSet) assertContainsPointWithValue(t, points, serMemoryTotalActiveFile, stats.Memory.TotalActiveFile) @@ -362,6 +363,7 @@ func createTestStats() (*info.ContainerInfo, *info.ContainerStats) { RSS: 18930020352, Swap: 1024, MappedFile: 1025327104, + Socket: 1025327104, WorkingSet: 23630012416, TotalActiveFile: 29459246253, TotalInactiveFile: 28364536434, diff --git a/cmd/internal/storage/statsd/statsd.go b/cmd/internal/storage/statsd/statsd.go index 14f2f03fbc..2057258cc9 100644 --- a/cmd/internal/storage/statsd/statsd.go +++ b/cmd/internal/storage/statsd/statsd.go @@ -55,6 +55,8 @@ const ( serMemorySwap string = "memory_swap" // Size of memory mapped files in bytes serMemoryMappedFile string = "memory_mapped_file" + // Size of socket memory in bytes + serMemorySocket string = "memory_socket" // Working set size serMemoryWorkingSet string = "memory_working_set" // Total active file size @@ -161,6 +163,8 @@ func (s *statsdStorage) memoryStatsToValues(series *map[string]uint64, stats *in (*series)[serMemorySwap] = stats.Memory.Swap // Size of memory mapped files in bytes (*series)[serMemoryMappedFile] = stats.Memory.MappedFile + // Size of socket memory in bytes. + (*series)[serMemorySocket] = stats.Memory.Socket // Working Set Size (*series)[serMemoryWorkingSet] = stats.Memory.WorkingSet // Total Active File Size diff --git a/cmd/internal/storage/stdout/stdout.go b/cmd/internal/storage/stdout/stdout.go index 15aa61d793..56bfd904b5 100644 --- a/cmd/internal/storage/stdout/stdout.go +++ b/cmd/internal/storage/stdout/stdout.go @@ -57,6 +57,8 @@ const ( serMemorySwap string = "memory_swap" // Size of memory mapped files in bytes serMemoryMappedFile string = "memory_mapped_file" + // Size of socket memory in bytes + serMemorySocket string = "memory_socket" // Working set size serMemoryWorkingSet string = "memory_working_set" // Total active file @@ -166,6 +168,8 @@ func (driver *stdoutStorage) memoryStatsToValues(series *map[string]uint64, stat (*series)[serMemorySwap] = stats.Memory.Swap // Size of memory mapped files in bytes (*series)[serMemoryMappedFile] = stats.Memory.MappedFile + // Size of socket memory in bytes + (*series)[serMemorySocket] = stats.Memory.Socket // Working Set Size (*series)[serMemoryWorkingSet] = stats.Memory.WorkingSet // Total Active File diff --git a/container/libcontainer/handler.go b/container/libcontainer/handler.go index 9f05a52a49..7e21456ee3 100644 --- a/container/libcontainer/handler.go +++ b/container/libcontainer/handler.go @@ -799,6 +799,8 @@ func setMemoryStats(s *cgroups.Stats, ret *info.ContainerStats) { ret.Memory.MaxUsage = s.MemoryStats.Usage.MaxUsage ret.Memory.Failcnt = s.MemoryStats.Usage.Failcnt ret.Memory.KernelUsage = s.MemoryStats.KernelUsage.Usage + ret.Memory.Socket = s.MemoryStats.Stats["sock"] + fmt.Println(s.MemoryStats.Stats) if cgroups.IsCgroup2UnifiedMode() { ret.Memory.Cache = s.MemoryStats.Stats["file"] diff --git a/info/v1/container.go b/info/v1/container.go index ae1d9caecc..133ae3bded 100644 --- a/info/v1/container.go +++ b/info/v1/container.go @@ -390,6 +390,10 @@ type MemoryStats struct { // The amount of memory used for mapped files (includes tmpfs/shmem) MappedFile uint64 `json:"mapped_file"` + // The amount of kernel memory used by the sockets spawned by the process. + // Units: Bytes. + Socket uint64 `json:"socket"` + // The amount of working set memory, this includes recently accessed memory, // dirty memory, and kernel memory. Working set is <= "usage". // Units: Bytes. diff --git a/info/v1/test/datagen.go b/info/v1/test/datagen.go index e1478cbaff..d23d0c129a 100644 --- a/info/v1/test/datagen.go +++ b/info/v1/test/datagen.go @@ -47,6 +47,7 @@ func GenerateRandomStats(numStats, numCores int, duration time.Duration) []*info stats.Memory.Cache = uint64(rand.Int63n(4096)) stats.Memory.RSS = uint64(rand.Int63n(4096)) stats.Memory.MappedFile = uint64(rand.Int63n(4096)) + stats.Memory.Socket = uint64(rand.Int63n(4096)) stats.Memory.KernelUsage = uint64(rand.Int63n(4096)) stats.ReferencedMemory = uint64(rand.Int63n(1000)) ret[i] = stats diff --git a/metrics/prometheus.go b/metrics/prometheus.go index 86064819d3..1975d9fbbc 100644 --- a/metrics/prometheus.go +++ b/metrics/prometheus.go @@ -398,6 +398,13 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc, includedMetri getValues: func(s *info.ContainerStats) metricValues { return metricValues{{value: float64(s.Memory.MappedFile), timestamp: s.Timestamp}} }, + }, { + name: "container_memory_socket", + help: "Size of kernel memory allocated by sockets.", + valueType: prometheus.GaugeValue, + getValues: func(s *info.ContainerStats) metricValues { + return metricValues{{value: float64(s.Memory.Socket), timestamp: s.Timestamp}} + }, }, { name: "container_memory_swap", help: "Container swap usage in bytes.", diff --git a/metrics/prometheus_fake.go b/metrics/prometheus_fake.go index fd43b78148..2b9c268311 100644 --- a/metrics/prometheus_fake.go +++ b/metrics/prometheus_fake.go @@ -356,6 +356,7 @@ func (p testSubcontainersInfoProvider) GetRequestedContainersInfo(string, v2.Req Cache: 14, RSS: 15, MappedFile: 16, + Socket: 16, KernelUsage: 17, Swap: 8192, },