внешняя фрагментация и фрагментация виртуальных адресов в windbg

Я использую Windbg для отладки проблем с памятью на Win7.

Я использую !heap -s и получаю следующий вывод.

0:002> !heap -s
LFH Key                   : 0x6573276f
Termination on corruption : ENABLED
  Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast 
                    (k)     (k)    (k)     (k) length      blocks cont. heap 
-----------------------------------------------------------------------------
000f0000 00000002    1024    552   1024    257     7     1    0      0   LFH
00010000 00008000      64      4     64      2     1     1    0      0      
00330000 00001002    1088    160   1088      5     2     2    0      0   LFH
00460000 00001002     256      4    256      2     1     1    0      0      
012c0000 00001002    1088    408   1088      8    10     2    0      0   LFH
00440000 00001002    1088    188   1088     24     9     2    0      0   LFH
01990000 00001002    1088    188   1088     24     9     2    0      0   LFH
00420000 00001002    1088    152   1088      5     2     2    0      0   LFH
01d20000 00001002      64     12     64      3     2     1    0      0      
01c80000 00001002      64     12     64      1     2     1    0      0      
012e0000 00001002  776448 118128 776448 109939   746   532    0      0   LFH
    External fragmentation  93 % (746 free blocks)
    Virtual address fragmentation  84 % (532 uncommited ranges)
01900000 00001002     256      4    256      1     1     1    0      0      
01fa0000 00001002     256    108    256     58     3     1    0      0      
01c40000 00001002      64     16     64      4     1     1    0      0      
03140000 00001002      64     12     64      3     2     1    0      0      
33f40000 00001002      64      4     64      2     1     1    0      0      
340f0000 00001002    1088    164   1088      3     5     2    0      0   LFH
-----------------------------------------------------------------------------

Мой вопрос: что такое внешняя фрагментация и что такое фрагментация виртуального адреса? А что значит 93% и 84%?

Заранее спасибо.


person Kevin Tian    schedule 23.01.2014    source источник
comment
Здесь есть кто-нибудь, кто знаком с этим?   -  person Kevin Tian    schedule 24.01.2014


Ответы (3)


Вывод WinDbg относится к куче перед номерами фрагментации, в вашем случае куча 012e0000.

External fragmentation = 1 - (larget free block / total free size)

Это означает, что самый большой свободный блок в этой куче составляет 7,63 МБ, хотя общий свободный размер составляет 109 МБ. Обычно это означает, что вы не можете одновременно выделить в этой куче более 7,63 МБ.

Подробное описание внешней фрагментации см. также в Википедии.

Virtual address fragmentation: 1 - (commit size / virtual size)

Хотя я не нашел хорошего объяснения фрагментации виртуальной памяти, это интерпретация формулы: виртуальный размер — это общий объем доступной памяти. Размер фиксации - это то, что используется. Разница (1 - x) не используется.

Вы можете получить более подробную информацию об этой куче, используя !heap -f -stat -h <heap> (!heap -f -stat -h 012e0000 в вашем случае).

person Thomas Weller    schedule 26.01.2014
comment
Не могли бы вы объяснить, откуда вы знаете, что самый большой свободный блок равен 7,63 МБ? А что значит виртуальный размер? В моем случае Virt всегда равен Reserv. - person Kevin Tian; 28.01.2014
comment
@KevinTian: самый большой свободный блок можно рассчитать, решив формулу для наибольшего свободного блока. Largest free block = (1 - external fragmentation) * total free size. - person Thomas Weller; 28.01.2014
comment
@KevinTian: различают физическую память, которую может использовать Windows (режим ядра), и виртуальную память, которую могут использовать приложения (режим пользователя). Пока вы не занимаетесь разработкой драйверов, memory — это краткосрочный срок для virtual memory. WinDbg также отображает те же значения для Virt и Reserv на моей машине. Возможно это баг WinDbg 6.2, у меня раньше тоже были другие значения. - person Thomas Weller; 28.01.2014

Если вы пытаетесь отладить проблему фрагментации памяти, вам следует взглянуть на VMMAP от sysinternals.

http://technet.microsoft.com/en-us/sysinternals/dd535533

Мало того, что вы можете увидеть там точный размер самого большого свободного блока, вы также можете перейти в него в «Просмотр фрагментации», чтобы увидеть визуальное представление того, насколько фрагментирована ваша память.

person Stas Sh    schedule 27.01.2014

Спасибо за ответ Стаса Ш.

Я использую VMMap для анализа памяти, используемой процессом.

Но меня смущают личные данные, отображаемые в VMMap.

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

Я использую VMMap для анализа этого демо-приложения, и следующая информация взята из VMMap.

Process: HeapOS.exe
PID: 2320

Type         Size        Committed  Private   Total WS  Private WS  Shareable WS  Shared WS  Locked WS  Blocks  Largest   
Total        928,388     806,452    779,360   782,544   779,144     3,400         2,720                 188     
Heap         1,600       500        488       460       452         8             8                     13      1,024
Private Data 888,224     774,016    774,016   774,016   774,012     4             4                     24      294,912

Я обнаружил, что Heap очень мал, но Private Data очень велик.

Но из справки VMMap поясняется, что

Private

Private memory is memory allocated by VirtualAlloc and not suballocated either by the Heap Manager or the .NET run time. 
It cannot be shared with other processes, is charged against the system commit limit, and typically contains application data. 

Итак, я предполагаю, что Private Data - это память, выделяемая VirtualAlloc из виртуального адресного пространства процесса, и просто не может быть разделена с другим процессом. Частные данные могут выделяться кодом приложения, диспетчером кучи ОС или средой выполнения .NET.

person Kevin Tian    schedule 28.01.2014