123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- // Copyright (c) 2012 VMware, Inc.
- package gosigar
- import (
- "io/ioutil"
- "strconv"
- "strings"
- "syscall"
- )
- func init() {
- system.ticks = 100 // C.sysconf(C._SC_CLK_TCK)
- Procd = "/proc"
- getLinuxBootTime()
- }
- func getMountTableFileName() string {
- return "/etc/mtab"
- }
- func (self *Uptime) Get() error {
- sysinfo := syscall.Sysinfo_t{}
- if err := syscall.Sysinfo(&sysinfo); err != nil {
- return err
- }
- self.Length = float64(sysinfo.Uptime)
- return nil
- }
- func (self *FDUsage) Get() error {
- return readFile(Procd+"/sys/fs/file-nr", func(line string) bool {
- fields := strings.Fields(line)
- if len(fields) == 3 {
- self.Open, _ = strconv.ParseUint(fields[0], 10, 64)
- self.Unused, _ = strconv.ParseUint(fields[1], 10, 64)
- self.Max, _ = strconv.ParseUint(fields[2], 10, 64)
- }
- return false
- })
- }
- func (self *HugeTLBPages) Get() error {
- table, err := parseMeminfo()
- if err != nil {
- return err
- }
- self.Total, _ = table["HugePages_Total"]
- self.Free, _ = table["HugePages_Free"]
- self.Reserved, _ = table["HugePages_Rsvd"]
- self.Surplus, _ = table["HugePages_Surp"]
- self.DefaultSize, _ = table["Hugepagesize"]
- if totalSize, found := table["Hugetlb"]; found {
- self.TotalAllocatedSize = totalSize
- } else {
- // If Hugetlb is not present, or huge pages of different sizes
- // are used, this figure can be unaccurate.
- // TODO (jsoriano): Extract information from /sys/kernel/mm/hugepages too
- self.TotalAllocatedSize = (self.Total - self.Free + self.Reserved) * self.DefaultSize
- }
- return nil
- }
- func (self *ProcFDUsage) Get(pid int) error {
- err := readFile(procFileName(pid, "limits"), func(line string) bool {
- if strings.HasPrefix(line, "Max open files") {
- fields := strings.Fields(line)
- if len(fields) == 6 {
- self.SoftLimit, _ = strconv.ParseUint(fields[3], 10, 64)
- self.HardLimit, _ = strconv.ParseUint(fields[4], 10, 64)
- }
- return false
- }
- return true
- })
- if err != nil {
- return err
- }
- fds, err := ioutil.ReadDir(procFileName(pid, "fd"))
- if err != nil {
- return err
- }
- self.Open = uint64(len(fds))
- return nil
- }
- func parseCpuStat(self *Cpu, line string) error {
- fields := strings.Fields(line)
- self.User, _ = strtoull(fields[1])
- self.Nice, _ = strtoull(fields[2])
- self.Sys, _ = strtoull(fields[3])
- self.Idle, _ = strtoull(fields[4])
- self.Wait, _ = strtoull(fields[5])
- self.Irq, _ = strtoull(fields[6])
- self.SoftIrq, _ = strtoull(fields[7])
- self.Stolen, _ = strtoull(fields[8])
- return nil
- }
|