Unix, чтобы указать, сколько оперативной памяти было использовано во время выполнения программы?

Скажем, я запускаю скрипт (например, на Python). Чтобы узнать, сколько времени займет программа, можно было бы запустить

time python script1.py 

Есть ли команда, которая отслеживает, сколько оперативной памяти использовалось при запуске скрипта? Чтобы узнать, сколько оперативной памяти доступно, можно использовать free , но эта команда не соответствует задаче выше.

  • Имеет ли segfaults плохую память
  • Нужно ли мне пространство подкачки, если у меня более чем достаточное количество оперативной памяти?
  • Что такое «автоматическое расширение стека»?
  • Как OSX обрабатывает условия отсутствия памяти?
  • Что использует всю память в моей виртуальной машине? Это не кэш диска
  • когда вы спящий спящий режим, столбец VIRT верхней команды показывает пространство подкачки, используемое процессом?
  • Что делают поля «buff / cache» и «avail mem» в верхней части?
  • Как ядро ​​Linux знает, когда использовать буфер / кеш памяти?
  • 3 Solutions collect form web for “Unix, чтобы указать, сколько оперативной памяти было использовано во время выполнения программы?”

    Команда time (1) (возможно, вам потребуется ее установить – возможно, в качестве time пакета – она ​​должна быть в /usr/bin/time ) принимает множество аргументов, включая строку формата (с -f или --format ), которая понимает (среди прочих)

      %M Maximum resident set size of the process during its lifetime, in Kbytes. %K Average total (data+stack+text) memory use of the process, in Kbytes. 

    Не путайте команду /usr/bin/time со встроенным time bash . Вам может потребоваться ввести полный путь к файлу /usr/bin/time (попросить вашу оболочку выполнить команду не встроенную) или ввести command time или \time (спасибо Toby Speight & Arrow для их комментариев).

    Таким образом, вы можете попробовать (RSS – резидентный размер набора )

     /usr/bin/time -f "mem=%K RSS=%M elapsed=%E cpu.sys=%S .user=%U" python script1.py 

    Вы также можете попробовать

     /usr/bin/time --verbose python script1.py 

    Вы спрашиваете:

    сколько оперативной памяти использовалось при запуске скрипта?

    и это показывает неправильное представление с вашей стороны. Приложения, работающие в Linux (или любой современной многопроцессорной операционной системе), используют виртуальную память , и каждый процесс (включая процесс python выполняющий ваш скрипт) имеет свое виртуальное адресное пространство . Процесс не запускается непосредственно в физической ОЗУ, но имеет собственное виртуальное адресное пространство (и работает в нем), а ядро ​​реализует виртуальную память сложным запросом пейджинга, используя ленивые методы копирования на запись и настраивает MMU . ОЗУ – это физическое устройство и используемый ресурс – и управляемый внутренним ядром – для реализации виртуальной памяти (читайте также о кеше страницы и об обмолоте ).

    Вы можете потратить несколько дней на понимание операционной системы . Я рекомендую читать операционные системы: Three Easy Pieces, которая является свободно загружаемой книгой. ОЗУ используется всей операционной системой (не напрямую – отдельными процессами), а фактические страницы в ОЗУ для данного процесса могут меняться в течение времени (и могут быть как-то разделены с другими процессами). Следовательно, потребление ОЗУ данного процесса не очень четко определено, поскольку оно постоянно изменяется (вы можете захотеть его среднего или максимального значения и т. Д.), А также для размера его виртуального адресного пространства.

    Вы также можете использовать (особенно если ваш скрипт работает в течение нескольких секунд), утилиту top (1) (возможно, в каком-то другом терминале) или ps (1) или pmap (1) – можно использовать watch (1), чтобы повторить этот ps или pmap . Вы можете даже использовать direct /proc/ (см. Proc (5) …), возможно, как watch cat /proc/$(pidof python)/status или /proc/$(pidof python)/stat или /proc/$(pidof python)/maps т. д. …

    Но использование ОЗУ (ядром для некоторого процесса) во многом меняется во времени для данного процесса (и даже его виртуальное адресное пространство изменяется, например, путем вызова mmap (2) и munmap используемого ld-linux (8) , dlopen (3) , malloc (3) & free и многие другие функции, необходимые вашему интерпретатору Python …).

    Вы также можете использовать strace (1) для понимания системных вызовов, выполняемых Python для вашего скрипта (чтобы вы поняли, как он использует mmap и munmap и другие syscalls (2) ). Вы можете ограничить strace с помощью -e trace=%memory или -e trace=memory чтобы получить системные вызовы только с памятью (то есть с виртуальным адресным пространством).

    Кстати, функция tracemalloc Python также может быть полезна.

    Я предполагаю, что вам нужна только виртуальная память , а именно виртуальное адресное пространство (но не о ОЗУ), используемое интерпретатором Python для запуска вашего скрипта Python. И это меняется во время выполнения процесса. RSS (или максимальный максимальный размер виртуального адресного пространства) может быть более полезным для понимания.

    См. Также LinuxAteMyRAM .

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

     $ valgrind c-projects/objtest/bin/objtest ==6543== Memcheck, a memory error detector ==6543== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. ==6543== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info ==6543== Command: c-projects/objtest/bin/objtest ==6543== |ERROR|array:189: array_delete: delete index 0 but the highest is -1 (delete from empty array): index out of bounds ==6543== ==6543== HEAP SUMMARY: ==6543== in use at exit: 480 bytes in 20 blocks ==6543== total heap usage: 7,390 allocs, 7,370 frees, 256,217 bytes allocated ==6543== ==6543== LEAK SUMMARY: ==6543== definitely lost: 96 bytes in 4 blocks ==6543== indirectly lost: 384 bytes in 16 blocks ==6543== possibly lost: 0 bytes in 0 blocks ==6543== still reachable: 0 bytes in 0 blocks ==6543== suppressed: 0 bytes in 0 blocks ==6543== Rerun with --leak-check=full to see details of leaked memory ==6543== ==6543== For counts of detected and suppressed errors, rerun with: -v ==6543== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

    Если вы являетесь ms_print пользователем и хотите ms_print графы, вы можете использовать ms_print и команду:

     valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1 

    см. Использование памяти в пиковой памяти процесса linux / unix .

    Вы можете использовать команду pmap для просмотра объема памяти, используемой процессом. В вашем случае вам нужно указать PID скрипта в качестве ввода команды pmap, например

    pmap $(ps -ef | grep **<SCRIPT NAME>** | grep -v grep | awk '{print $2}')

    Linux и Unix - лучшая ОС в мире.