Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ekstrak memori dan tukar maklumat daripada /proc/meminfo di Golang

Ekstrak memori dan tukar maklumat daripada /proc/meminfo di Golang

王林
王林ke hadapan
2024-02-12 18:24:09332semak imbas

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

editor php Strawberry akan memperkenalkan kepada anda hari ini kaedah yang sangat praktikal, iaitu mengekstrak memori dan bertukar maklumat daripada /proc/meminfo di Golang. Semasa proses pembangunan Golang, kita selalunya perlu mendapatkan memori sistem dan bertukar maklumat untuk melaksanakan beberapa pengoptimuman prestasi atau operasi pengurusan sumber. /proc/meminfo ialah fail yang menyimpan memori sistem dan maklumat pertukaran Kita boleh mendapatkan maklumat yang diperlukan dengan membaca fail ini. Seterusnya, saya akan memperkenalkan secara terperinci cara menggunakan Golang untuk mengekstrak memori dan bertukar maklumat dalam /proc/meminfo saya harap ia akan membantu anda.

Kandungan soalan

Saya ingin mengekstrak nilai memtotal, memfree, memavailable, swaptotal dan swapfree daripada /proc/meminfo dalam golang. Yang paling dekat yang saya perolehi setakat ini ialah menggunakan fmt.sscanf() yang akan memberikan saya nilai yang saya inginkan satu demi satu, tetapi saya juga mendapat banyak baris keluaran dengan sifar. Ini adalah kod yang saya gunakan:

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

Ini memberikan saya hasil berikut:

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

Soalan pertama, adakah terdapat cara untuk mengehadkan hasil kepada satu nilai (bukan sifar) yang saya mahukan? Atau, adakah cara yang lebih baik untuk menyelesaikan masalah ini?

Fail /proc/meminfo saya kelihatan seperti ini:

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

Penyelesaian

Perhatikan bahawa s.Scan() 逐行读取输入。如果某行与给 fmt.Sscanf 的格式字符串不匹配,则程序将输出 0 作为 var n int diisytiharkan dalam gelung. Cadangan saya ialah untuk menyemak hasil pertama yang dikembalikan oleh fmt.Sscanf`, iaitu bilangan item yang sepadan. Jadi jika keputusan pertama ialah 1, itu bermakna terdapat padanan dan nilai itu boleh dikeluarkan. Lihat contoh yang berfungsi di sini: https://www.php.cn/link/25d0a45ccd9e33b6b1ef8760801b6841 p>

EDIT: Saya cuba sedekat mungkin dengan kod anda. Mungkin ada isu lain kerana unit ukuran yang digunakan mungkin berbeza mengikut man page. Walau bagaimanapun, jika nilai yang berkaitan pada sistem anda sentiasa dikeluarkan dalam "kB", maka ia mungkin mencukupi untuk kes penggunaan anda.

Atas ialah kandungan terperinci Ekstrak memori dan tukar maklumat daripada /proc/meminfo di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam