GNU/Linux >> Belajar Linux >  >> Linux

Cara mendapatkan penggunaan CPU

Lihat paket ini http://github.com/c9s/goprocinfo, paket goprocinfo melakukan penguraian untuk Anda.

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
}

Saya memiliki masalah serupa dan tidak pernah menemukan implementasi yang ringan. Ini adalah versi ramping dari solusi saya yang menjawab pertanyaan spesifik Anda. Saya mencicipi /proc/stat file seperti yang tylerl rekomendasikan. Anda akan melihat bahwa saya menunggu 3 detik antara sampel untuk mencocokkan keluaran teratas, tetapi saya juga mendapatkan hasil yang baik dengan 1 atau 2 detik. Saya menjalankan kode serupa dalam satu lingkaran dalam rutinitas go, lalu saya mengakses penggunaan cpu saat saya membutuhkannya dari rutinitas go lainnya.

Anda juga dapat mengurai keluaran dari top -n1 | grep -i cpu untuk mendapatkan penggunaan cpu, tetapi hanya mengambil sampel setengah detik di kotak linux saya dan mati saat beban berat. Top reguler sepertinya sangat cocok ketika saya menyinkronkannya dan program berikut:

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)
}

Sepertinya saya diizinkan menautkan ke implementasi penuh yang saya tulis di bitbucket; jika tidak, silakan hapus ini. Sejauh ini hanya berfungsi di linux:systemstat.go


Linux
  1. Cara mendapatkan total penggunaan cpu di Linux menggunakan C++

  2. Bagaimana cara mendapatkan ps untuk mencetak grup?

  3. Bagaimana cara mendapatkan persentase penggunaan prosesor dengan bash?

  1. Bagaimana cara mendapatkan% penggunaan memori dengan vmstat?

  2. Cara menemukan Proses mana yang menyebabkan penggunaan CPU Tinggi

  3. Bagaimana cara mencatat penggunaan CPU per proses?

  1. Cara Membatasi Penggunaan CPU Suatu Proses Di Linux

  2. Cara Menemukan Proses Berjalan Teratas berdasarkan Memori dan Penggunaan CPU

  3. Dapatkan penggunaan CPU dalam skrip shell?