From e24d3e93fe8549cb5e9913d589952b201be27156 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Mon, 11 Dec 2017 19:25:36 +0000 Subject: [PATCH] Add static map of common keys to reduce allocations --- extras/generate_latest_map | 2 +- report/latest_map_generated.go | 4 +- report/map_helpers.go | 2 +- report/map_keys.go | 110 +++++++++++++++++++++++++++++++++ 4 files changed, 114 insertions(+), 4 deletions(-) diff --git a/extras/generate_latest_map b/extras/generate_latest_map index cfcfa434c..24d9d66b4 100755 --- a/extras/generate_latest_map +++ b/extras/generate_latest_map @@ -243,7 +243,7 @@ function generate_latest_map() { z.DecSendContainerState(containerMapKey) var key string if !r.TryDecodeAsNil() { - key = r.DecodeString() + key = lookupCommonKey(r.DecodeStringAsBytes()) } i := m.locate(key) (*m)[i].key = key diff --git a/report/latest_map_generated.go b/report/latest_map_generated.go index 33e203a96..86e181086 100644 --- a/report/latest_map_generated.go +++ b/report/latest_map_generated.go @@ -211,7 +211,7 @@ func (m *StringLatestMap) CodecDecodeSelf(decoder *codec.Decoder) { z.DecSendContainerState(containerMapKey) var key string if !r.TryDecodeAsNil() { - key = r.DecodeString() + key = lookupCommonKey(r.DecodeStringAsBytes()) } i := m.locate(key) (*m)[i].key = key @@ -432,7 +432,7 @@ func (m *NodeControlDataLatestMap) CodecDecodeSelf(decoder *codec.Decoder) { z.DecSendContainerState(containerMapKey) var key string if !r.TryDecodeAsNil() { - key = r.DecodeString() + key = lookupCommonKey(r.DecodeStringAsBytes()) } i := m.locate(key) (*m)[i].key = key diff --git a/report/map_helpers.go b/report/map_helpers.go index 080914490..480ddcf26 100644 --- a/report/map_helpers.go +++ b/report/map_helpers.go @@ -110,7 +110,7 @@ func mapRead(decoder *codec.Decoder, decodeValue func(isNil bool) interface{}) p var key string z.DecSendContainerState(containerMapKey) if !r.TryDecodeAsNil() { - key = r.DecodeString() + key = lookupCommonKey(r.DecodeStringAsBytes()) } z.DecSendContainerState(containerMapValue) diff --git a/report/map_keys.go b/report/map_keys.go index b29ca9bdf..865a3143b 100644 --- a/report/map_keys.go +++ b/report/map_keys.go @@ -78,3 +78,113 @@ const ( ECSScaleUp = "ecs_scale_up" ECSScaleDown = "ecs_scale_down" ) + +/* Lookup table to allow msgpack/json decoder to avoid heap allocation + for common ps.Map keys. The map is static so we don't have to lock + access from multiple threads and don't have to worry about it + getting clogged with values that are only used once. +*/ +var commonKeys = map[string]string{ + Endpoint: Endpoint, + Process: Process, + Container: Container, + Pod: Pod, + Service: Service, + Deployment: Deployment, + ReplicaSet: ReplicaSet, + DaemonSet: DaemonSet, + StatefulSet: StatefulSet, + CronJob: CronJob, + ContainerImage: ContainerImage, + Host: Host, + Overlay: Overlay, + ECSService: ECSService, + ECSTask: ECSTask, + SwarmService: SwarmService, + + HostNodeID: HostNodeID, + ControlProbeID: ControlProbeID, + DoesNotMakeConnections: DoesNotMakeConnections, + + ReverseDNSNames: ReverseDNSNames, + SnoopedDNSNames: SnoopedDNSNames, + CopyOf: CopyOf, + + PID: PID, + Name: Name, + PPID: PPID, + Cmdline: Cmdline, + Threads: Threads, + + DockerContainerID: DockerContainerID, + DockerImageID: DockerImageID, + DockerImageName: DockerImageName, + DockerImageSize: DockerImageSize, + DockerImageVirtualSize: DockerImageVirtualSize, + DockerIsInHostNetwork: DockerIsInHostNetwork, + DockerServiceName: DockerServiceName, + DockerStackNamespace: DockerStackNamespace, + DockerStopContainer: DockerStopContainer, + DockerStartContainer: DockerStartContainer, + DockerRestartContainer: DockerRestartContainer, + DockerPauseContainer: DockerPauseContainer, + DockerUnpauseContainer: DockerUnpauseContainer, + DockerRemoveContainer: DockerRemoveContainer, + DockerAttachContainer: DockerAttachContainer, + DockerExecContainer: DockerExecContainer, + DockerContainerName: DockerContainerName, + DockerContainerCommand: DockerContainerCommand, + DockerContainerPorts: DockerContainerPorts, + DockerContainerCreated: DockerContainerCreated, + DockerContainerNetworks: DockerContainerNetworks, + DockerContainerIPs: DockerContainerIPs, + DockerContainerHostname: DockerContainerHostname, + DockerContainerIPsWithScopes: DockerContainerIPsWithScopes, + DockerContainerState: DockerContainerState, + DockerContainerStateHuman: DockerContainerStateHuman, + DockerContainerUptime: DockerContainerUptime, + DockerContainerRestartCount: DockerContainerRestartCount, + DockerContainerNetworkMode: DockerContainerNetworkMode, + + KubernetesName: KubernetesName, + KubernetesNamespace: KubernetesNamespace, + KubernetesCreated: KubernetesCreated, + KubernetesIP: KubernetesIP, + KubernetesObservedGeneration: KubernetesObservedGeneration, + KubernetesReplicas: KubernetesReplicas, + KubernetesDesiredReplicas: KubernetesDesiredReplicas, + KubernetesNodeType: KubernetesNodeType, + KubernetesGetLogs: KubernetesGetLogs, + KubernetesDeletePod: KubernetesDeletePod, + KubernetesScaleUp: KubernetesScaleUp, + KubernetesScaleDown: KubernetesScaleDown, + KubernetesUpdatedReplicas: KubernetesUpdatedReplicas, + KubernetesAvailableReplicas: KubernetesAvailableReplicas, + KubernetesUnavailableReplicas: KubernetesUnavailableReplicas, + KubernetesStrategy: KubernetesStrategy, + KubernetesFullyLabeledReplicas: KubernetesFullyLabeledReplicas, + KubernetesState: KubernetesState, + KubernetesIsInHostNetwork: KubernetesIsInHostNetwork, + KubernetesRestartCount: KubernetesRestartCount, + KubernetesMisscheduledReplicas: KubernetesMisscheduledReplicas, + KubernetesPublicIP: KubernetesPublicIP, + KubernetesSchedule: KubernetesSchedule, + KubernetesSuspended: KubernetesSuspended, + KubernetesLastScheduled: KubernetesLastScheduled, + KubernetesActiveJobs: KubernetesActiveJobs, + + ECSCluster: ECSCluster, + ECSCreatedAt: ECSCreatedAt, + ECSTaskFamily: ECSTaskFamily, + ECSServiceDesiredCount: ECSServiceDesiredCount, + ECSServiceRunningCount: ECSServiceRunningCount, + ECSScaleUp: ECSScaleUp, + ECSScaleDown: ECSScaleDown, +} + +func lookupCommonKey(b []byte) string { + if key, ok := commonKeys[string(b)]; ok { + return key + } + return string(b) +}