Это поведение доступно для редактирования, как отвечено здесь, но остановитесь и думайте о том, что продолжается в течение секунды. Когда Вы находитесь в режиме вставки, Вы не на самом деле по символу, но МЕЖДУ ними. Когда Вы вставляете что-то, переходы курсора в конец того, что Вы вставили так, чтобы следующая вставленная вещь была после этого. Теперь думайте о том, если Вы просто ввели букву, затем хотели сделать что-то к ней. Esc удара поместил бы избранный курсор непосредственно по последнему знаку, который Вы вставили. Если бы это не сделало этого, то это на самом деле было бы довольно неловким.
Ситуация, о которой Вы, вероятно, думаете, состоит в том, когда Вы находитесь в режиме вставки, перемещающемся, как будто Вы были нормальным режимом и затем переключаетесь. В этом случае курсор, действительно кажется, возвращается один символ, но если Вы думаете, что способ, которым он показывает, что Вы были в режиме вставки и последней вещи, которую Вы сделали, НЕ была вставка. Возможно, необходимо ли провести больше времени в нормальном режиме?
Я записал сценарий, чтобы сделать точно это. Это в основном образцы ps
в определенных интервалах, для создания профиля конкретного процесса. Процесс может быть запущен самим контрольным инструментом, или это может быть независимый процесс (указанный изодромным с предварением или шаблоном "команда").
Иногда, когда потребность возникает, я просто делаю:
$ top -d 1 -b |grep <process> >>somefile
Это не изящное решение, но сделало задание, если Вы хотите, чтобы быстрое сырое значение проверило Вашу гипотезу.
grep --line-buffered <process> >>somefile
вынудить grep произвести каждую строку без буферизации
– Ott Toomet
08.10.2017, 00:04
sar
(Системный Генератор отчетов Действия) от sysstat пакета Ваш друг в случае, если как они.
Иначе контролировал бы объединенный с историческими данными, например, Munin, pnp4nagios, rrdtools...
sar
быть сфокусированными всего на одном процессе? главным образом это, кажется, контролирует систему в целом
– xenoterracide
13.01.2011, 17:38
pidstat
команда также от sysstat пакета обеспечивает довольно хороший интерфейс для создания отчетов о статистике по единственному процессу.
– Steven D
14.01.2011, 00:21
Вы могли попробовать Valgrind.
Valgrind является платформой инструментария для создания инструментов динамического анализа. Существуют инструменты Valgrind, которые могут автоматически обнаружить многих управление памятью и ошибки многопоточного выполнения, и представлять Ваши программы подробно. Можно также использовать Valgrind для создания новых инструментов.
Распределение Valgrind в настоящее время включает шесть инструментов производственного качества: детектор ошибки памяти, два детектора ошибок потока, кэш и профилировщик предсказания ветвлений, генерирующийся кэш графа вызовов и профилировщик предсказания ветвлений и профилировщик "кучи".
Мне нравится простой ответ Шридхара, но я бросил свой собственный, прежде чем попробовал его:
#! /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}]
Для меня было важно иметь структурированный вывод, чтобы мне было легче использовать его для анализа.
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
Если вы используете ядро 4.14+, вы можете получить более продвинутые показатели использования памяти Linux, такие как пропорциональный размер набора (PSS ), размер уникального набора (USS ),использование пропорционального свопа и другие (см. документацию о том, что вы можете получить от/proc/{pid}/smaps_rollup
):
procpath record -d tgt.sqlite -p $PID -f stat,cmdline,smaps_rollup