Увеличьте производительность PYKD heap_stat, отключив RtlValidSecurityDescriptor

Во время работы с heap_stat (скрипт Python, основанный на библиотеке PYKD для запуска скриптов Python в среде Windbg) меня расстраивает огромное количество времени, которое требуется этому скрипту для выполнения своей работы.

Итак, я начал сеанс профилирования, используя "Очень сонный", и это дало следующий результат:

Name                        Exclusive  Inclusive  % Excl.    %Incl.   Module
RtlValidSecurityDescriptor   2561.56s   5123.12s   50.00%   100.00%    ntdll
ZwWaitForSingleObject        1280.78s   1280.78s   25.00%    25.00%    ntdll
NtUserWaitMessage            1279.73s   1279.73s   24.98%    24.98%   win32u

Как видите, большая часть времени тратится на функцию, проверяя некоторую валидность (что я не думаю, что это необходимо). Есть ли способ отключить эту проверку (конфигурация Windows, настройка реестра, ...)?

Редактировать после первого комментария
Поскольку был запрошен анализ xperf, я выполнил следующие команды xperf:

Запустите профилирование:

xperf -start "DDS_LoggerName" -StackWalk ObjectCreate+ObjectDelete+ObjectReference -heap -Pids 28068

Остановите профилирование:

xperf -stop "DDS_LoggerName"

Я открыл результат (неполный, потому что сначала хотел посмотреть, как выглядит результат) с помощью Windows Performance Analyzer, но для меня это не имеет смысла. Я считаю, что моя конфигурация xperf плохая. Как мне нужно запустить профилирование xperf, чтобы иметь возможность измерить, какая функция занимает какое количество времени?

запустил проблему с бэктрекером pykd: githomelab.ru/pykd/pykd/issues/36

ussrhero 09.01.2019 20:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
139
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я видел ваш журнал xperf, и вот результаты:

25% ЦП получил вызов heap_output = dbgCommand ('! куча -h 0'). split ('\ n')

75% петля для heap_block в heap_output: а основным потребителем ЦП является pykd.ptrPtr

Основная причина потери ЦП - массовый вызов dbgeng! FlushCallbacks внутри Debug Engine. Фактически, все функции Debug Engine напоминают этот метод, и я не понимаю, почему.

Я могу посоветовать вам провести рефакторинг heap_stat.py и переписать свою собственную функцию ptrPtr с помощью ptrDword или ptrQword, это может снизить потери ЦП.

Большое спасибо за анализ, посмотрю.

Dominique 09.01.2019 14:39

мы постараемся расследовать это дело

ussrhero 09.01.2019 14:53

Я полагаю, вы использовали Windows Performance Analyzer для анализа? Какой отчет вы просматривали, чтобы увидеть эти результаты? (Или для этого нужны символы PYKD?)

Dominique 09.01.2019 15:26

К сожалению, я только что попытался заменить ptrPtr на ptrDWord, и производительность выглядит примерно так же.

Dominique 09.01.2019 17:10

Другие вопросы по теме