Сколько ручек Windows используется "слишком много"?

Я понимаю, что ответ на этот вопрос может зависеть от параметров реестра и от версии Windows и, возможно, от объема ОЗУ, если памяти недостаточно. Ради этого вопроса предположим, что на сервере достаточно ОЗУ (3+ GiB).

Если приложение (стороннее приложение в этом случае) теряет ручку в несколько сотен часов, сколько суммарных дескрипторов может терять приложение, прежде чем другие приложения столкнутся с проблемами? Под "проблемами" я имею в виду, например, не запускать поток, не открывать файл и т.д.

Я видел, как некоторые серверы (слегка загруженные) отлично работают с процессом (как правило, процессом базы данных) с использованием нескольких десятков тысяч дескрипторов, поэтому старое ограничение дескриптора 10000 явно не является проблемой. (И это все равно было пределом для каждого процесса, поэтому не повлияло бы на мое приложение, которое хорошо под этим.)

Может ли кто-нибудь ответить на вопрос или указать мне на некоторые ресурсы, которые объясняют, сколько всего ручек сервера Windows разрешит до того, как вы закончите эффективно (из ручек или других системных ресурсов)?

Ответ 1

См. Реймонд Чэнь в этой теме. Диспетчер окон применяет ограничение в 10K на процесс и имеет общий предел в 32K по всей системе. Поэтому, если он "только" протекает 100 ручек в час, у вас есть несколько дней безотказной работы, прежде чем он начнет плохо себя вести.

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

Ответ 2

куча рабочего стола, которая представляет собой пул памяти, где реальный "материал", который представляет собой дескриптор, представляет жизнь. Иногда не столько количество ручек, сколько вы выделили, сколько объем памяти каждого объекта под этим дескриптором. Вы можете отлаживать кучу таким образом. Это установка для установки.

(это было переработано из другого моего ответа)

Ответ 3

Поскольку эти значения могут меняться с новыми версиями Windows, вы можете использовать инструмент SysInternals TestLimit/TestLimit64, чтобы получить приблизительную оценку. Версия x64 может работать некоторое время, особенно для теста памяти (он может использовать жесткий диск (файл подкачки), чтобы получить больше виртуальной памяти).

Получить инструменты из http://live.sysinternals.com/WindowsInternals/ или http://download.sysinternals.com/files/TestLimit.zip

Параметры командной строки:

-p check process limit
-t check thread limit
-h check handle limit
-u check user handle limit

Ответ 4

Согласно this, 10000.