跟踪服务器进程中的争用
为了为传入请求提供服务,RPC 将维护一组工作线程。 理想情况下,线程数会很小。 但是,这种理想情况仅在仔细优化服务器管理器例程的实验室环境中出现。 在实际情况下,线程数将因服务器工作负荷而异,但线程数可以是 1 到 50。
如果工作线程数超过 50,则服务器进程中可能存在过多争用。 导致这种情况的常见原因是错误地使用堆、内存压力或通过单个关键部分序列化服务器中的大多数活动。
若要查看给定服务器进程中的线程数,请使用 !rpcexts.getthreadinfo 扩展,或将 DbgRpc 与 -t 开关配合使用。 在以下示例中提供进程 ID (,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 等查询对服务器和网络来说成本高昂。 如果在脚本中使用此查询,应确保此命令不会过于频繁地运行。