[win32] программа вызывает падение сетевых служб windows.

elenangel

есть некая программа разрабатываемая нашей конторой, которая должна работать под linux и windows (32 бита). В сборке под win32 (mingw) есть проблемы:
при запуске она начинает слушать определенный порт (udp) и кроме того создает дополнительные сетевые интерфейсы, в случае работы на windows это просто дополнительные ip адреса. На каждом доп. сетевом интерфейсе так же запускается сервер, которые слушает определенный порт и крутит свой тред.
Всего таких серверов запускается 3000 штук, соответственно каждый обладает сокетом, потоком, стеком и т.д.
Так вот, программа работает при этом нормально, но в windows с какого-то момента начинаются довольно странные глюки: падают службы, которые живут в svchost -k netsvcs - server, workstation, computer browser etc.
Падают непонятно как - доктор Ватсон ругается что не может писать в лог, просит указать доп. папку. Выдается сообщение что вроде бы нехватает (какой-то там) памяти, но памяти при этом в системе - попой жуй. В журнале ошибок создаются пустые сообщения - складывается впечатление что он поврежден, то есть при попытке открыть сообщение для чтения показывается пустое окно.
При попытке запуска служб сообщается что RPC server is too busy. Однако через некоторое время можно пару-тройку служб запустить из упавших, но винда до перезагрузки все равно сильно "хромает".
Память в системе не заканчивается, т.к. при создании тредов размер стека указывается в 131072 байта. Всего жрется около 400Мб в рабочем режиме. Хендлов вроде бы тоже хватает, при работе программы резервируется 45к хендлов для всей системы, при тестировании на количество хендлов максимум который достигается без глюков - 67к (тестируется созданием кучи тредов с мелким стеком).
Дамп при "система восстановлена после ошибки... отправить отчет" смотрели, но конкретная причина падения свцхоста неясна - пишет что произошел Access Violation и ссылается куда-то внутрь kernel32.
Пробовали аттачится ollydbg к svchost но ничего путнего не получилось - он паузится к месту и не к месту и сыпет исключениями - непонятно, от факта присутствия отладчика или они всегда есть но глотаются внутри служб catch'ами.
Кроме того, падение служб винды происходит непредсказуемо и не сразу после запуска целевой проги - может пару часов проработать, а может через 2 минуты упасть.
У кого нибудь есть идеи как это диагностировать, какие ресурсы могут кончаться в венде и почему могут падать сетевые службы svchost -k netsvcs?
p.s. win 2003 server ee

vall

наверно ядерная память кончается.

elenangel

ну как бы до лимита памяти еще довольно далеко, потоков с аналогичным стеком можно создать 15к штук.

Maurog

windows (32 бита)
на какой именно винде тестируете? сколько потоков рожаете в одной проге? мы однажды на XP пытались много потоков сделать, но больше ~1500 не получалось, хотя стек урезали
в ивент логах ничего плезного нет?
навскидку - задосили винду :grin: даже может быть не серверную)

elenangel

потоков - 3001 штука, тестовой прогой манипулируя размером стека на этой же винде запускали до 30к потоков
винда 2003 server ee
потоков с таким же размером стека как в основной проге создается 14.5к штук, потом кончается виртуальная память.
загрузка процессора далека от 100% - 6-7% в рабочем режиме

Dasar

очень похоже на исчерпание какого-то системного ресурса: память ядра, файловые handle-ы и т.д.
начни с Process Explorer -> View -> System Information
что выдает?

vall

причём тут юзерспейсный стэк? у ядра 2гб памяти и туда нужно впихнуть все ядерные объекты.

elenangel

сейчас не скажу - винды нету под рукой.

bleyman

Неприличный вопрос: а у вас там совершенно случайно не стоит какого-нибудь third-party фаервола? У меня похожее было от Комодо, где-то через пару дней работы с активным битторрент клиентом начинали происходить мистические чудеса, причём закрытие большинства программ не помогало.

elenangel

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

Dasar

> Всего таких серверов запускается 3000 штук,
кстати в 32 битной системе может еще кончаться адресное пространство
если запускать 3 тыс. процессов, то на процесс придется всего 1мб адресного пространства

elenangel

мы это учитываем, там в основном оно на стек идет и его нужно поменьше делать - или при создании треда указывать размер (работает с pthreads) или при сборке указывать ключ линкеру.

elenangel

System Information до запуска проги:

System Information после загрузки проги и падения svchost -k netsvcs

свойства процесса, содержащего 3к потоков

Dasar

к сожалению, ничего странного не заметно.
а System Information -> Summary что говорит - до запуска проги, и после падения svchosts?
При попытке запуска служб сообщается что RPC server is too busy. Однако через некоторое время можно пару-тройку служб запустить из упавших, но винда до перезагрузки все равно сильно "хромает".
если прибить все твои проги, винда всё равно хромает? или восстанавливается?
зы
если прогу запускать на других машинах, она ведет себя так же?

Serab

А нахрена 3000 потоков? Это же жестоко :) Там и планировщик прихуеть может, имхо, может лучше заняться немного программированием и по-другому разделить задачи между потоками?

elenangel

а System Information -> Summary что говорит - до запуска проги, и после падения svchosts?
до запуска проги:

а после падения служб пока не могу опять заскринить - падать не хотят
вот что сейчас после запуска проги но без падения служб:

если прибить все твои проги, винда всё равно хромает? или восстанавливается?
если не трогать - то нет.
если ковырять службы, то после каких-то действий удавалось поднять server, computer browser, workstation, остальные - сами не поднимаются, руками не пробовал.
если прогу запускать на других машинах, она ведет себя так же?
да, собственно потому это тестирование и стали проводить, что такой глюк был обнаружен в на некоторых компах..
сейчас этот глюк стабильно воспроизводится на 2 разных виртуалках с 2003 сервером, не клонированным. оба запущены специально для тестов. причем один в vmware а другой (мой) в VirtualBox.
обнаружен глюк был на живом железе

elenangel

каждый поток - виртуальное устройство, не зависящее от остальных.
можно делать все в 1 поток, крутя его и опрашивая очереди виртуальных устройств, но тогда
а) возрастает нагрузка на процессор, при 3к устройствах - до 100%
б) при большом (а для Windows - уже при не очень большом) количестве девайсов начинают пропускаться входящие пакеты ибо snmp = udp, проц загружен -> потери пакетов.
в) искусственно опрашивать девайсы в 1 треде - костылеобразно как-то, тем более что винда способна тянуть в 5 раз больше потоков, правда тупых.
подбирать соотношение n тредов на m девайсов эмпирически - можно, но тоже как-то костыльно.
дело-то в том, что вообще не понятно что ей (винде) не нравится. как я понимаю, хендлов хватает, памяти хватает, адресного пространства тоже хватает. однако вот падает. и падает непредсказуемо. сейчас вот упорно не падает, хотя жду уже час наверно, пытаюсь "помочь" делая всякие бессмысленные действия типа открывания консоли управления или обзора сети.

elenangel

провел кое-какие тесты, выяснил следующее:
проблемы в Windows с упомянутыми симптомами возникают если просто добавить достаточно большое количество ip-адресов на интерфейс. В случае Win2003 это около 2813 адресов (возможно чуть-чуть меньше).
При этом службы могут падать далеко не сразу, однако сразу проявляются новые симптомы, которые раньше не были замечены - не создаются, не удаляются и не копируются ярлыки на рабочем столе средствами explorer, файловым менеджером или cmd можно копировать и удалять (создавать не пробовал). Не запускается Internet Explorer. И, как и раньше, не корректно ведет себе Event Viewer - первый раз при клацаньи на любое событие открывается пустое окно с кнопкой, после его закрытия последующие попытки открыть любое событие игнорируются.
Эти вещи появляются стабильно сразу как только добавлено достаточное количество IP адресов, Если удалить дополнительные адреса то работоспособность восстанавливается - ярлычки опять копируются, IE запускается, Event Viewer показывает события.
В журнале присутствуют ошибки вида
Event Type: Error
Event Source: EventSystem
Event Category: (50)
Event ID: 4609
Date: 3/28/2011
Time: 6:06:23 PM
User: N/A
Computer: WIN2003_BUILD_S
Description: The COM+ Event System detected a bad return code during its internal processing. HRESULT was 80070776 from line 44 of d:\nt\com\complus\src\events\tier1\eventsystemobj.cpp. Please contact Microsoft Product Support Services to report this error.
For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

Адреса добавлял специально написанной прогой (довольно быстро либо батником с использованием netsh (медленно)
ipconfig /release
netsh interface ip add address local 192.168.2.194 255.255.255.0
@for /l %%i in (1,1,12) do for /l %%j in (1,1,250) do netsh interface ip add add
ress local 10.1.%%i.%%j 255.255.0.0

эффект от способа не зависит.
Есть у кого-нибудь мысли в чем может быть проблема?

zya369

в венде?

elenangel

да, в 2003 сервере

ava3443

около 2813 адресов
если не секрет, а где и зачем такое требуется?

elenangel

для создания виртуальных SNMP-устройств
Оставить комментарий
Имя или ник:
Комментарий: