Измерение совокупного пикового использования памяти несколькими параллельными процессами

Не знаю, как ваши ожидаемые результаты соотносятся с вашими входными данными. Я бы предложил:

$ perl -MPOSIX -MDate::Parse -pe 's{[^,]*}{
   strftime("%Y%m%d%H%M%S", localtime str2time($&))}e' 

Чтобы использовать способность GNU dateанализировать эти даты и избежать выполнения одного dateвызова в строке, вы можете (использовать оболочку с поддержкой процесса в стиле ksh --замены (как ksh, bash или zsh)):

paste -d, <(

Обратите внимание, однако, что это дает:

20181129151500,alert_logevent
20181129151500,alert_webhook
20181129151500,appsbrowser
20171020000000,ClearPassOnSplunk_2
20171010000000,Dnslookup
20171012000000,domainCategories

Хотя это то, о чем вы спрашивали, маловероятно, что это то, что вам нужно, поскольку эти Nov 29 15:15кажутся скорее отметками времени из 2017 (прошлого года ), чем из будущего.

Похоже, что эти даты соответствуют ls -lв локали POSIX. Таким образом, вы можете адаптировать эту функцию из другого Q&A , чтобы преобразовать ее в более полезный формат. Или лучше использовать лучший способ, чем ls -l, для хранения дат файлов в файле в первую очередь (, например GNU find -printf, или GNU date -r, или zsh stat, или GNU/BSD stat, или ast ls --format... ), где вы можете использовать более полезный, точный и недвусмысленный формат.

3
26.04.2020, 01:21
1 ответ

Вас интересует сумма пикового использования памяти каждым процессом или пиковая сумма использования памяти процессами?

Например, чтобы получить данные о пиковом использовании резидентной памяти для пяти крупнейших трат в вашей системе, вы можете сделать что-то вроде этого:

$ printf "PID\tPeak RSS usage (kB)\n"; grep VmHWM: /proc/*/status | sort -rnk2 | head -n 5 | perl -npe 's#^/proc/(\d+)/\S+\s+(\d+) kB$#$1\t$2#'
PID Peak RSS usage (kB)
19799   8515140
28243   930620
1357    911612
19833   766020
17926   734952

Это список 5 процессов, которые больше всего использовали оперативную память в своей истории процессов. Однако довольно часто эти процессы достигают пика не в один и тот же момент, поэтому пик суммы этих процессов, вероятно, намного ниже суммы пиков всех процессов.

Единственный надежный способ вычислить пиковую сумму использования памяти процесса для нескольких процессов — запустить этот набор процессов в отдельной памяти cgroup. Теоретически вы просто запускаете программу с systemd-run --pipe --user --pty...и затем отслеживаете пиковое использование этой памяти cgroup. Однако, по моему опыту, systemd-runнеправильно реализует временные группы пользовательского режима, поэтому вам придется создать отдельный системный уровень cgroup, содержащий группу, которую вы хотите измерить, а затем запустить дерево процессов в этой группе.Если вы запустите достаточно свежий дистрибутив с более новым systemd-run, чем я пробовал, он может работать без каких-либо взломов. Подробности см. в https://stackoverflow.com/a/61916151/334451. Вы можете проверить результаты через крепление памяти cgroup, которое обычно монтируется где-то ниже /sys/fs/cgroup. Возможные местоположения включают подкаталоги memoryили unified. Попробуйте mount | grep cgroupдля получения подробной информации. Ваш результат может быть memory.max_usage_in_bytes, но я думаю, что это зафиксированное использование, а не фактическое использование резидентной ОЗУ -, вы не указали, какой из них вы ищете. См. memory.statв памяти cgroupдля дополнительной статистики.

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

0
04.09.2021, 11:06

Теги

Похожие вопросы