查看/proc/self/状态时,VMRSS或VMIZE的变化不一致

Inconsistent change in VmRSS or VmSize when looking at /proc/self/status

本文关键字:VMIZE 变化 不一致 VMRSS proc self 状态 查看      更新时间:2023-10-16

我一直在调查Red Hat Enterprise Linux 6上的客户。我在Ubuntu上也看到了类似的行为。客户正在通过输出来跟踪内存使用量/proc/self/status

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

在程序的各个阶段,正在跟踪内存使用情况(通过呼叫/proc/proc/self/status函数粘贴到结束时),一次在释放该内存后一次,一次在卸载内存之后,一次卸载后一次。动态库。

当分配的内存的数量超过一定值时,释放内存后,VMRS不会立即下降,但是在卸载SO文件后会立即下降。释放内存后,当分配的内存的数量为小VMRS时,立即下降。

我已经在应用程序上运行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;
    }
  }
}

一旦我遇到了Suricata的相似问题 - 该程序将加载到内存中很多小规则,一旦开发人员添加了动态的规则重新加载,该程序最终会不断占用两次即使在加载新的规则后,所有先前的规则都释放了,但同样多的内存。

是由一个事实引起的,有很多规则,每个规则一个malloc,但每个规则都没有太多空间=>内部使用的malloc brk/sbrk(类似堆栈),而不是mmap =>作为原始规则低于数据段的新规则,即使释放了原始规则的千兆字节,该部分也没有减少。

在这种情况下,解决方案是一次分配大量的内存,然后手动将其分成较小的零件。

关于文件,它是mmmpapped的,因此可以在将内存立即发布后立即释放。