Невероятное количество логических потоков;windbg их не видит? - PullRequest
2 голосов
/ 18 мая 2011

У меня есть процесс, который показывает ~ 4 294 965 900 «текущих логических потоков» (согласно счетчикам производительности) и ~ 400 физических потоков.

Я создал дамп памяти с помощью ADPlus (-hang), а windbg (! Threads) показывает только физические потоки.

Как мне узнать, откуда все эти логические потоки?

Ответы [ 3 ]

4 голосов
/ 18 мая 2011

Для меня это выглядит подозрительно большим числом.

Число -1396, представленное как 32-разрядное целое число без знака, равно 4 294 965 900, а 1396 выглядит более разумным.возможно?

0 голосов
/ 19 мая 2011

Как я узнаю, откуда все эти логические потоки?

это не так.Их не существуетВы просто не можете иметь 4 миллиарда потоков любого вида, если только вы не работаете на 64-битной машине с, скажем, парой петабайт ОЗУ как минимум .

Каждый поток, независимо от того, является ли он «физическим» потоком ОС или предоставляется какой-то платформой, требует, по крайней мере, некоторого идентификатора.Если это 32-битное число, то хранение этих идентификаторов займет около 16 ГБ ОЗУ.(И, конечно, у вас останется около 1600 неиспользуемых идентификаторов).Если идентификаторы имеют ширину 64 бита, вам нужно 32 ГБ ОЗУ.Кроме того, каждому потоку требуется некоторое пространство стека (общее значение по умолчанию составляет 1 МБ, что дает нам до 4 петабайт памяти).

Это ошибка.Потоки не существуют, и счетчики производительности по какой-либо причине сообщают вам о значении мусора.

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

Или это может быть какое-то другое условие ошибки.

0 голосов
/ 19 мая 2011

Поскольку ваш процесс выполняет управляемый код, скорее всего, число логических потоков относится к потокам CLR. .Net выполняет сопоставление между логическими потоками CLR и физическими потоками. Чтобы исследовать это дальше, вы можете использовать команду! Threads в Windbg. Это пример вывода этой команды:


0:028> !threads
ThreadCount:      25
UnstartedThread:  0
BackgroundThread: 22
PendingThread:    0
DeadThread:       3
Hosted Runtime:   yes
                                   PreEmptive   GC Alloc                Lock
       ID  OSID ThreadOBJ    State GC           Context       Domain   Count APT Exception
   0    1  12b0 007b69d0      4220 Enabled  120337b4:12034a3c 007afef8     0 STA
   6    2  1f70 007c2688      b220 Enabled  11ed2a84:11ed4a3c 007afef8     0 MTA (Finalizer)
   7    3  2340 007c8ac8      1220 Enabled  00000000:00000000 007afef8     0 Ukn
  11    4  1c4c 0aaf3380      7220 Enabled  00000000:00000000 007afef8     0 STA
  13    8  2414 0d4932f0       220 Enabled  00000000:00000000 007afef8     0 Ukn
   3    a  2780 0d4d08e8   1009220 Enabled  00000000:00000000 007afef8     0 MTA (Threadpool Worker)
  15    7   970 0d4d0df0   1009220 Enabled  11ed4ad8:11ed6a3c 007afef8     0 MTA (Threadpool Worker)
  19    9  2510 0d4d12f8   200b220 Enabled  00000000:00000000 007afef8     0 MTA
  20    b   80c 0d4d1800   200b220 Enabled  00000000:00000000 007afef8     0 MTA
  21    c  2490 0d4d1d08   200b220 Enabled  00000000:00000000 007afef8     0 MTA
  23    d  2724 0d4d2210   1009220 Enabled  00000000:00000000 007afef8     0 MTA (Threadpool Worker)
  24    e  2200 0d4d2718   1009220 Enabled  00000000:00000000 007afef8     0 MTA (Threadpool Worker)
  26    f  1f3c 0d4d2c20   1009220 Enabled  00000000:00000000 007afef8     0 MTA (Threadpool Worker)
  25   10  200c 0d4d3128   1009220 Enabled  00000000:00000000 007afef8     0 MTA (Threadpool Worker)
  27   11  2708 0d4d3630   1009220 Enabled  00000000:00000000 007afef8     0 MTA (Threadpool Worker)
  17    6  21b4 0d4d3b38   1009220 Enabled  00000000:00000000 007afef8     0 MTA (Threadpool Worker)
  18    5  2148 0d4d4548       220 Enabled  00000000:00000000 007afef8     0 MTA
XXXX   16       0d4d6378     19820 Enabled  00000000:00000000 007afef8     0 MTA
XXXX   15       0d4d5e70     19820 Enabled  00000000:00000000 007afef8     0 MTA
  30   14  112c 0d4d5968   200b220 Enabled  00000000:00000000 007afef8     0 MTA
  32   13  2734 0d4d5460      b220 Enabled  00000000:00000000 007afef8     0 MTA
  33   12  11ec 0d4d4a50   100a220 Enabled  00000000:00000000 007afef8     0 MTA (Threadpool Worker)
  34   17  166c 0d4d6880   8009220 Enabled  00000000:00000000 007afef8     0 MTA (Threadpool Completion Port)
  35   18  24f4 0d4d6d88   8009220 Enabled  00000000:00000000 007afef8     0 MTA (Threadpool Completion Port)
XXXX   19       0d4d7798     19820 Enabled  00000000:00000000 007afef8     0 Ukn

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

В выводе! Threads левый столбец является идентификатором неуправляемого потока (аналогично отображаемому командой ~), второй столбец - это идентификатор потока CLR, а третий столбец - идентификатор потока ОС.

...