Medindo o pico de uso de memória de muitos processos

3

Eu tenho um script bash que chama vários outros scripts, um dos quais tem um monte de comandos que iniciam scripts dentro de uma sessão de tela como esta:

screen -S $SESSION_NAME -p $f -X stuff "$CMD\n"

A execução do meu script principal com / usr / bin / time -v captura o pico de uso da memória? Eu quero que este script seja executado como um cron job, mas eu preciso saber quanta memória será necessária antes que eu cause problemas para outros usuários na máquina.

Obrigado

    
por Matt Feldman 10.10.2016 / 19:33

1 resposta

3

Sim e não , o tempo GNU tenta mostrar o resumo / pico de tudo.

Você pode verificar isso usando um pequeno programa em C, digamos mal.c :

#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
    long bytes;
    void *buf;

    bytes = atol(argv[1]) * 1024;
    buf = malloc(bytes);
    memset(buf, 0, bytes);
    printf("");
    return 0;
}

E veja:

$ gcc mal.c -o mal
$ /usr/bin/time -f "%M" sh -c "./mal 5000"
5452
$ /usr/bin/time -f "%M" sh -c "./mal 10000"
10452
$ /usr/bin/time -f "%M" sh -c "./mal 5000; ./mal 10000"
10452

Mas como mencionado na página man do getrusage (2) (Linux), este é o máximo RSS de qualquer processo filho único, não o RSS cumulativo instantâneo de uma árvore de processos, todos usando simultaneamente memória

Em outras palavras, não resume processos paralelos ou em segundo plano, como você pode ver:

$ /usr/bin/time -f "%M" sh -c "./mal 1000000 & ./mal 5000"
5452

Isso também implica que você precisa executar time dentro de sua sessão de tela para medir $ CMD e não apenas a tela.

FYI a diferença entre o shell embutido é que o binário de tempo não pode resumir diretamente pipes ou funções:

$ time /bin/sleep 1 | /bin/sleep 2
 real 2.00
 user 0.00
 sys 0.00

$ /usr/bin/time -p  /bin/sleep 1 | /bin/sleep 2
 real 1.00
 user 0.00
 sys 0.00
    
por 10.10.2016 / 20:10