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

Это поведение доступно для редактирования, как отвечено здесь, но остановитесь и думайте о том, что продолжается в течение секунды. Когда Вы находитесь в режиме вставки, Вы не на самом деле по символу, но МЕЖДУ ними. Когда Вы вставляете что-то, переходы курсора в конец того, что Вы вставили так, чтобы следующая вставленная вещь была после этого. Теперь думайте о том, если Вы просто ввели букву, затем хотели сделать что-то к ней. Esc удара поместил бы избранный курсор непосредственно по последнему знаку, который Вы вставили. Если бы это не сделало этого, то это на самом деле было бы довольно неловким.

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

18
06.09.2011, 18:39
7 ответов

Я записал сценарий, чтобы сделать точно это. Это в основном образцы ps в определенных интервалах, для создания профиля конкретного процесса. Процесс может быть запущен самим контрольным инструментом, или это может быть независимый процесс (указанный изодромным с предварением или шаблоном "команда").

8
27.01.2020, 19:46

Иногда, когда потребность возникает, я просто делаю:

$ top -d 1 -b |grep <process> >>somefile

Это не изящное решение, но сделало задание, если Вы хотите, чтобы быстрое сырое значение проверило Вашу гипотезу.

12
27.01.2020, 19:46
  • 1
    я думаю, что это изящно в, он - простота. Можно хотеть сделать grep --line-buffered <process> >>somefile вынудить grep произвести каждую строку без буферизации –  Ott Toomet 08.10.2017, 00:04

sar (Системный Генератор отчетов Действия) от sysstat пакета Ваш друг в случае, если как они.

Иначе контролировал бы объединенный с историческими данными, например, Munin, pnp4nagios, rrdtools...

7
27.01.2020, 19:46
  • 1
    , но может sar быть сфокусированными всего на одном процессе? главным образом это, кажется, контролирует систему в целом –  xenoterracide 13.01.2011, 17:38
  • 2
    pidstat команда также от sysstat пакета обеспечивает довольно хороший интерфейс для создания отчетов о статистике по единственному процессу. –  Steven D 14.01.2011, 00:21
  • 3
    @xenoterracide Steven D имел ответ. Я не знал об этой команде прежде. –  Christian 14.01.2011, 09:10

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

4
27.01.2020, 19:46

Вы могли попробовать Valgrind.

Valgrind является платформой инструментария для создания инструментов динамического анализа. Существуют инструменты Valgrind, которые могут автоматически обнаружить многих управление памятью и ошибки многопоточного выполнения, и представлять Ваши программы подробно. Можно также использовать Valgrind для создания новых инструментов.

Распределение Valgrind в настоящее время включает шесть инструментов производственного качества: детектор ошибки памяти, два детектора ошибок потока, кэш и профилировщик предсказания ветвлений, генерирующийся кэш графа вызовов и профилировщик предсказания ветвлений и профилировщик "кучи".

3
27.01.2020, 19:46

Мне нравится простой ответ Шридхара, но я бросил свой собственный, прежде чем попробовал его:

#! /usr/bin/python3

import json, psutil, datetime, sys, time

while True:
  print(json.dumps((datetime.datetime.now().isoformat(),
                    psutil.Process(int(sys.argv[1])).memory_info()._asdict())))
  time.sleep(1)

В основном это полезно, только если вам нужен структурированный вывод. Примечание:_asdict()не работало в некоторых версиях Python 3.5; он снова работает в Python 3.6.9, хотя (, а также в Python 2.7.17 ).

Вывод выглядит как:

["2019-03-19T11:21:53.784670", {"rss": 220389376, "vms": 538984448, "shared": 15724544, "text": 303104, "lib": 0, "data": 221364224, "dirty": 0}]
["2019-03-19T11:21:54.786136", {"rss": 220438528, "vms": 539119616, "shared": 15724544, "text": 303104, "lib": 0, "data": 221499392, "dirty": 0}]
["2019-03-19T11:21:55.787555", {"rss": 220495872, "vms": 539119616, "shared": 15724544, "text": 303104, "lib": 0, "data": 221499392, "dirty": 0}]
["2019-03-19T11:21:56.788754", {"rss": 220528640, "vms": 539119616, "shared": 15724544, "text": 303104, "lib": 0, "data": 221499392, "dirty": 0}]

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

1
27.01.2020, 19:46

I want to monitor memory usage of a process, and I want this data to be logged. Does such a tool exist?

Да, именно этого можно добиться, немного больше с Procpath(автор здесь ).

В простейшем случае вы указываете ему интересующий PID и позволяете ему записывать свои метрики Procfs, включая размер резидентного набора (RSS ). По умолчанию он делает запись каждые 10 секунд (для целевого процесса, его предков и потомков ).

$ procpath record -d tgt.sqlite -p $PID

Когда вы решите, что он записал достаточно точек данных, Ctrl+Cон и это даст вам записи.

$ sqlite3 tgt.sqlite "SELECT ts, stat_rss * 4 rss_kib FROM record WHERE stat_pid = $PID"
1635349330.11141|478460
1635349340.12125|476068
1635349350.13124|480232
1635349360.14117|483416
...

Использование графического пользовательского интерфейса SQLite может быть более удобным для изучения и запроса базы данных (, например.apt install sqlitebrowser).

Procpath также может визуализировать RSS целевого процесса в SVG из коробки, как это:

$ procpath plot -d tgt.sqlite -f tgt.svg -q rss -p $PID

resident set size plot

Если вы используете ядро ​​​​4.14+, вы можете получить более продвинутые показатели использования памяти Linux, такие как пропорциональный размер набора (PSS ), размер уникального набора (USS ),использование пропорционального свопа и другие (см. документацию о том, что вы можете получить от/proc/{pid}/smaps_rollup):

procpath record -d tgt.sqlite -p $PID -f stat,cmdline,smaps_rollup
1
27.10.2021, 16:22

Теги

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