В CMD.exe «start sh.exe» создает отдельный процесс, который занимает 700 МБ памяти

645
laggingreflex

Git bash (sh.exe) в противном случае занимает мало памяти, но при запуске по start sh.exeкоманде CMD он создает процесс conhost.exe, который занимает 3-700 МБ памяти.

Интересно start cmd /k sh.exeто же самое, но он создает процесс conhost, который занимает всего 8 МБ.

Почему запуск sh.exe с помощью команды «start» создает процесс conhost, который занимает гораздо больше памяти?

1
Как вы измеряете, сколько памяти занимает? А что вы подразумеваете под "памятью"? Вы имеете в виду физическую память (RAM)? David Schwartz 8 лет назад 0
@DavidSchwartz [Диспетчер задач показывает ~ 300 МБ, Process Explorer показывает ~ 700 МБ (частные байты)] (http://i.imgur.com/nZG1RW8.png) laggingreflex 8 лет назад 0
Итак, не физическая память тогда. Тогда короткий ответ: никого не волнует, что это за значение. Недостаточно только физической памяти, и обычно люди не пытаются минимизировать потребление ресурсов, которых не хватает. David Schwartz 8 лет назад 0
@DavidSchwartz Я измерил общее использование оперативной памяти в Resource Monitor, и пики и падения кажутся похожими. Кроме того, когда есть 10 таких conhosts, мой хром останавливается на некоторое время, когда доступ через некоторое время. Я видел улучшение, когда избегал запуска conhosts способом, описанным в моем вопросе (используя `start cmd sh.exe` вместо` start sh.exe`). Мой вопрос * почему * разница вообще? Почему conhost требует намного больше памяти (даже просто виртуальной) при запуске `start sh.exe` по сравнению с` start cmd / c sh.exe` laggingreflex 8 лет назад 0
Ответ - то, что я сказал - виртуальная память не ограничена, поэтому люди не пытаются минимизировать ее потребление. Распространено выделять довольно большие куски на тот случай, если это понадобится позже. Это особенно верно при запуске процесса, потому что есть вещи, которые вы можете сделать до запуска, которые вы не можете легко сделать после. David Schwartz 8 лет назад 0
установите WPT (часть Win10 SDK: https://dev.windows.com/en-us/downloads/windows-10-sdk), запустите WPRUI.exe, выберите VAlloc, запустите трассировку, теперь запустите sh.exe , после того как вы это сделали и увидели использование памяти, сохраните трассировку в файл ETL. Поделитесь этим ETL (сжатым как 7z, чтобы уменьшить размер) magicandre1981 8 лет назад 0
разверните запись «Анализ ресурсов», чтобы увидеть ** использование VAlloc **. Также выберите ** Анализ резидентных наборов ** magicandre1981 8 лет назад 0

1 ответ на вопрос

1
magicandre1981

ok, I looked at both traces with WPA.exe. In the trace which shows the high memory usage, the memory usage comes from creating the screen buffer DoCreateScreenBuffer:

Line #, Process, Commit Stack, Address, Count, Impacting Size, Size 1, conhost.exe (10848), [Root],, 46, 800784384, 800833536 2,, |- ntdll.dll!RtlUserThreadStart,, 31, 800669696, 800673792 3,, | kernel32.dll!BaseThreadInitThunk,, 31, 800669696, 800673792 4,, | |- ConhostV2.dll!ConsoleIoThread,, 13, 800509952, 800509952 5,, | | ConhostV2.dll!ConsoleHandleConnectionRequest,, 13, 800509952, 800509952 6,, | | ConhostV2.dll!ConsoleAllocateConsole,, 13, 800509952, 800509952 7,, | | |- ConhostV2.dll!SetUpConsole,, 10, 800460800, 800460800 8,, | | | |- ConhostV2.dll!AllocateConsole,, 7, 800432128, 800432128 9,, | | | | ConhostV2.dll!DoCreateScreenBuffer,, 7, 800432128, 800432128 10,, | | | | |- ConhostV2.dll!SCREEN_INFORMATION::CreateInstance,, 6, 800415744, 800415744 11,, | | | | | ConhostV2.dll!TEXT_BUFFER_INFO::CreateInstance,, 6, 800415744, 800415744 12,, | | | | | |- ConhostV2.dll!DBCS_SCREEN_BUFFER::CreateInstance,, 4, 599891968, 599891968 13,, | | | | | | ntdll.dll!RtlpAllocateHeapInternal,, 4, 599891968, 599891968 14,, | | | | | | ntdll.dll!RtlpAllocateHeap,, 4, 599891968, 599891968 15,, | | | | | | ntdll.dll!NtAllocateVirtualMemory,, 4, 599891968, 599891968 16,, | | | | | | ntoskrnl.exe!KiSystemServiceCopyEnd,, 4, 599891968, 599891968 17,, | | | | | | ntoskrnl.exe!NtAllocateVirtualMemory,, 4, 599891968, 599891968 18,, | | | | | | ntoskrnl.exe! ?? ::NNGAKEGL::`string',, 4, 599891968, 599891968 

The start cmd /k sh.exe one, doesn't do this memory allocations. Here only some chars are printed, which uses only 69kB.

Line #, Process, Commit Stack, Address, Count, Impacting Size, Size 7, conhost.exe (10072), [Root],, 2, 81920, 81920 8,, ntdll.dll!RtlUserThreadStart,, 2, 81920, 81920 9,, kernel32.dll!BaseThreadInitThunk,, 2, 81920, 81920 10,, |- ConhostV2.dll!ConsoleIoThread,, 1, 69632, 69632 11,, | ConhostV2.dll!SrvWriteConsole,, 1, 69632, 69632 12,, | ConhostV2.dll!DoSrvWriteConsole,, 1, 69632, 69632 13,, | ConhostV2.dll!DoWriteConsole,, 1, 69632, 69632 14,, | ConhostV2.dll!WriteChars,, 1, 69632, 69632 15,, | ConhostV2.dll!WriteCharsLegacy,, 1, 69632, 69632 16,, | ConhostV2.dll!WriteRegionToScreen,, 1, 69632, 69632 17,, | ConhostV2.dll!ConsolePolyTextOut,, 1, 69632, 69632 18,, | ntdll.dll!RtlpAllocateHeapInternal,, 1, 69632, 69632 19,, | ntdll.dll!RtlpAllocateHeap,, 1, 69632, 69632 20,, | ntdll.dll!RtlpCommitBlock,, 1, 69632, 69632 21,, | ntdll.dll!NtAllocateVirtualMemory,, 1, 69632, 69632 22,, | ntoskrnl.exe!KiSystemServiceCopyEnd,, 1, 69632, 69632 23,, | ntoskrnl.exe!NtAllocateVirtualMemory,, 1, 69632, 69632 24,, | ntoskrnl.exe! ?? ::NNGAKEGL::`string',, 1, 69632, 69632 25,, |, 0x2a657431000, 1, 69632, 69632 

But I have no clue, why this happens. Run it always with start cmd /k.

Ааа! [У меня был установлен размер буфера экрана 9999] (http://i.imgur.com/Tln5IJP.png) Не знаю, почему он применяется только к `start sh.exe`, но понижает его до нормальных значений, созданных conhost с помощью не так много использования памяти. Черт! лол. Спасибо за анализ! laggingreflex 8 лет назад 0
Когда я впервые посмотрел на след, я тоже подумал об этом, но забыл добавить его. Но приятно слышать, что это исправлено сейчас :) magicandre1981 8 лет назад 0

Похожие вопросы