A maneira mais fácil de ver o uso de memória do Linux quando um processo é morto

2

Eu tenho um servidor de compilação onde o dmesg está relatando que está tendo que matar processos porque está ficando sem memória. Como o sistema está executando muitas compilações e outros processos simultaneamente, eu preciso descobrir qual processo ou processos realmente estão usando muita memória. Ou seja, não estou convencido de que o processo que está sendo morto é aquele que monopoliza a memória.

Idealmente, gostaria de descarregar o uso de memória no ponto em que o killer de memória entra em ação, com uma linha de comando completa de cada processo. Existe uma maneira de fazer isso? Como alternativa, se eu não puder fazer o dump nesse ponto específico, planejo configurar um cron job para descartar o uso da memória a cada minuto ou dois, mas ainda preciso de ajuda para obter a saída correta.

A saída do smem é muito boa, mas trunca a linha de comando:

PID User     Command                         Swap      USS      PSS      RSS
39090 user   /usr/bin/Xvfb +extension RA     4732      144      148      264
20837 user   -bash                              0      780     1100     2144
21144 user   python /usr/bin/smem               0    12120    12320    13248
19224 user   /opt/atlassian/bamboo_home/        0   234940   235303   237144
12414 user   /usr/java/jdk1.8.0_121/bin/   176128  2249180  2249338  2250428

Existe uma maneira de dizer ao smem para mostrar a linha de comando completa? Alternativamente, uma maneira simples de canalizar a saída para me mostrar o que preciso? Eu posso canalizar em xargs e ps para obter a linha de comando completa assim:

smem -H -c "pid" | xargs ps

No entanto, eu perdi os valores de uso de memória do smem.

    
por Hedley 09.02.2018 / 13:32

3 respostas

1

Se você tiver o nome do processo, poderá encontrar algo como a resposta aqui bastante útil: Encontrando o tamanho médio do processo único do Apache para configurar MaxClients

Você pode substituir httpd no início desse comando pelo nome do processo e ele mostrará o uso total de memória para processos com esse nome na primeira linha e o uso médio de memória desses processos na segunda linha. Espero que isto ajude! :)

    
por 09.02.2018 / 16:26
1

Eu simulei um hogger de memória com este código:

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

int main(int argc, char** argv) {
    int max = -1;
    int mb = 0;
    char* buffer;

    if(argc > 1)
        max = atoi(argv[1]);

    while((buffer=malloc(1000*1024*1024)) != NULL && mb != max) {
        memset(buffer, 0, 1000*1024*1024);
        mb++;
        printf("Allocated %d MB\n", 1000*mb);
        sleep(1);
    }

    return 0;
}

Eu coloquei o código no arquivo munch.c e depois:

gcc -o munch munch.c
./munch # will run until SIGINT or killed by kernel

Eu abri dois outros consoles e coloquei isso neles:

# 1st console
dmesg -w
# 2nd console
sudo tail -f /var/log/{kern.log,syslog}

No entanto, eu não vi nada uma vez, então munch process foi morto.

Então eu acho que você só precisa escrever um script para monitorar o consumo de memória. Este poderia ser um ponto de partida:

watch 'ps auxw | head -1 && ps auxw | sort -k6 -nr | head -5'

Você receberá uma lista atualizada de processos classificados pelo RSS . A opção w mostra nomes completos de comandos.

    
por 09.02.2018 / 16:31
0

você tentou usar top e usando c toggle para ver o nome do processo e a linha de comando?

link

    
por 09.02.2018 / 16:32