GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo obtener el uso de la CPU

Consulte este paquete http://github.com/c9s/goprocinfo, el paquete goprocinfo hace el análisis por usted.

stat, err := linuxproc.ReadStat("/proc/stat")
if err != nil {
    t.Fatal("stat read fail")
}

for _, s := range stat.CPUStats {
    // s.User
    // s.Nice
    // s.System
    // s.Idle
    // s.IOWait
}

Tuve un problema similar y nunca encontré una implementación ligera. Aquí hay una versión reducida de mi solución que responde a su pregunta específica. Muestro el /proc/stat archivo tal como lo recomienda tylerl. Notarás que espero 3 segundos entre muestras para igualar la salida de top, pero también he tenido buenos resultados con 1 o 2 segundos. Ejecuto un código similar en un bucle dentro de una rutina go, luego accedo al uso de la CPU cuando lo necesito de otras rutinas go.

También puede analizar la salida de top -n1 | grep -i cpu para obtener el uso de la CPU, pero solo muestrea durante medio segundo en mi caja de Linux y se apagó durante la carga pesada. La parte superior normal parecía coincidir mucho cuando la sincronicé y el siguiente programa:

package main

import (
    "fmt"
    "io/ioutil"
    "strconv"
    "strings"
    "time"
)

func getCPUSample() (idle, total uint64) {
    contents, err := ioutil.ReadFile("/proc/stat")
    if err != nil {
        return
    }
    lines := strings.Split(string(contents), "\n")
    for _, line := range(lines) {
        fields := strings.Fields(line)
        if fields[0] == "cpu" {
            numFields := len(fields)
            for i := 1; i < numFields; i++ {
                val, err := strconv.ParseUint(fields[i], 10, 64)
                if err != nil {
                    fmt.Println("Error: ", i, fields[i], err)
                }
                total += val // tally up all the numbers to get total ticks
                if i == 4 {  // idle is the 5th field in the cpu line
                    idle = val
                }
            }
            return
        }
    }
    return
}

func main() {
    idle0, total0 := getCPUSample()
    time.Sleep(3 * time.Second)
    idle1, total1 := getCPUSample()

    idleTicks := float64(idle1 - idle0)
    totalTicks := float64(total1 - total0)
    cpuUsage := 100 * (totalTicks - idleTicks) / totalTicks

    fmt.Printf("CPU usage is %f%% [busy: %f, total: %f]\n", cpuUsage, totalTicks-idleTicks, totalTicks)
}

Parece que puedo vincular a la implementación completa que escribí en bitbucket; si no es así, siéntete libre de borrar esto. Sin embargo, hasta ahora solo funciona en Linux:systemstat.go


Linux
  1. Cómo limitar el uso de la CPU de un proceso en Linux

  2. Cómo encontrar los principales procesos en ejecución por memoria y uso de CPU

  3. ¿Obtener el uso de la CPU en el script de Shell?

  4. Cómo obtener el uso total de la CPU en Linux usando C++

  5. ¿Cómo obtener ps para imprimir grupo?

Cómo mostrar el uso de la CPU desde la línea de comandos

Cómo encontrar los 10 principales procesos en ejecución por memoria y uso de CPU

Cómo obtener el uso de la CPU de un solo proceso en Linux

Cómo verificar el uso o la utilización de la CPU de Linux

¿Cómo obtengo el uso total de CPU de una aplicación de /proc/pid/stat?

¿En qué se parecen el tiempo de CPU y el uso de CPU?