首頁  >  文章  >  後端開發  >  從 Golang 中的 /proc/meminfo 中提取內存和交換信息

從 Golang 中的 /proc/meminfo 中提取內存和交換信息

王林
王林轉載
2024-02-12 18:24:09332瀏覽

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

php小編草莓今天要介紹一個非常實用的方法,就是從Golang中的/proc/meminfo中提取記憶體和交換資訊。在Golang開發過程中,我們經常需要取得系統的記憶體和交換訊息,以便進行一些效能最佳化或資源管理的操作。而/proc/meminfo是一個保存了系統內存和交換資訊的文件,我們可以透過讀取該文件來獲取所需的資訊。接下來,我將為大家詳細介紹如何使用Golang來提取/proc/meminfo中的內存和交換信息,希望對大家有所幫助。

問題內容

我想從 golang 中的 /proc/meminfo 中提取 memtotal、memfree、memavailable、swaptotal 和 swapfree 的值。到目前為止,我得到的最接近的是使用 fmt.sscanf() ,它將一次給出我想要的值,但我也得到了許多帶有零的輸出行。這是我正在使用的程式碼:

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

這給了我以下結果:

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

所以第一個問題,有沒有辦法將結果限制在我想要的一個值(非零)?或者,有沒有更好的方法來解決這個問題?

我的 /proc/meminfo 檔案如下所示:

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

解決方法

注意,s.Scan() 逐行讀取輸入。如果某行與給 fmt.Sscanf 的格式字串不匹配,則程式將輸出 0 作為 var n int 在循環內宣告。我的建議是檢查 fmt.Sscanf` 傳回的第一個結果,即符合的項目數。因此,如果第一個結果是 1,則表示有匹配項並且可以輸出該值。請參閱此處的工作範例:https://www.php.cn/link/25d0a45ccd9e33b6b1ef8760801b6841 p>

編輯:我試圖盡可能接近您的程式碼。可能還會有其他問題,因為所使用的測量單位可能會根據 手冊頁。但是,如果系統上的相關值始終以“kB”為單位輸出,那麼它對於您的用例來說可能已經足夠了。

以上是從 Golang 中的 /proc/meminfo 中提取內存和交換信息的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除