Динамический захват использования процессора и памяти
-
03-07-2019 - |
Вопрос
Я запускаю сценарий оболочки для выполнения приложения C++, которое измеряет производительность API.Я могу фиксировать задержку (время, необходимое для возврата значения для заданного набора параметров) API, но я также хочу фиксировать использование процессора и памяти одновременно с интервалами, скажем, 5-10 секунд.
Есть ли способ сделать это, не слишком сильно влияя на производительность системы, и при этом в рамках одного и того же сценария?я нашел много примеров, когда можно делать что-то вне (независимо) от запускаемого нами сценария;но не тот, где мы можем делать это в рамках одного и того же сценария.
Решение
Я бы предложил использовать 'время'команда, а также'vmstat' команда.Первый даст загрузку ЦП при выполнении исполняемого файла, а второй — периодическое (т.е.раз в секунду) дамп ЦП/памяти/IO системы.
Пример:
time dd if=/dev/zero bs=1K of=/dev/null count=1024000
1024000+0 records in
1024000+0 records out
1048576000 bytes (1.0 GB) copied, 0.738194 seconds, 1.4 GB/s
0.218u 0.519s 0:00.73 98.6% 0+0k 0+0io 0pf+0w <== that's time result
Другие советы
Если вы хотите динамически отслеживать использование ЦП и памяти для всего Linux-системы, вам также может помочь следующая команда:
Процессор
vmstat -n 15 10| awk '{now=strftime("%Y-%m-%d %T "); print now $0}'> CPUDataDump.csv &
vmstat
используется для сбора счетчиков ЦП
-n
значение задержки в данном случае равно 15, что означает, что статистика будет собираться каждые 15 секунд.
затем 10
— количество интервалов, в этом примере будет 10 итераций
awk '{now=strftime("%Y-%m-%d %T "); print now $0}'
это приведет к сбросу временной метки каждой итерации
в итоге файл дампа с &
для продолжения
Память
free -m -s 10 10 | awk '{now=strftime("%Y-%m-%d %T "); print now $0}'> DataDumpMemoryfile.csv &
free
предназначен для сбора статистики в памяти
-m
это для единиц памяти (вы можете использовать -b
для байтов, -k
для килобайт, -g
за гигабайты)
затем 10
— количество интервалов (в этом примере будет 10 итераций)
awk'{now=strftime("%Y-%m-%d %T "); print now $0}'
это приведет к сбросу временной метки каждой итерации
в конце концов помойка &
для продолжения