Распределение памяти против RSS в Linux - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь контролировать RSS (Resident Set Size) программно в Linux (путем разбора /proc/self/stat), но кажется, что RSS не увеличивается при выделении памяти.

Например, рассмотрим следующееПрограмма, которая выделяет 10 4 КБ буферов и печатает 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 на единицу после каждого выделения (страница занимает 4 КБ)?

Спасибо

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Нет, ожидается, что RSS не будет расти после каждого отдельного выделения.

Неэффективно продолжать запрашивать у ОС небольшие объемы памяти, поэтому хороший распределитель будет запрашивать больший кусок, а затем разбирать егобез участия ОС.

Кроме того, память распределяется лениво. Большое, нетронутое размещение не будет способствовать RSS. (В этом конкретном случае вектор будет обеспечивать инициализацию памяти, поэтому здесь это не проблема, но это могло бы произойти, если бы вы выделили ее вместо .reserve(4096)).

Это означает, чтовместо этого вы увидите, что память останется неизменной для нескольких выделений + инициализации подряд, а затем внезапно увеличится. Если вы продолжите выделять больше данных, вы, вероятно, увидите этот эффект.

0 голосов
/ 04 ноября 2019

Кучи уже выделена некоторая память и включена в RSS, поэтому вы просто используете ее.

Увеличьте размер выделения с 4 * 1024, скажем, до 64 * 1024 и наблюдайте рост RSS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...