2016-03-05 6 views
2

я пытаюсь измерить объем памяти, используемый в дочернем процессе с помощью системы getrusage вызова с помощью следующего кодаgetrusage не работает, как я ожидал бы

#include <iostream> 
using std::cout; 
using std::endl; 
#include <unistd.h> 
#include <thread> 
#include <chrono> 
#include <sys/wait.h> 
#include <sys/time.h> 
#include <sys/resource.h> 
#include <cassert> 
#include <vector> 

int main() { 

    auto child_pid = fork(); 
    if (!child_pid) { 
     cout << "In child process with process id " << getpid() << endl; 
     cout << "Child's parent process is " << getppid() << endl; 
     std::this_thread::sleep_for(std::chrono::seconds(2)); 

     std::vector<int> vec; 
     vec.resize(10000); 
     for (auto ele : vec) { 
      cout << ele << endl; 
     } 

    } else { 
     // this will wait for the child above to finish 
     waitpid(child_pid, nullptr, 0); 
     struct rusage usage; 
     int return_val_getrusage = getrusage(RUSAGE_CHILDREN, &usage); 
     assert(!return_val_getrusage); 
     cout << "Memory used by child " << usage.ru_maxrss << endl; 
    } 

    return 0; 
} 

я храню изменение объема памяти я распределение путем ввода различных аргументов в вызов vector::resize(). Однако это всегда печатает значение около 2300 для использования памяти дочерним. Я не уверен, что это правильный способ измерения использования памяти для дочернего процесса. Даже если я добавляю вызовы к getrusage с RUSAGE_SELF в дочернем процессе до выделения вектора, значение ru_maxrss остается неизменным. Может ли кто-нибудь сказать мне, что я могу сделать лучше здесь?

+0

Попробуйте добавить рандомер к размеру вектора, и он может измениться. В противном случае размер дочернего процесса и его кучи будут одинаковыми все время. –

+0

@JoachimPileborg Извините, что я совсем не понимаю. Я меняю аргумент на 'vector :: resize()' каждый раз, когда я запускаю программу, и вывод все тот же ... – Curious

+0

Тогда, может быть, куча не учитывается? Вместо этого попробуйте создать глобальную переменную массива, чтобы увеличить размер сегмента данных. Или как насчет выполнения разных программ? –

ответ

2

Внутреннее управление кучей и freestore определяется реализацией и зависит от базовой операционной системы.

Обычно по соображениям производительности не каждое распределение приведет к большему количеству пространства, запрашиваемого у os: стандартная библиотека объединит некоторую память процесса и расширит пул только в том случае, если не будет обнаружен блок достаточного размера.

Поэтому я предполагаю, что размеры варки, которые вы пробовали, все еще находятся в пределах нескольких МБ, выделенных при запуске. Вы должны попробовать действительно большие ассигнования, чтобы найти разницу.

+0

Спасибо за ваш ответ! Это имеет смысл. Однако у меня есть еще один вопрос: «Чтобы правильно измерить использование памяти, мне понадобилось некоторое время, чтобы разобраться. Было довольно сложно наткнуться на правильную страницу руководства даже после тщательного изучения таких вопросов, как это происходит при переполнении стека. Как нужно разобраться с ответами на системные проблемы, подобные этому вообще? – Curious

+0

Кто-то, более опытный, чем я, вероятно, будет знать лучше! – Curious

+0

Я бы измерил использование только для текущего процесса. Использование 'getrusage()' совершенно справедливо, если вы хотите увидеть распределение памяти с точки зрения ОС (так называемая память, выделенная для процесса или доступной памяти). Если вы хотите, однако, иметь мелкозернистый анализ памяти, используемой вашим кодом, вам нужно будет использовать некоторые инструменты/библиотеки для отладки памяти (например: [Valgrind] (http: //www.cprogramming.com/debugging/valgrind.html), MemTrack или [другие] (http://stackoverflow.com/questions/438515/how-to-track-memory-allocations-in-c-especially-new-delete) – Christophe

Смежные вопросы