func GetProcesses(cgroupManager cgroups.Manager) ([]int, error) { pids, err := cgroupManager.GetPids() if err != nil { return nil, err } return pids, nil }
// killCgroupProcesses freezes then iterates over all the processes inside the // manager's cgroups sending a SIGKILL to each process then waiting for them to // exit. func killCgroupProcesses(m cgroups.Manager) error { var procs []*os.Process if err := m.Freeze(configs.Frozen); err != nil { logrus.Warn(err) } pids, err := m.GetPids() if err != nil { m.Freeze(configs.Thawed) return err } for _, pid := range pids { if p, err := os.FindProcess(pid); err == nil { procs = append(procs, p) if err := p.Kill(); err != nil { logrus.Warn(err) } } } if err := m.Freeze(configs.Thawed); err != nil { logrus.Warn(err) } for _, p := range procs { if _, err := p.Wait(); err != nil { logrus.Warn(err) } } return nil }
// signalAllProcesses freezes then iterates over all the processes inside the // manager's cgroups sending a SIGKILL to each process then waiting for them to // exit. func signalAllProcesses(m cgroups.Manager, s os.Signal) error { var procs []*os.Process if err := m.Freeze(configs.Frozen); err != nil { logrus.Warn(err) } pids, err := m.GetAllPids() if err != nil { m.Freeze(configs.Thawed) return err } for _, pid := range pids { p, err := os.FindProcess(pid) if err != nil { logrus.Warn(err) continue } procs = append(procs, p) if err := p.Signal(s); err != nil { logrus.Warn(err) } } if err := m.Freeze(configs.Thawed); err != nil { logrus.Warn(err) } for _, p := range procs { if _, err := p.Wait(); err != nil { logrus.Warn(err) } } return nil }
// Get cgroup and networking stats of the specified container func GetStats(cgroupManager cgroups.Manager, rootFs string, pid int, ignoreMetrics container.MetricSet) (*info.ContainerStats, error) { cgroupStats, err := cgroupManager.GetStats() if err != nil { return nil, err } libcontainerStats := &libcontainer.Stats{ CgroupStats: cgroupStats, } stats := toContainerStats(libcontainerStats) // If we know the pid then get network stats from /proc/<pid>/net/dev if pid == 0 { return stats, nil } if !ignoreMetrics.Has(container.NetworkUsageMetrics) { netStats, err := networkStatsFromProc(rootFs, pid) if err != nil { glog.V(2).Infof("Unable to get network stats from pid %d: %v", pid, err) } else { stats.Network.Interfaces = append(stats.Network.Interfaces, netStats...) } } if !ignoreMetrics.Has(container.NetworkTcpUsageMetrics) { t, err := tcpStatsFromProc(rootFs, pid, "net/tcp") if err != nil { glog.V(2).Infof("Unable to get tcp stats from pid %d: %v", pid, err) } else { stats.Network.Tcp = t } t6, err := tcpStatsFromProc(rootFs, pid, "net/tcp6") if err != nil { glog.V(2).Infof("Unable to get tcp6 stats from pid %d: %v", pid, err) } else { stats.Network.Tcp6 = t6 } } // For backwards compatibility. if len(stats.Network.Interfaces) > 0 { stats.Network.InterfaceStats = stats.Network.Interfaces[0] } return stats, nil }
// Get cgroup and networking stats of the specified container func GetStats(cgroupManager cgroups.Manager, rootFs string, pid int) (*info.ContainerStats, error) { cgroupStats, err := cgroupManager.GetStats() if err != nil { return nil, err } libcontainerStats := &libcontainer.Stats{ CgroupStats: cgroupStats, } stats := toContainerStats(libcontainerStats) // If we know the pid then get network stats from /proc/<pid>/net/dev if pid > 0 { netStats, err := networkStatsFromProc(rootFs, pid) if err != nil { glog.V(2).Infof("Unable to get network stats from pid %d: %v", pid, err) } else { stats.Network.Interfaces = append(stats.Network.Interfaces, netStats...) } // Commenting out to disable: too CPU intensive /*t, err := tcpStatsFromProc(rootFs, pid, "net/tcp") if err != nil { glog.V(2).Infof("Unable to get tcp stats from pid %d: %v", pid, err) } else { stats.Network.Tcp = t } t6, err := tcpStatsFromProc(rootFs, pid, "net/tcp6") if err != nil { glog.V(2).Infof("Unable to get tcp6 stats from pid %d: %v", pid, err) } else { stats.Network.Tcp6 = t6 }*/ } // For backwards compatibility. if len(stats.Network.Interfaces) > 0 { stats.Network.InterfaceStats = stats.Network.Interfaces[0] } return stats, nil }