Как ограничить нагрузку на сервер при одновременном опросе большого кол-ва устройств?

На сервере настроен автоматический опрос около 1000 устройств один раз в час.
Необходимо это для своевременного выявления нештатных ситуаций (порывов и т.д)
Все устройства подключены по каналу Ethernet, что практически позволяет опросить всю тысячу устройств одновременно, но при этом по окончании опроса запускается процесс расчета и записи значений в БД, в этот момент идет очень высокая нагрузка на сервер, иногда бывает возникают ошибки об истечении таймаута ответа от БД.
Очевидно тут есть два варианта решения проблемы:

  1. Увеличить производительность сервера
  2. Разнести сеансы опроса по времени.

Вариант увеличить производительность в этой теме рассматривать не будем, остается вариант № 2. Нам необходимо получать данные максимально близко к началу каждого часа, поэтому задать в расписании автоопроса смещение времени опроса для некоторых точек я не могу.
Пока выхожу из ситуации ограничив максимальное количество подключений по порту Ethernet до 40 - таким образом устройства опрашиваются максимально быстро (нет искусственно добавленной задержки по времени через расписание автоопроса), при этом сервер успевает нормально обрабатывать поступающие данные.Но тут тоже есть некоторые проблемы:

  • При попытке ручного опроса в момент опроса всех устройств пользователю выдается сообщение “Все порты опроса в данный момент заняты”
  • В случае, если попадаются “проблемные” устройства (ответ не получен) - они тормозят весь опрос, хотя нагрузку на БД не создали бы, т.к. сохранять и расчитывать нечего.

Как посоветуете более элегантно решить такую задачу?

Может, стоит ограничить расчёт данных и по максимуму отключить его?

Плюс, при эксплуатации БД возможна сильная фрагментация индексов, а это очень сильно увеличивает затраты SQL Server на сохранение записей.

У нас в системных параметрах на закладке “Обслуживание базы” есть пункт "Выполнять еженедельное обслуживание индексов БД в воскресенье в 5:00. Это задание получит фрагментацию индексов и перестроит или реорганизует те, которые этого требуют.

Но эта операция занимает несколько часов, в течение которых сервер БД может стать практически неработоспособным. Поэтому, по умолчанию она отключена.

Для начала поставьте SQL Server Management studio, подключиться к серверу БД, и на базе LERS выбрать пункт контекстного меню “Reports → Standard Reports → Index Physical Statistics”.

В отчёте будет список индексов и операция, которая для них нужна. Обратите внимание на таблицы:
(Water|Gas|Electric)Consumption(Day|Hour|Current),
а так же таблицу DataStatus.

Если в отчёте значится рекомендованная операция Rebuild или Reorganize, раскройте в разделе Indexes выберите нужный индекс и нажмите Reorganize или Rebuild.

Это должно сильно сократить время на сохранение данных после опроса.

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

Для ручного опроса можно завести отдельный IP-порт, и не указывать его в параметрах автоопроса. Так он всегда будет доступен для работы операторам.

Этот пункт я включил как только такой функционал добавили в систему.

Ваши рекомендации я выполнил, самая большая фрагментация индексов была у таблицы WaterConsumprionCurrent - около 8%. Не знаю насколько это много, но думаю не очень :slightly_smiling_face:

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

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

Это должно сильно увеличить отзывчивость сервера во время интенсивного опроса.