当前位置: 首页 > 面试题库 >

Golang OS / EXEC,实时内存使用情况

李博达
2023-03-14
问题内容

我正在使用Linux,go和os /exec运行一些命令。我想知道一个进程的实时内存使用情况。这意味着我可以在启动进程后的任何时间(而不是在运行之后)随时请求内存使用情况。

(这就是为什么在回答测量使用golang可执行文件运行的内存使用量是 不是 一种选择对我来说)

例如:

cmd := exec.Command(...)
cmd.Start()
//...
if cmd.Memory()>50 { 
    fmt.Println("Oh my god, this process is hungry for memory!")
}

我不需要非常精确的值,但是如果它的错误范围小于10兆字节,那就太好了。

有没有办法做到这一点,或者我需要某种命令行技巧?


问题答案:

这是我在Linux上使用的:

func calculateMemory(pid int) (uint64, error) {

    f, err := os.Open(fmt.Sprintf("/proc/%d/smaps", pid))
    if err != nil {
        return 0, err
    }
    defer f.Close()

    res := uint64(0)
    pfx := []byte("Pss:")
    r := bufio.NewScanner(f)
    for r.Scan() {
        line := r.Bytes()
        if bytes.HasPrefix(line, pfx) {
            var size uint64
            _, err := fmt.Sscanf(string(line[4:]), "%d", &size)
            if err != nil {
                return 0, err
            }
            res += size
        }
    }
    if err := r.Err(); err != nil {
        return 0, err
    }

    return res, nil
}

此函数返回给定PID的PSS(比例设置大小),以KB表示。如果您刚刚开始该过程,则应该有权访问相应的/
proc文件。

使用内核3.0.13测试。



 类似资料:
  • 问题内容: 我在此处粘贴一些代码,这些代码使用boost iostream进行mmap并写入映射的文件: 当我在具有8个处理器和16GB RAM的centos 6机器上执行此操作时,我观察到以下内容: 当将数据插入到内存映射文件中时,RES(来自顶部命令)不断增加,直到14GB。我的印象是,当我映射文件时,VIRT将增加而不是RES。那么当我们写入mmap文件时,是先将其写入内存,然后再提交到磁盘

  • 问题内容: 是否有一个准则来估计a消耗的内存量? 寻找类似于这些准则的估计内存使用情况的东西。 问题答案: 如果您查看源代码中的字段,则有: 的评论说 用于存储规范的字符串表示形式(如果已计算)。 假设您不调用,它将保留为零字节。因此是(8 + 4 + 4)= 16个字节+ 。 本身是4 + 4 + 4 + 4 + 4 = 20字节+ 。 20 + 16总共提供了36个字节加上大小,该大小始终是表

  • 问题内容: 当redis达到“最大内存”条件时,它将允许客户端进行读取,但不能进行写入。 当然,这将导致致命错误……有什么方法可以使Rails处理缓存的读或写错误,因此,如果缓存发生问题(可用性,读取,写入等),它将继续以如果缓存设置为“关闭”? 问题答案: 您可以告诉redis在内存已满时要遵守的不同行为。 默认是 也许最好的选择是’volatile-ttl’,并确保所有缓存都包括:expire

  • 要手动显示Netbeans平台上的内存使用小部件,我必须右键单击工具栏,然后选择memory。 是否有一种方法可以让内存使用小部件在启动时显示为默认?这样它将在启动时显示,而无需用户输入。

  • 问题内容: 有什么工具可以知道我的Java应用程序已使用了多少个本机内存?我的应用程序内存不足:当前设置是:-Xmx900m 计算机,Windows 2003 Server 32位,RAM 4GB。 还在Windows上将boot.ini更改为/ 3GB,会有什么不同吗?如果设置为Xmx900m,则可以为此进程分配多少最大本机内存?是1100m吗? 问题答案: (就我而言,我使用的是Java 8)

  • 问题内容: 我目前正在测试将密钥插入数据库Redis(在本地)中。我有超过500万个密钥,而且我只有4GB的RAM,所以一时我达到了RAM的容量并交换了数据(并且我的PC掉了)。 我的问题是:如何在具有Redis数据库的计算机上监视内存使用情况,并以此方式发出警报,不再在Redis数据库中插入某些密钥? 谢谢。 问题答案: 关于内存使用情况,建议您查看redis.io 常见问题解答以及有关将red