Limitar e medir VSS / RSS

3

Estou escrevendo um programa no Ubuntu 16.04, e fork , algumas configurações e exec outro programa. Eu preciso:

  1. Limite o VSS máximo que o programa poderia usar
  2. Limite o máximo de RSS que o programa pode usar
  3. Meça o VSS máximo que o programa usou durante sua execução
  4. Meça o máximo de RSS que o programa usou durante sua execução

Até agora, posso fazer 1. e 4. da seguinte forma:

pid_t chpid = fork();
if (!chpid) {
    // I do lots of setup here
    struct rlimit rlim;
    rlim.rlim_cur = rlim.rlim_max = limit_VSS;
    setrlimit(RLIMIT_AS, &rlim); // 1.
    execv(path, args);
}
struct rusage stats;
wait3(NULL, 0, &stats);
long max_RSS = stats.ru_maxrss;  // 4.

Como posso implementar o 2. e o 3.?

A opção RLIMIT_RSS em setrlimit parece não ser útil e não sei como obter VmPeak em /proc/pid/status depois que o processo é finalizado (ou logo antes do processo terminar).

Eu preciso de uma maneira eficiente, ou seja, não tendo um impacto significativo no programa exec . (Existem ptrace e algumas ferramentas como valgrind , mas isso irá atrasar muito a execução.)

    
por Colera Su 25.12.2017 / 12:45

1 resposta

0

Eu não sei sobre separar o VSS do uso de RSS, mas você pode olhar para o uso de pools de memória ou usar um substituto de malloc que monitora e / ou aplica a alocação máxima do sistema.

Dê uma olhada no pacote de contabilidade do processo taskstats. Ele não grava o uso final da memória, mas grava a marca d'água alta do uso de RSS e do uso da VM, que pode ser o que você quer mesmo assim? Não tenho certeza se está disponível como padrão nos kernels 16.04 do Ubuntu - você pode precisar construir um módulo do kernel para obtê-lo.

    
por 31.12.2017 / 02:35

Tags