Поделиться через


Отслеживание конкуренции в серверном процессе

Для обслуживания входящих запросов RPC будет поддерживать набор рабочих потоков. В идеале число потоков будет небольшим. Однако эта идеальная ситуация была замечена только в лабораторных средах, где подпрограммы диспетчера серверов тщательно настраиваются. В реальной ситуации количество потоков зависит от рабочей нагрузки сервера, но может варьироваться от 1 до 50.

Если число рабочих потоков превышает 50, в серверном процессе может возникнуть чрезмерная конкуренция. Распространенные причины этого — неразборчивое использование кучи, высокая нагрузка на память или сериализация большинства действий на сервере через один критический раздел.

Чтобы просмотреть количество потоков в заданном процессе сервера, используйте расширение !rpcexts.getthreadinfo или используйте DbgRpc с параметром -t . Укажите идентификатор процесса (в следующем примере 0xC4):

D:\wmsg>dbgrpc -t -P c4
Searching for thread info ...
## PID  CELL ID   ST TID      LASTTIME
-----------------------------------
00c4 0000.0004 03 0000011c 000f164f
00c4 0000.0007 03 00000120 008a6290
00c4 0000.0015 03 0000018c 008a6236
00c4 0000.0026 03 00000264 0005c443
00c4 0000.002d 03 00000268 000265bb
00c4 0000.0030 03 0000026c 000f1d32
00c4 0000.0034 03 00000388 007251e9

В этом случае существует только семь рабочих потоков, что разумно.

Если количество потоков превышает 100, необходимо подключить отладчик к этому процессу и исследовать причину.

Заметка Выполнение запросов, таких как dbgrpc -t удаленно, является дорогостоящим для сервера и сети. Если вы используете этот запрос в скрипте, убедитесь, что эта команда не выполняется слишком часто.