From 4ac1c673aa27ac3a82e41435c88feacd3be3ff6f Mon Sep 17 00:00:00 2001 From: Diptanu Choudhury Date: Fri, 10 Jun 2016 23:32:45 +0200 Subject: [PATCH] Implementing the total ticks per task for the docker driver --- api/tasks.go | 2 +- client/driver/docker.go | 15 +++++++++++++++ client/driver/executor/executor.go | 2 +- client/driver/executor/executor_linux.go | 2 +- client/driver/structs/structs.go | 2 +- 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/api/tasks.go b/api/tasks.go index f01011bf9..33834b2a9 100644 --- a/api/tasks.go +++ b/api/tasks.go @@ -19,7 +19,7 @@ type MemoryStats struct { type CpuStats struct { SystemMode float64 UserMode float64 - Ticks float64 + TotalTicks float64 ThrottledPeriods uint64 ThrottledTime uint64 Percent float64 diff --git a/client/driver/docker.go b/client/driver/docker.go index 616e78b8e..c965e5820 100644 --- a/client/driver/docker.go +++ b/client/driver/docker.go @@ -24,6 +24,7 @@ import ( cstructs "github.com/hashicorp/nomad/client/driver/structs" "github.com/hashicorp/nomad/helper/discover" "github.com/hashicorp/nomad/helper/fields" + shelpers "github.com/hashicorp/nomad/helper/stats" "github.com/hashicorp/nomad/nomad/structs" "github.com/mitchellh/mapstructure" ) @@ -125,6 +126,7 @@ type DockerHandle struct { imageID string containerID string version string + clkSpeed float64 killTimeout time.Duration maxKillTimeout time.Duration resourceUsageLock sync.RWMutex @@ -777,6 +779,9 @@ func (d *DockerDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle doneCh: make(chan bool), waitCh: make(chan *cstructs.WaitResult, 1), } + if clkSpeed, err := shelpers.TotalTicksAvailable(); err == nil { + h.clkSpeed = clkSpeed + } if err := exec.SyncServices(consulContext(d.config, container.ID)); err != nil { d.logger.Printf("[ERR] driver.docker: error registering services with consul for task: %q: %v", task.Name, err) } @@ -851,6 +856,9 @@ func (d *DockerDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, er doneCh: make(chan bool), waitCh: make(chan *cstructs.WaitResult, 1), } + if clkSpeed, err := shelpers.TotalTicksAvailable(); err == nil { + h.clkSpeed = clkSpeed + } if err := exec.SyncServices(consulContext(d.config, pid.ContainerID)); err != nil { h.logger.Printf("[ERR] driver.docker: error registering services with consul: %v", err) } @@ -1015,6 +1023,13 @@ func (h *DockerHandle) collectStats() { s.CPUStats.CPUUsage.UsageInUsermode, s.PreCPUStats.CPUUsage.UsageInUsermode, s.CPUStats.CPUUsage.TotalUsage, s.PreCPUStats.CPUUsage.TotalUsage, cores) + if h.clkSpeed == 0.0 { + if clkSpeed, err := shelpers.TotalTicksAvailable(); err != nil { + h.clkSpeed = clkSpeed + } + } + cs.TotalTicks = (cs.Percent / 100) * h.clkSpeed + h.resourceUsageLock.Lock() h.resourceUsage = &cstructs.TaskResourceUsage{ ResourceUsage: &cstructs.ResourceUsage{ diff --git a/client/driver/executor/executor.go b/client/driver/executor/executor.go index 7e89a7faf..2efacbec6 100644 --- a/client/driver/executor/executor.go +++ b/client/driver/executor/executor.go @@ -787,7 +787,7 @@ func (e *UniversalExecutor) aggregatedResourceUsage(pidStats map[string]*cstruct UserMode: userModeCPU, Percent: percent, Measured: ExecutorBasicMeasuredCpuStats, - Ticks: totalTicks, + TotalTicks: totalTicks, } totalMemory := &cstructs.MemoryStats{ diff --git a/client/driver/executor/executor_linux.go b/client/driver/executor/executor_linux.go index 19bf2fa0d..48983a62b 100644 --- a/client/driver/executor/executor_linux.go +++ b/client/driver/executor/executor_linux.go @@ -173,7 +173,7 @@ func (e *UniversalExecutor) Stats() (*cstructs.TaskResourceUsage, error) { Percent: percent, ThrottledPeriods: stats.CpuStats.ThrottlingData.ThrottledPeriods, ThrottledTime: stats.CpuStats.ThrottlingData.ThrottledTime, - Ticks: e.systemCpuStats.TicksConsumed(percent), + TotalTicks: e.systemCpuStats.TicksConsumed(percent), Measured: ExecutorCgroupMeasuredCpuStats, } taskResUsage := cstructs.TaskResourceUsage{ diff --git a/client/driver/structs/structs.go b/client/driver/structs/structs.go index dba01e94a..2410f371f 100644 --- a/client/driver/structs/structs.go +++ b/client/driver/structs/structs.go @@ -102,7 +102,7 @@ type MemoryStats struct { type CpuStats struct { SystemMode float64 UserMode float64 - Ticks float64 + TotalTicks float64 ThrottledPeriods uint64 ThrottledTime uint64 Percent float64