"System Idle Process" загружает процессор в приложении с высоким потоком

У меня есть многопоточное веб-приложение с около 1000~2000 потоков в производственной среде.

Я ожидаю использования процессора на w3wp.exe но System Idle Process ест процессор. Зачем?

4 ответа

Решение

Процесс бездействия на самом деле не является реальным процессом, он не "съедает" ваше процессорное время. % CPU, который вы видите рядом с ним, на самом деле не используется% CPU (более или менее).

Причина низкой производительности вашего приложения, скорее всего, связана с тем, что у вас 2000 потоков. Windows (или любая другая операционная система) никогда не предназначалась для одновременного запуска такого количества потоков. Вы тратите большую часть времени, просто переключаясь между ними, каждый из которых получает пару миллисекунд времени обработки каждые ~30 секунд (15 мс *2000=30 с!!!!).

Пересмотрите свою заявку.

Бездействующий процесс просто удерживает время процесса до тех пор, пока оно не понадобится программе, фактически он вообще не потребляет никаких циклов. Вы можете считать систему простой как "доступный процессор"

System Idle Process это не реальный процесс, он представляет неиспользуемое время процессора.

Это означает, что ваше приложение не использует процессор полностью - оно может быть связано с памятью или с процессором; возможно потоки ждут друг друга или внешних ресурсов? Затраты на переключение контекста также могут быть причиной - если у вас нет 2000 ядер, потоки на самом деле не работают одновременно, а назначенные временные интервалы планировщиком задач также занимают некоторое время.

Вы не предоставили много подробностей, поэтому я могу только строить догадки на данный момент. Я бы сказал, что, скорее всего, большинство из этих тем ничего не делают. Те, кто что-то делают, вероятно, связаны с IO, что означает, что они тратят большую часть времени на ожидание ответа внешнего ресурса.

Теперь поговорим о "1000~2000 потоков". Есть очень мало случаев (может быть, ни одного), когда иметь такое количество потоков - хорошая идея. Я думаю, что ваша текущая проблема - прекрасный пример того, почему. Большинство из этих потоков (по-видимому, в любом случае) ничего не делают, кроме траты ресурсов. Если вы хотите обрабатывать несколько задач параллельно, особенно если они связаны с вводом-выводом, то лучше использовать объединенные ресурсы, такие как ThreadPool или используя параллельную библиотеку задач.

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