Назад | Перейти на главную страницу

Самый простой способ увидеть использование памяти Linux, когда процесс убит

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

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

Результат от smem довольно хороший, но он усекает командную строку:

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

Есть ли способ указать смему показывать полную командную строку? В качестве альтернативы простой способ передать вывод, чтобы показать мне, что мне нужно? Я могу использовать xargs и ps, чтобы получить полную командную строку следующим образом:

smem -H -c "pid" | xargs ps

Однако затем я потерял значения использования памяти из smem.

Я смоделировал работу с памятью с помощью этого кода:

#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;
}

Я поместил код в munch.c файл, а затем:

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

Я открыл две другие консоли и запустил в них это:

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

Однако тогда я ничего не заметил munch процесс был убит.

Думаю, вам просто нужно написать скрипт для отслеживания потребления памяти. Это может быть отправной точкой:

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

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

Если у вас есть имя процесса, вы можете найти здесь что-то вроде ответа: Определение среднего размера одного процесса Apache для настройки MaxClients

Вы можете заменить httpd в начале этой команды с вашим именем процесса, и он покажет вам общее использование памяти для процессов с этим именем в первой строке и среднее использование памяти этими процессами во второй строке. Надеюсь это поможет! :)

Вы пробовали использовать top и использовать переключатель c, чтобы вы могли видеть имя процесса и командную строку?

https://en.wikipedia.org/wiki/Top_(software)