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 中提取内存和交换信息的详细内容,更多请关注编程网其它相关文章!