【问题标题】:Memory Allocation vs RSS in LinuxLinux 中的内存分配与 RSS
【发布时间】:2020-03-01 02:35:49
【问题描述】:

我正在尝试在 Linux 中以编程方式监控 RSS(驻留集大小)(通过解析 /proc/self/stat),但似乎 RSS 在我分配内存时并没有增加。

例如,考虑以下程序,它分配 10 个 4KB 缓冲区并在每次分配后打印 RSS。

 int main(int argc, char** argv) {
  const long pageSizeKb = sysconf(_SC_PAGE_SIZE) / 1024;
  cout << "pageSizeKB is " << pageSizeKb << "\n";
  std::vector<std::vector<char>> buffers;
  for (int i = 0; i < 10; i++) {
    buffers.emplace_back(4*1024);
    std::string line;
    getline(ifstream("/proc/self/stat", ios_base::in), line);
    std::vector<string> stats;
    boost::split(stats, line, boost::is_any_of(" "));
    cout << "allocated " << (i+1)*4 << "KB" << "\tRSS is " << stats[23] << "\n";
  }
}

它的输出是:

pageSizeKB is 4
allocated 4KB   RSS is 53507
allocated 8KB   RSS is 53507
allocated 12KB  RSS is 53507
allocated 16KB  RSS is 53507
allocated 20KB  RSS is 53507
allocated 24KB  RSS is 53507
allocated 28KB  RSS is 53507
allocated 32KB  RSS is 53507
allocated 36KB  RSS is 53507
allocated 40KB  RSS is 53507

每次分配后RSS不应该加一吗(页面为4KB)?

谢谢

【问题讨论】:

标签: c++ linux memory


【解决方案1】:

不,RSS 预计不会在每次分配后增长。

一直向操作系统请求少量内存是低效的,所以一个好的分配器会请求一个更大的块,然后在不涉及操作系统的情况下将其分配出去。

此外,内存是延迟分页的。大量未触及的分配不会对 RSS 产生影响。 (在这种特殊情况下,向量将确保内存已初始化,因此这不是问题,但如果您使用 .reserve(4096) 分配它可能会出现问题。

这意味着您将看到内存在连续多次分配+初始化时保持不变,然后突然上升。如果您继续分配更多数据,您可能会看到这种效果。

【讨论】:

  • 即便如此,RSS 也可能不会上涨那么多。 RSS 是被分页的内存,但分配内存并不总是分页,当一些内存在其他内存中获取页面时,可能会被分页。
  • 请注意,vector&lt;char&gt;(n) 分配并填充内存。
【解决方案2】:

堆已经分配了一些内存并包含在 RSS 中,所以你只是在使用它。

将分配大小从4 * 1024 增加到64 * 1024 并观察RSS 增长。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    相关资源
    最近更新 更多