查看/ proc / self / status时VmRSS或VmSize的变化不一致

时间:2017-02-15 22:05:12

标签: c++ bash memory redhat virtual-memory

我一直在调查Red Hat Enterprise Linux 6上的客户问题。我也在Ubuntu上看到了类似的行为。客户通过输出跟踪内存使用情况 的/ proc /自/状态

在使用特定ODBC驱动程序时,在ODBC应用程序中会发生这种情况,但我怀疑这与问题有关。

在程序的各个阶段跟踪内存使用情况(通过调用/ proc / self / status函数粘贴在程序的各个阶段),一次在堆上分配一些内存,一次在释放内存后,一次在卸载后动态库。

当分配的内存量超过某个值时,VmRSS在释放内存后不会立即关闭,但在卸载so文件后会立即关闭。当分配的内存量很小时,VmRSS在释放内存后立即关闭。

我在应用程序上运行了valgrind,但是我找不到任何内存泄漏。 任何帮助,解释,文章指针都非常感谢。

void print_proc_status_vm()
{
  std::ifstream proc_status_fhandle;
  proc_status_fhandle.open("/proc/self/status");
  std::string s;
  int line=0;
  static std::map<std::string, int> memoryUsage;
  while(std::getline(proc_status_fhandle, s)){
    ++line;
    if( (line >=12) and (line <=17 ) and (line !=14) )
    {   
        char* str = new char[s.size()+1];
        strcpy(str, s.c_str());
        std::string key(strtok(str, "\t "));

        int value = atoi(strtok(NULL, "\t "));

        printf("%s   %d \n", key.c_str(), value - memoryUsage[key] );

       memoryUsage[key] = value;
       delete[] str;
    }
  }
}

1 个答案:

答案 0 :(得分:0)

一旦我在suricata上遇到了类似的问题-该程序将很多小规则加载到内存中,并且开发人员添加了动态重载规则后,该程序最终将不断占用两倍的内存,即使所有加载新规则后,先前的规则将被释放。

这是因为有很多规则,每个规则一个malloc,但是每个规则占用的空间不很多=> malloc内部使用了brk / sbrk(类似于堆栈),而不是原来的mmap =>规则在数据段上低于新规则,即使释放了千兆字节的原始规则,该段也没有减少。

在这种情况下,解决方案是立即分配一大块内存,然后手动将其拆分成较小的块。

对于文件,它是映射文件,因此可以在取消映射后立即释放内存。