Heim > Artikel > Backend-Entwicklung > Extrahieren Sie Speicher und tauschen Sie Informationen aus /proc/meminfo in Golang aus
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.
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
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!