Heim  >  Artikel  >  Backend-Entwicklung  >  Extrahieren Sie Speicher und tauschen Sie Informationen aus /proc/meminfo in Golang aus

Extrahieren Sie Speicher und tauschen Sie Informationen aus /proc/meminfo in Golang aus

王林
王林nach vorne
2024-02-12 18:24:09377Durchsuche

从 Golang 中的 /proc/meminfo 中提取内存和交换信息

Der Herausgeber von PHP, Strawberry, stellt Ihnen heute eine sehr praktische Methode vor, nämlich das Extrahieren von Speicher und den Austausch von Informationen aus /proc/meminfo in Golang. Während des Golang-Entwicklungsprozesses müssen wir häufig den Speicher des Systems abrufen und Informationen austauschen, um einige Leistungsoptimierungs- oder Ressourcenverwaltungsvorgänge durchzuführen. /proc/meminfo ist eine Datei, die Systemspeicher und Auslagerungsinformationen speichert. Durch Lesen dieser Datei können wir die erforderlichen Informationen erhalten. Als nächstes werde ich detailliert vorstellen, wie Sie mit Golang den Speicher extrahieren und Informationen in /proc/meminfo austauschen.

Frageninhalt

Ich möchte die Werte von Memtotal, Memfree, Memavailable, Swaptotal und Swapfree aus /proc/meminfo in Golang extrahieren. Das Beste, was ich bisher erreicht habe, ist die Verwendung von fmt.sscanf(), das mir den gewünschten Wert einzeln liefert, aber ich erhalte auch viele Ausgabezeilen mit Nullen. Dies ist der Code, den ich verwende:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    f, e := os.open("/proc/meminfo")
    if e != nil {
        panic(e)
    }
    defer f.close()
    s := bufio.newscanner(f)
    for s.scan() {
        var n int
        fmt.sscanf(s.text(), "memfree: %d kb", &n)
        fmt.println(n)
    }
}

Dadurch erhalte ich folgendes Ergebnis:

0
11260616
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

Also erste Frage: Gibt es eine Möglichkeit, das Ergebnis auf einen Wert (nicht Null) zu beschränken, den ich möchte? Oder gibt es einen besseren Weg, dieses Problem zu lösen?

Meine /proc/meminfo-Datei sieht so aus:

MemTotal:       16314336 kB
MemFree:        11268004 kB
MemAvailable:   13955820 kB
Buffers:          330284 kB
Cached:          2536848 kB
SwapCached:            0 kB
Active:          1259348 kB
Inactive:        3183140 kB
Active(anon):       4272 kB
Inactive(anon):  1578028 kB
Active(file):    1255076 kB
Inactive(file):  1605112 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       4194304 kB
SwapFree:        4194304 kB
Dirty:                96 kB
Writeback:             0 kB
AnonPages:       1411704 kB
Mapped:           594408 kB
Shmem:              6940 kB
KReclaimable:     151936 kB
Slab:             253384 kB
SReclaimable:     151936 kB
SUnreclaim:       101448 kB
KernelStack:       17184 kB
PageTables:        25060 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    12351472 kB
Committed_AS:    6092984 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       40828 kB
VmallocChunk:          0 kB
Percpu:             5696 kB
AnonHugePages:    720896 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      230400 kB
DirectMap2M:    11235328 kB
DirectMap1G:    14680064 kB

Solution

Beachten Sie, dass s.Scan() 逐行读取输入。如果某行与给 fmt.Sscanf 的格式字符串不匹配,则程序将输出 0 作为 var n int innerhalb einer Schleife deklariert wird. Mein Vorschlag ist, das erste von fmt.Sscanf` zurückgegebene Ergebnis zu überprüfen, nämlich die Anzahl der übereinstimmenden Elemente. Wenn das erste Ergebnis also 1 ist, bedeutet das, dass eine Übereinstimmung vorliegt und dieser Wert ausgegeben werden kann. Ein funktionierendes Beispiel finden Sie hier: https://www.php.cn/link/25d0a45ccd9e33b6b1ef8760801b6841 p>

EDIT: Ich habe versucht, Ihrem Code so nahe wie möglich zu kommen. Es kann zu anderen Problemen kommen, da die verwendeten Maßeinheiten je nach Manpage variieren können. Wenn der entsprechende Wert auf Ihrem System jedoch immer in „kB“ ausgegeben wird, dann kann es für Ihren Anwendungsfall ausreichend sein.

Das obige ist der detaillierte Inhalt vonExtrahieren Sie Speicher und tauschen Sie Informationen aus /proc/meminfo in Golang aus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen