php小編草莓今天給大家介紹一個(gè)非常實(shí)用的方法,即從Golang中的/proc/meminfo中提取內(nèi)存和交換信息。在Golang開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要獲取系統(tǒng)的內(nèi)存和交換信息,以便進(jìn)行一些性能優(yōu)化或者資源管理的操作。而/proc/meminfo是一個(gè)保存了系統(tǒng)內(nèi)存和交換信息的文件,我們可以通過(guò)讀取該文件來(lái)獲取所需的信息。接下來(lái),我將為大家詳細(xì)介紹如何使用Golang來(lái)提取/proc/meminfo中的內(nèi)存和交換信息,希望對(duì)大家有所幫助。
問(wèn)題內(nèi)容
我想從 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) } }
登錄后復(fù)制
這給了我以下結(jié)果:
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
登錄后復(fù)制
所以第一個(gè)問(wèn)題,有沒(méi)有辦法將結(jié)果限制為我想要的一個(gè)值(非零)?或者,有沒(méi)有更好的方法來(lái)解決這個(gè)問(wèn)題?
我的 /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
登錄后復(fù)制
解決方法
注意,s.Scan()
逐行讀取輸入。如果某行與給 fmt.Sscanf
的格式字符串不匹配,則程序?qū)⑤敵?0 作為 var n int
在循環(huán)內(nèi)聲明。我的建議是檢查 fmt.Sscanf` 返回的第一個(gè)結(jié)果,即匹配的項(xiàng)目數(shù)。因此,如果第一個(gè)結(jié)果是 1,則表示有匹配項(xiàng)并且可以輸出該值。請(qǐng)參閱此處的工作示例:https://www.php.cn/link/25d0a45ccd9e33b6b1ef8760801b6841 p>
編輯:我試圖盡可能接近您的代碼。可能還會(huì)存在其他問(wèn)題,因?yàn)樗褂玫臏y(cè)量單位可能會(huì)根據(jù) 手冊(cè)頁(yè)。但是,如果系統(tǒng)上的相關(guān)值始終以“kB”為單位輸出,那么它對(duì)于您的用例來(lái)說(shuō)可能已經(jīng)足夠了。