Однажды у меня была задача определить следующие параметры производительности внутри работающего приложения:
- Общая доступная виртуальная память
- Виртуальная память в настоящее время используется
- Виртуальная память, используемая в настоящее время моим процессом
- Всего доступной оперативной памяти
- RAM в настоящее время используется
- RAM в настоящее время используется моим процессом
- % CPU в настоящее время используется
- % CPU в настоящее время используется моим процессом
Код должен был работать на Windows и Linux. Несмотря на то, что это кажется стандартной задачей, поиск необходимой информации в руководствах (WIN32 API, GNU docs), а также в Интернете занял у меня несколько дней, потому что существует слишком много неполной / неправильной / устаревшей информации по этой теме. узнал там.
Чтобы уберечь других от подобных неприятностей, я подумал, что было бы неплохо собрать всю разбросанную информацию, а также то, что я нашел методом проб и ошибок здесь, в одном месте.
Ответы:
Windows
Некоторые из приведенных выше значений легко доступны из соответствующего API-интерфейса WIN32, я просто перечислю их здесь для полноты. Другие, однако, должны быть получены из библиотеки Performance Data Helper (PDH), которая немного «не интуитивна» и требует много трудных проб и ошибок, чтобы приступить к работе. (По крайней мере, это заняло у меня довольно много времени, возможно, я был немного глупым ...)
Примечание: для ясности вся проверка ошибок была исключена из следующего кода. Проверьте коды возврата ...!
Общая виртуальная память:
Примечание. Название «TotalPageFile» вводит в заблуждение. На самом деле этот параметр дает «Размер виртуальной памяти», который представляет собой размер файла подкачки плюс установленное ОЗУ.
Виртуальная память в настоящее время используется:
Тот же код, что и в «Всего виртуальной памяти», а затем
Виртуальная память, используемая в настоящее время текущим процессом:
Общая физическая память (ОЗУ):
Тот же код, что и в «Всего виртуальной памяти», а затем
Физическая память, используемая в настоящее время:
Физическая память, используемая в настоящее время текущим процессом:
Тот же код, что и в «Виртуальной памяти, используемой текущим процессом», а затем
Процессор, используемый в настоящее время:
Процессор, используемый в настоящее время текущим процессом:
Linux
В Linux выбор, который на первый взгляд казался очевидным, заключался в использовании таких API-интерфейсов POSIX, как
getrusage()
и т. Д. Я потратил некоторое время, пытаясь заставить это работать, но никогда не получал значимых значений. Когда я наконец проверил исходные коды ядра, я обнаружил, что эти API еще не полностью реализованы в ядре Linux 2.6 !?В конце концов я получил все значения через комбинацию чтения псевдофайловой системы
/proc
и вызовов ядра.Общая виртуальная память:
Виртуальная память в настоящее время используется:
Тот же код, что и в «Всего виртуальной памяти», а затем
Виртуальная память, используемая в настоящее время текущим процессом:
Общая физическая память (ОЗУ):
Тот же код, что и в «Всего виртуальной памяти», а затем
Физическая память, используемая в настоящее время:
Тот же код, что и в «Всего виртуальной памяти», а затем
Физическая память, используемая в настоящее время текущим процессом:
Измените getValue () в «Виртуальной памяти, используемой текущим процессом» следующим образом:
Процессор, используемый в настоящее время:
Процессор, используемый в настоящее время текущим процессом:
TODO: другие платформы
Я бы предположил, что часть кода Linux также работает для Unixes, за исключением частей, которые читают псевдофайловую систему / proc. Возможно, на Unix эти части можно заменить
getrusage()
и аналогичными функциями? Если кто-то с ноу-хау Unix может отредактировать этот ответ и заполнить детали ?!источник
PROCESS_MEMORY_COUNTERS
, как вы выбираете «Виртуальную память, используемую текущим процессом»?PrivateUsage
не является членомPROCESS_MEMORY_COUNTERS
ошибки компилятора я получаю!"quotes like these"
для включения системных заголовков?GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
наGetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
Mac OS X
Я надеялся найти подобную информацию и для Mac OS X. Так как его здесь не было, я вышел и сам откопал его. Вот некоторые из вещей, которые я нашел. Если у кого-то есть какие-либо другие предложения, я бы хотел их услышать.
Общая виртуальная память
Это сложно на Mac OS X, потому что он не использует предустановленный раздел подкачки или файл, такой как Linux. Вот запись из документации Apple:
Итак, если вы хотите узнать, сколько виртуальной памяти еще доступно, вам нужно получить размер корневого раздела. Вы можете сделать это так:
Всего виртуальных в настоящее время используется
Вызов systcl с ключом «vm.swapusage» предоставляет интересную информацию об использовании подкачки:
Не то чтобы общее использование свопа, отображаемое здесь, может измениться, если потребуется больше свопа, как описано в разделе выше. Таким образом, общая сумма на самом деле является текущей общей суммой свопа. В C ++ эти данные могут быть запрошены следующим образом:
Обратите внимание, что «xsw_usage», объявленный в sysctl.h, кажется не документированным, и я подозреваю, что существует более переносимый способ доступа к этим значениям.
Виртуальная память, используемая в настоящее время моим процессом
Вы можете получить статистику о вашем текущем процессе, используя
task_info
функцию. Это включает в себя текущий размер резидента вашего процесса и текущий виртуальный размер.Всего доступной оперативной памяти
Объем физической оперативной памяти, доступной в вашей системе, доступен с помощью
sysctl
системной функции, подобной этой:RAM в настоящее время используется
Вы можете получить общую статистику памяти из
host_statistics
системной функции.Здесь следует отметить, что в Mac OS X существует пять типов страниц памяти:
Хорошо отметить, что только потому, что Mac OS X может показывать очень мало фактической свободной памяти время от времени, это может не быть хорошим показателем того, сколько готово использовать в короткие сроки.
RAM в настоящее время используется моим процессом
См. «Виртуальная память, используемая в настоящее время моим процессом» выше. Применяется тот же код.
источник
Linux
В Linux эта информация доступна в файловой системе / proc. Я не большой поклонник используемого формата текстовых файлов, так как каждый дистрибутив Linux, кажется, настраивает хотя бы один важный файл. Беглый взгляд как источник 'ps' показывает беспорядок.
Но вот где найти информацию, которую вы ищете:
/ proc / meminfo содержит большую часть всей информации, которую вы ищете. Вот как это выглядит в моей системе; Я думаю, что вы заинтересованы в MemTotal , MemFree , SwapTotal и SwapFree :
Для загрузки процессора вам нужно проделать небольшую работу. Linux делает доступным общее использование процессора с момента запуска системы; это, вероятно, не то, что вас интересует. Если вы хотите узнать, какова была загрузка ЦП в течение последней секунды или 10 секунд, то вам нужно запросить информацию и рассчитать ее самостоятельно.
Информация доступна в / proc / stat , который довольно хорошо документирован на http://www.linuxhowtos.org/System/procstat.htm ; вот как это выглядит на моей 4-х ядерной коробке:
Во-первых, вам необходимо определить, сколько процессоров (или процессоров, или процессорных ядер) доступно в системе. Для этого подсчитайте количество записей «cpuN», где N начинается с 0 и увеличивается. Не считайте строку 'CPU', которая является комбинацией линий CPU. В моем примере вы можете увидеть cpu0 - cpu3, всего 4 процессора. Отныне вы можете игнорировать cpu0..cpu3 и фокусироваться только на строке 'cpu'.
Далее вам нужно знать, что четвертое число в этих строках является мерой времени простоя, и, таким образом, четвертое число в строке 'cpu' - это общее время простоя для всех процессоров с момента загрузки. Это время измеряется в Linux "jiffies", которые составляют 1/100 секунды каждый.
Но вас не волнует общее время простоя; Вы заботитесь о времени простоя в данный период, например, в последнюю секунду. Подсчитайте, что вам нужно прочитать этот файл дважды, с интервалом в 1 секунду. Затем вы можете сделать разность четвертого значения строки. Например, если вы берете образец и получаете:
Затем через секунду вы получите этот образец:
Вычтите два числа, и вы получите разность 396, что означает, что ваш процессор простаивал 3,96 секунды из последних 1,00 секунды. Хитрость, конечно, заключается в том, что вам нужно разделить на количество процессоров. 3,96 / 4 = 0,99, и ваш процент простоя; 99% простаивают и 1% заняты.
В моем коде у меня есть кольцевой буфер на 360 записей, и я читаю этот файл каждую секунду. Это позволяет мне быстро рассчитать загрузку процессора за 1 секунду, 10 секунд и т. Д. Вплоть до 1 часа.
Информацию о конкретном процессе вы можете найти в / proc / pid ; если вам все равно, ваш pid, вы можете посмотреть в / proc / self.
Процессор, используемый вашим процессом, доступен в / proc / self / stat . Это странно выглядящий файл, состоящий из одной строки; например:
Важными данными здесь являются 13-й и 14-й токены (0 и 770 здесь). 13-й токен - это количество jiffies, которые процесс выполнил в пользовательском режиме, а 14-й - количество jiffies, которые процесс выполнил в режиме ядра. Добавьте их вместе, и вы получите полную загрузку процессора.
Опять же, вам придется периодически выбирать этот файл и вычислять разницу, чтобы определить загрузку ЦП процесса с течением времени.
Редактировать: помните, что при расчете загрузки ЦП вашего процесса вы должны учитывать 1) количество потоков в вашем процессе и 2) количество процессоров в системе. Например, если ваш однопоточный процесс использует только 25% ЦП, это может быть хорошо или плохо. Хороший в однопроцессорной системе, но плохой в 4-процессорной; это означает, что ваш процесс работает постоянно и использует 100% доступных ему циклов ЦП.
Для получения информации о памяти, относящейся к процессу, вы должны посмотреть на / proc / self / status, который выглядит следующим образом:
Записи, начинающиеся с 'Vm', являются интересными:
Единственный пункт, в котором я не уверен - это Swapspace, который в настоящее время используется моим процессом . Я не знаю, доступно ли это.
источник
В Windows вы можете получить использование процессора по коду ниже:
источник
usage =
- это самая креативная вещь, которую я когда-либо видел, совсем не читаемая, но креативнаяULONGLONG
для VS вместоULARGE_INTEGER
. 2) Вы усложняете вещи, звоняCopyMemory()
, просто делайтеULONGLONG ul_sys_idle = *(ULONGLONG*)&ft_sys_idle;
вместо этого. Он будет переведен в одну инструкцию процессораmov
(илиlea
).Linux
Портативный способ чтения памяти и загрузки номеров - это
sysinfo
вызовПрименение
ОПИСАНИЕ
источник
QNX
Поскольку это похоже на «вики-страницу кода», я хочу добавить код из базы знаний QNX (примечание: это не моя работа, но я проверил ее и она отлично работает в моей системе):
Как получить загрузку процессора в%: http://www.qnx.com/support/knowledgebase.html?id=50130000000P9b5
Как получить бесплатную (!) Память: http://www.qnx.com/support/knowledgebase.html?id=50130000000mlbx
источник
Mac OS X - процессор
Общее использование процессора:
С Получить информацию о системе на MacOS X? :
источник
Для Linux Вы также можете использовать / proc / self / statm, чтобы получить одну строку чисел, содержащую ключевую информацию о памяти процесса, которая быстрее обрабатывается, чем просматривает длинный список сообщаемой информации, которую вы получаете из proc / self / status
См. Http://man7.org/linux/man-pages/man5/proc.5.html.
источник
Я использовал следующий код в своем проекте C ++, и он работал нормально:
источник