2016-07-04 8 views
2

Есть ли счетчик производительности, который указывает, сколько памяти определенного процесса выгружено? У меня есть сервер с 40 ГБ оперативной памяти (с физической памятью 128 ГБ), но вычисленный объем данных превышает 100 ГБ. Как узнать, какие из моих процессов отвечают за огромное использование файлов страниц?Сколько памяти процесса выгружается?

Было бы также хорошо, если бы какая-либо трассировка xperf увидела, когда происходит действие на странице. Но, помимо многих записей в файл страницы, я не вижу, из каких процессов память записывается в файл.

Reference Set Tracing показывает мне, насколько я понимаю, насколько большой объем физической памяти моего процесса. Но, похоже, он не отслеживает активность на странице.

Update ОС Windows Server 2012 R2

+1

Я уверен, что это несчастный случай, но вы забыли упомянуть операционную систему. Не то, чтобы я знал, что ответ через :) – Makketronix

ответ

1

Поставщик ETW "Microsoft-Windows-Kernel-Memory" имеет ключевое слово "KERNEL_MEM_KEYWORD_WS_SWAP" ("0x80"). Здесь есть некоторые события, которые происходят, когда данные выгружены/выгружаемого в:

 <event value="4" symbol="WorkingSetOutSwapStart" version="0" task="WorkingSetOutSwap" opcode="win:Start" level="win:Informational" keywords="KERNEL_MEM_KEYWORD_WS_SWAP" template="WorkingSetOutSwapStartArgs"/> 
    <event value="4" symbol="WorkingSetOutSwapStart_V1" version="1" task="WorkingSetOutSwap" opcode="win:Start" level="win:Informational" keywords="KERNEL_MEM_KEYWORD_WS_SWAP" template="WorkingSetOutSwapStartArgs_V1"/> 
    <event value="5" symbol="WorkingSetOutSwapStop" version="0" task="WorkingSetOutSwap" opcode="win:Stop" level="win:Informational" keywords="KERNEL_MEM_KEYWORD_WS_SWAP" template="WorkingSetOutSwapStopArgs"/> 
    <event value="5" symbol="WorkingSetOutSwapStop_V1" version="1" task="WorkingSetOutSwap" opcode="win:Stop" level="win:Informational" keywords="KERNEL_MEM_KEYWORD_WS_SWAP" template="WorkingSetOutSwapStopArgs_V1"/> 
    <event value="6" symbol="WorkingSetInSwapStart" version="0" task="WorkingSetInSwap" opcode="win:Start" level="win:Informational" keywords="KERNEL_MEM_KEYWORD_WS_SWAP" template="WorkingSetOutSwapStartArgs"/> 
    <event value="6" symbol="WorkingSetInSwapStart_V1" version="1" task="WorkingSetInSwap" opcode="win:Start" level="win:Informational" keywords="KERNEL_MEM_KEYWORD_WS_SWAP" template="WorkingSetOutSwapStartArgs_V1"/> 
    <event value="7" symbol="WorkingSetInSwapStop" version="0" task="WorkingSetInSwap" opcode="win:Stop" level="win:Informational" keywords="KERNEL_MEM_KEYWORD_WS_SWAP" template="WorkingSetInSwapStopArgs"/> 

Здесь вы получаете некоторые данные, такие как количество страниц, доступ (PagesProcessed):

<template tid="WorkingSetOutSwapStartArgs"> 
    <data name="ProcessId" inType="win:UInt32"/> 
</template> 
<template tid="WorkingSetOutSwapStopArgs"> 
    <data name="ProcessId" inType="win:UInt32"/> 
    <data name="Status" inType="win:HexInt32"/> 
    <data name="PagesProcessed" inType="win:UInt32"/> 
</template> 
<template tid="WorkingSetInSwapStopArgs"> 
    <data name="ProcessId" inType="win:UInt32"/> 
    <data name="Status" inType="win:HexInt32"/> 
</template> 
<template tid="WorkingSetOutSwapStartArgs_V1"> 
    <data name="ProcessId" inType="win:UInt32"/> 
    <data name="Flags" inType="win:HexInt32"/> 
</template> 
<template tid="WorkingSetOutSwapStopArgs_V1"> 
    <data name="ProcessId" inType="win:UInt32"/> 
    <data name="Status" inType="win:HexInt32"/> 
    <data name="PagesProcessed" inType="win:Pointer"/> 
    <data name="WriteCombinePagesProcessed" inType="win:Pointer"/> 
    <data name="UncachedPagesProcessed" inType="win:Pointer"/> 
    <data name="CleanPagesProcessed" inType="win:Pointer"/> 
</template> 

играть с ней, если она включает все необходимые данные.

+0

Этот провайдер выглядит хорошо, но событие свопинга запускается только в том случае, если кто-то заставляет через api-вызов обменивать рабочий процесс. Этими провайдерами не регистрируются нормальные действия по настройке рабочего набора.Тем не менее, это хороший намек на отслеживание, по крайней мере, явных свопов, вызванных самим приложением. –

0

В Xperf вы хотите посмотреть на Hard Faults - обратите внимание, что это тип Page Fault, но ошибки страниц часто могут быть обработаны в программном обеспечении, не касаясь диска , Вы можете добавить столбец в диспетчере задач, чтобы показать ошибки страниц для каждого процесса.

Вы можете получить информацию о процессе с помощью такого инструмента, как https://technet.microsoft.com/en-us/sysinternals/vmmap.aspx, который расскажет вам о каждом блоке памяти в адресном пространстве процесса, в каком виде он и сколько. Тем не менее, это выделенная память, которую можно выгрузить, и VirtualQueryEx() не расскажет вам об этом.

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

Редактирование: Хмм, если вы хотите навязчивое одноразовое испытание, я предполагаю, что существует хакерская опция объединения VirtualQueryEx() и ReadProcessMemory(), чтобы касаться каждой фиксированной страницы в процессе, чтобы вы могли подсчитать жесткие ошибки!

+0

Я знаю, жесткие ошибки страницы. Это для пейджинга в памяти из файла страницы. Но я хочу знать, что выгружено в файл страницы из процессов и когда. Возможно, кто-то явно урезает рабочий набор и позже задается вопросом, почему его процесс имеет столь высокое время отклика ... –

+0

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