7

Я сравнивал использование памяти различными переносимыми браузерами, но этот вопрос является общим для всех программ, которые открываются в нескольких подпроцессах в диспетчере задач.

Смотрите скриншот из Sysinternals Process Explorer ниже:

Одна программа открывает несколько процессов

Например, Firefox просто открывается в одном процессе, а Google Chrome запускает несколько процессов для каждой вкладки.

Итак, как я могу получить общее использование оперативной памяти для всех процессов, открытых одной программой? (Вот для Google Chrome например.)

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

3 ответа3

12

Общий ответ: вы не можете, не точно.

Предполагая, что вы спрашиваете об ОЗУ (физической памяти), а не виртуальной - Windows публикует два соответствующих счетчика для каждого процесса: общий рабочий набор и частный (для процесса) рабочий набор. (PerfMon покажет вам это.) Диспетчер задач показывает "личное" и "общее" (если сложить их вместе, то получится общее). Process Explorer отображает их как "Рабочий набор" (общий), "WS Private", "WS Shareable" и "WS Shared". ProcExp немного "глубоко копает", чтобы найти два последних.

"Общие", или общая часть, являются причиной проблем.

Используя термины Process Explorer, "Совместное использование" показывает оперативную память, которая была выделена для процесса, но, по крайней мере, потенциально используется совместно с другими процессами. И "Shared" - это подмножество того, что на самом деле используется, по крайней мере, одним другим процессом.

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

Для набора процессов, работающих под управлением одного и того же .exe, как в Chrome: сложив все свои счетчики "WS Private", а затем добавив к этому итоговому значению самый большой из "общих ресурсов" любого экземпляра Chrome, вы получите минимум цифра ... но фактическая может быть больше.

В Chrome есть замечательная функция самоотчетов, упомянутая ge0rdi. Нужные счетчики - это те, которые находятся в разделе "Память". Chrome на моей машине не совсем соответствует тому, что сообщает ОС, но он достаточно близок для всех практических целей.

Еще одна вещь, которую следует учитывать, это то, что "использование памяти" любого процесса или подмножества процессов в ОС виртуальной памяти чрезвычайно зависит от поведения процесса и от нагрузки на ОЗУ. Запустите его в системе с большим или меньшим количеством ОЗУ, или с более или менее другим оборудованием, работающим и требующим ОЗУ, и цифры будут сильно отличаться. Таким образом, не существует фиксированного числа относительно того, сколько оперативной памяти "нужно" любому данному процессу. Так что даже «заметить доступную оперативную память, а затем закрыть все экземпляры Chrome и посмотреть, насколько увеличивается доступная оперативная память», не годится. ОС может назначить часть освобожденной оперативной памяти другим процессам, особенно если они заняты.

10

Я не знаю, как это сделать в целом, но чтобы измерить общее использование памяти Chrome, вы можете написать about://memory в адресную строку.

В разделе Summary показано общее использование памяти всеми процессами Chrome.

0

Некоторое время назад я написал отличный (и, возможно, несколько уродливый) пакетный файл, который делает это, он требует Sed и Cut gnuwin32.

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

Я сейчас пытаюсь убрать это, но это так, как есть.

Итак, он говорит, что Chrome использует 3,4 ГБ

    C:\>ramchrome<ENTER>
    >=1GB
    3GB
    3,480,288
    3.4GB (rounded down)
    3480288KB

Вот командный файл. Когда-то это было намного проще. Но я хотел добавить, например, ГБ и КБ .. и это занимает большую часть командного файла. Это очень надежное решение на будущее, потому что даже если Chrome потребует кучу йоттабайт (йоттабайт - миллион триллионов мегабайт), то моя партия должна или, по крайней мере, написана для поддержки этого.

Основа того, как работает внутренний пакетный файл, проста. Он создает некоторые временные файлы .. которые вы можете посмотреть .. Вы видите, что он в основном выводит список всех процессов, отфильтровывает те, которые для chrome.exe захватывает только ту часть, которая указывает, сколько байтов он использует. Затем в последнем временном файле, который вы можете вывести, вы видите, что он содержит список всех байтов, используемых каждым процессом chrome.exe, со всеми удаленными запятыми или пробелами, а затем оператор for суммирует их все. Последний временный файл может быть открыт в Excel .. хотя в этом нет необходимости.

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

@echo off
setlocal enableextensions enabledelayedexpansion


set tempfile1=%temp%\asdf1.a
set tempfile2=%temp%\asdf2.a
set tempfile3=%temp%\asdf3.a
set tempfile4=%temp%\asdf4.xls

tasklist >%tempfile1%
type %tempfile1% | grep "chrome" > %tempfile2%
cut -b 68- %tempfile2% > %tempfile3%
sed -r "s/\d32|K|,//g" %tempfile3% >%tempfile4%


set total=0
for /f %%f in (%tempfile4%) do @(set /a total+=%%f)>nul

:: --- added this
set a=%total%

if "%a:~-9,-6%"=="" echo ^< 1GB
if NOT "%a:~-13,-6%"=="" echo ^>=1GB

set yotta=%a:~-24,-21%
set zetta=%a:~-21,-18%
set exa=%a:~-18,-15%
set peta=%a:~-15,-12%
set tera=%a:~-12,-9%
set giga=%a:~-9,-6%
set mega=%a:~-6,-3%
set kilo=%a:~-3%

set prefix=

if NOT "!yotta!"=="" (
    set yotta=!yotta!,
    if "!prefix!"=="" (
        set prefix=YB
        echo !a:~-24,-21!!prefix!
    )
)

if NOT "!zetta!"=="" (
    set zetta=!zetta!,
    if "!prefix!"=="" (
      set prefix=ZB
      echo !a:~-21,-18!!prefix!
    )
)

if NOT "!exa!"=="" (
    set exa=!exa!,
    if "!prefix!"=="" (
      set prefix=EB
      echo !a:~-18,-15!!prefix!
    )
)

if NOT "!peta!"=="" (
    set peta=!peta!,
    if "!prefix!"=="" (
      set prefix=PB
      echo !a:~-15,-12!!prefix!
    )
)

if NOT "!tera!"=="" (
    set tera=!tera!,
    if "!prefix!"=="" (
      set prefix=TB
      echo !a:~-12,-9!!prefix!
    )
)

if NOT "!giga!"==""  (
    set giga=!giga!,
    if "!prefix!"=="" (
      set prefix=GB
      echo !a:~-9,-6!!prefix!
    )
)

if NOT "!mega!"==""  (
    set mega=!mega!,
    if "!prefix!"=="" (
      set prefix=MB
      echo !a:~-6,-3!!prefix!
    )
)

if "!mega!"=="" (
  if "!prefix!"=="" (
   set prefix=KB
   echo !kilo!
  )
)


echo !yotta!!zetta!!exa!!peta!!tera!!giga!!mega!!kilo!

if "%prefix%"=="YB" echo !a:~-24,-21!.!a:~-21!YB (rounded down)
if "%prefix%"=="TB" echo !a:~-12,-9!.!a:~-9,1!TB  (rounded down)
if "%prefix%"=="GB" echo !a:~-9,-6!.!a:~-6,1!GB (rounded down)
if "%prefix%"=="MB" echo !a:~-6,-3!.!a:~-3,1!MB (rounded down)


:: echo %a:~-13,-6%,%a:~-6,-3%,%a:~-3%
 set a=
:: -----------

echo %total%KB
set tempfile1=
set tempfile2=
set tempfile3=
set tempfile4=

Чтобы подвести итог, как это работает, вот пример первого временного файла asdf1.a, поскольку вы видите, что в нем перечислены многие процессы, а не только chrome.exe.

chrome.exe                    5572 Console                    1     64,784 K
chrome.exe                    3880 Console                    1    155,376 K
chrome.exe                   14516 Console                    1    106,932 K
chrome.exe                    2524 Console                    1     88,464 K
dllhost.exe                  15996 Console                    1      8,844 K
tasklist.exe                 16232 Console                    1      7,152 K

Второй временный файл становится ближе к тому, что мы хотим, отфильтровывая chrome.exe

asdf2.a

chrome.exe                    5572 Console                    1     64,784 K
chrome.exe                    3880 Console                    1    155,376 K
chrome.exe                   14516 Console                    1    106,932 K
chrome.exe                    2524 Console                    1     88,464 K

asdf3.a все ближе

 64,784 K
155,376 K
106,932 K
 88,464 K

asdf4.xml (не спрашивайте, почему это .xls, может быть, я намеревался открыть его в Excel)

64796
155592
114084
88464

Итак, вы, пакетный файл, сгенерировали простой список для суммирования.

и, очевидно, эта строка командного файла делает суммирование

for /f %%f in (%tempfile4%) do @(set /a total+=%%f)>nul

Примечание Использовать командный файл для написания этого было глупо. Пакетные файлы часто не очень переносимы, потому что небольшое изменение в выводе команды с новой версией ОС или новой версией команды может заставить программу не работать. И если он опирается на сторонние программы, где их версии разные, то это не хорошо. И многие из команд gnuwin32 устарели, Cygwin, как правило, более актуален с его версиями команд. Это работало нормально для меня, хотя теперь я попробовал это, это дало ошибку.

Я мог бы написать что-то на C # вместо этого в какой-то момент.

Также обратите внимание, что, как указал Рик, это не учитывает библиотеки DLL, используемые программой. Хотя лично я нахожу, что мне полезно знать, сколько используется исполняемым файлом (или, в случае некоторых современных браузеров, много экземпляров исполняемого файла!)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .