github.com/jen20/docker@v1.13.1/daemon/top_windows.go (about) 1 package daemon 2 3 import ( 4 "errors" 5 "fmt" 6 "time" 7 8 "github.com/docker/docker/api/types" 9 "github.com/docker/go-units" 10 ) 11 12 // ContainerTop handles `docker top` client requests. 13 // Future considerations: 14 // -- Windows users are far more familiar with CPU% total. 15 // Further, users on Windows rarely see user/kernel CPU stats split. 16 // The kernel returns everything in terms of 100ns. To obtain 17 // CPU%, we could do something like docker stats does which takes two 18 // samples, subtract the difference and do the maths. Unfortunately this 19 // would slow the stat call down and require two kernel calls. So instead, 20 // we do something similar to linux and display the CPU as combined HH:MM:SS.mmm. 21 // -- Perhaps we could add an argument to display "raw" stats 22 // -- "Memory" is an extremely overloaded term in Windows. Hence we do what 23 // task manager does and use the private working set as the memory counter. 24 // We could return more info for those who really understand how memory 25 // management works in Windows if we introduced a "raw" stats (above). 26 func (daemon *Daemon) ContainerTop(name string, psArgs string) (*types.ContainerProcessList, error) { 27 // It's not at all an equivalent to linux 'ps' on Windows 28 if psArgs != "" { 29 return nil, errors.New("Windows does not support arguments to top") 30 } 31 32 container, err := daemon.GetContainer(name) 33 if err != nil { 34 return nil, err 35 } 36 37 s, err := daemon.containerd.Summary(container.ID) 38 if err != nil { 39 return nil, err 40 } 41 procList := &types.ContainerProcessList{} 42 procList.Titles = []string{"Name", "PID", "CPU", "Private Working Set"} 43 44 for _, j := range s { 45 d := time.Duration((j.KernelTime100ns + j.UserTime100ns) * 100) // Combined time in nanoseconds 46 procList.Processes = append(procList.Processes, []string{ 47 j.ImageName, 48 fmt.Sprint(j.ProcessId), 49 fmt.Sprintf("%02d:%02d:%02d.%03d", int(d.Hours()), int(d.Minutes())%60, int(d.Seconds())%60, int(d.Nanoseconds()/1000000)%1000), 50 units.HumanSize(float64(j.MemoryWorkingSetPrivateBytes))}) 51 } 52 return procList, nil 53 }