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中文网其他相关文章!