У меня есть сервер, который накапливает дескрипторы системного процесса, известного как c: \ windows \ system32 \ ntoskrnl.exe. Ручки доходят до 18000 за один день и продолжают расти с этой скоростью. На сервере работает Postgresql 9.0.3, веб-службы asp.net, которые вставляются в базу данных, и веб-сайт asp.net, который запрашивает базу данных. Доступ к веб-службам осуществляется с тестовых машин Linux и Windows через gSOAP. Я запустил Process Explorer для процесса System, и дополнительные дескрипторы перечислены как Type Key. Я нашел их в Регидте. Вот два примера, экспортированных из regedit.
1.
Key Name: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{2e167ea7- 85e3-4395-995a-77af9875d79a}\InprocServer32
Class Name: <NO CLASS>
Last Write Time: 7/13/2009 - 10:53 PM
Value 0
Name: <NO NAME>
Type: REG_EXPAND_SZ
Data: %systemroot%\system32\colbact.dll
Value 1
Name: ThreadingModel
Type: REG_SZ
Data: Both
2.
Key Name: HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{91162401-6E6B-478A-A7FF-994EBA35B9C3}
Class Name: <NO CLASS>
Last Write Time: 7/13/2009 - 10:54 PM
Value 0
Name: <NO NAME>
Type: REG_SZ
Data: PSFactoryBuffer
Key Name: HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{91162401-6E6B-478A-A7FF-994EBA35B9C3}\InProcServer32
Class Name: <NO CLASS>
Last Write Time: 7/13/2009 - 10:54 PM
Value 0
Name: <NO NAME>
Type: REG_EXPAND_SZ
Data: %SystemRoot%\system32\ime\shared\imeapis.dll
Value 1
Name: ThreadingModel
Type: REG_SZ
Data: Both
Веб-сервис, который вставляется в базу данных, выполняется около 130 000 раз в день в течение всего дня. Вставка состоит из виртуальной машины, на которой запущены Windows или Linux в интрасети, вызывающая функцию веб-службы через gSOAP с данными результатов тестирования. Данные представляют собой строки и числа. Веб-служба открывает соединение с базой данных, вставляет данные в базу данных и закрывает соединение. Размер рассматриваемой базы данных составляет 150 гигабайт. Я просмотрел код использования базы данных, который, кстати, является C #, и каждое соединение с базой данных закрывается, насколько я могу видеть. Серверные функции работают нормально, за исключением накопления дескрипторов.
Когда количество дескрипторов достигает примерно 150 000, веб-сайт начинает вести себя странно, и мне приходится перезагружаться, что является проблематичным, поскольку тестовые машины бомбардируют веб-службу результатами тестирования.
Что могло вызвать накопление дескриптора? Любая помощь будет принята с благодарностью. Спасибо.
Оказывается, утечка информации о ручке была вызвана драйвером в программе менеджера лицензий, разработанной SaferNet Inc. Программа AQTime программного обеспечения SmartBear использует этот менеджер лицензий, и вот как мы его получили. Я работаю со SmartBear, чтобы решить эту проблему.
Я смог точно определить открытие реестра, которое не было закрыто, с помощью Process Monitor от Sysinternals. Затем я посмотрел на стек вызовов для рассматриваемых дескрипторов и увидел, что драйвер из SaferNet вызывает ntoskrnl.
В конце концов, проблема не имела ничего общего с IIS, gSOAP или postgresql.
Ребята из SmartBear предоставили более новый менеджер лицензий. Я установил его поверх старого, и утечка исчезла.