Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сканирование множеста компьютеров 
:(
    Опции темы
andDavid
Дата 1.11.2011, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 12.2.2010

Репутация: нет
Всего: нет



Есть домен с 2000+ машинами. Мне надо просканировать все эти машини и извлечь из локальной группы администраторов на каждой машине все аккаунты, узнать, какие пользователи отключены(Disable), и иметь возможность включать(Enable) и удалять пользователей(Remove)  из этой группы.  Сканирование компьютеров я деляю с помощью WMI, а операции - с помощью namespace System.DirectoryServices (почему-то сканирование компьютеров с помощью класса DirectoryEntry не работает у работодателя). Так вот, все  компьютеры сканируются успешно, и показывается результат отлично, и операции все работают ))). НО...операция сканирования происходит очень медленно, так как я делаю это одним потоком (использую BackgroundWorker). ВОПРОС: как можно увеличить скорость сканирования компьютеров? 

Понятное дело, что нужно создавать несколько потоков. Однако, моя идея создания N потоков на M компьютеров, так, чтобы каждый поток сканировал всего небольшое количество компьютеров,  кажется неправильной. (Наример:  всего в домене 2500 компьютеров. Создаю 100 потоков, и каждый из них будет сканировать 25 машин). 

Буду очень признателен за предложенные решения данной проблемы. 


Это сообщение отредактировал(а) andDavid - 1.11.2011, 01:49
PM MAIL   Вверх
andDavid
Дата 2.11.2011, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 12.2.2010

Репутация: нет
Всего: нет



Сделал, как написал. Скорость увеличилась.  Но все поток завершаюстся медленно, так как они не могут завершиться быстро из-за того, что каждый поток коннектится к удалленой машине. А я его не могу прервать.
PM MAIL   Вверх
andDavid
Дата 3.11.2011, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 12.2.2010

Репутация: нет
Всего: нет



А может лучше использовать ThreadPool ? Хотя, у меня поток только получает необходимую инфо. из другого компьютера и тут же закрывается. Но получается тяжеловестно создавать каждый поток собственноручно. Может кто подскажет? 

Сейчас использую вот этот код: 

Код


                int scanningComputers = computers.Count / _threadsCount + 1;
                int scannThreads = computers.Count / scanningComputers;

                var scanningThreads = new Thread[scannThreads + 1];
                for (int i = 0; i < scannThreads; i++)
                {
                    scanningThreads[i] = new Thread(ShowMembersOfAdministratorsGroup) { IsBackground = true };
                    scanningThreads[i].Start(new ParametersWrapper() { Computers = computers.GetRange(0, scanningComputers), Event = e });
                    computers.RemoveRange(0, scanningComputers);
                }

                scanningThreads[scannThreads] = new Thread(ShowMembersOfAdministratorsGroup) { IsBackground = true };
                scanningThreads[scannThreads].Start(new ParametersWrapper() { Computers = computers, Event = e });


PM MAIL   Вверх
mihryak
Дата 28.11.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 3
Всего: 36



вполне можно использовать ThreadPool, с ним тебе вообще не придётся задумываться о количестве потоков - просто зашедуль все компы сразу, а рантайм сам разберётся, сколько реальных потоков создать и как их использовать

твой текущий вариант плох тем, что если все самые "медленные" компы попадут в один из потоков, то остальные завершатся раньше и не будут использоваться для ещё необработанных компов

есть ещё вариант организовать нечто вроде своего пула потоков:
  • создай очередь из всех компов
  • создай поточную функцию, забирающую в бесконечном цикле комп из очереди на обработку
  • если очередь пуста, то прерывай цикл
  • не забудь синхронизировать обращение к очереди
  • для определения окончания работы создай, к примеру, массив AutoResetEvent на каждый поток и в главном методе вызови WaitHandle.WaitAll, а в поточных функциях вызывай при завершении autoResetEvent.Set() (примечение: если потоков нужно будет создать больше 64, то вместо раздачи waitHandle'ов каждому потоку нужно будет придумать что-нибудь другое, например, сравнивать количество уже обработанных потоков с изначальным количеством)
при таком подходе потоки надо будет создавать самому, но у тебя будет более точный контроль над ними
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0408 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.