Медленное реагирование приложения .NET Webforms после короткого простоя - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть приложение ASP.NET Webforms, которое загружает данные из Teradata. Я заметил, что если пользователь бездействует на странице (всего 5 минут), страница будет медленно реагировать (до 15 секунд). Если пользователь перемещается по приложению без простоя, производительность намного выше (не более 1 секунды).

Приложение находится на IIS 8. Достаточно забавно, что при запуске версии приложения для разработки локально через отладчик в Visual Studio я никогда не сталкивался с этой проблемой, и приложение реагирует плавно.

Я получил следующие предложения: оптимизация запросов, установка тайм-аута сеанса на 60 минут вместо значения по умолчанию 20 и индексация базы данных.

  1. Я установил время сеанса на 60 минут, и проблема все еще возникает.
  2. Некоторые таблицы поиска, используемые для заполнения раскрывающихся списков, имеют не более 15 строк, а производительность по-прежнему низкая. Даже если я оптимизирую БД, используя лучшие запросы или индексацию, я не думаю, что производительность улучшится.

Ниже приведена наиболее часто используемая функция, используемая для извлечения наборов данных из базы данных. Я использую Teradata.Client.Provider для доступа к Teradata.

public DataSet ExecuteDataSet(string sqlQuery, Dictionary<string, string> parameters)
        {
            ds = new DataSet();
            TdConnection conn = new TdConnection(getConnString());
            using (conn)
            {
                ///Build the TD DB Command
                tdSqlStringCommand = new TdCommand(sqlQuery, conn);
                using (tdSqlStringCommand)
                {
                    //Create an instance for TD data adapter
                    TdDataAdapter adapter = new TdDataAdapter();
                    adapter.SelectCommand = tdSqlStringCommand;

                    ///Append the Parameters
                    AddTdParameters(ref adapter, parameters);

                    ///Execute the dbCommand

                    adapter.Fill(ds);
                }
            }
            return ds;
        }

Я ожидаю, что проблема будет на стороне IIS, так как запуск версии разработки через отладчик в Visual Studio не вызывает проблем с производительностью.

1 Ответ

0 голосов
/ 18 апреля 2019

В зависимости от поведения, которое вы описываете, вам может понадобиться посмотреть на поведение тайм-аута в пуле приложений в IIS (Пул приложений -> Расширенные настройки -> Модель процесса -> Действие в режиме ожидания).

Две вещи могут произойти, когда пул приложений достигает своего времени ожидания.

  • Прекратить
  • Приостановка

Если пул приложений / рабочий процесс настроен на прекращение при достижении времени ожидания простоя, то первый запрос после истечения времени ожидания должен ждать запуска рабочего процесса, это займет несколько секунд, если вы работают. NET код. Лично я работаю с приложением, которое с холодного старта раскручивается примерно за 20 секунд.

Кто-то в какой-то момент мог прекратить работу пула приложений по умолчанию, пытаясь снизить нагрузку на сервер. Это произошло в моей организации и по уважительной причине, но восприятие снижения производительности приводило к большому разочарованию, пока мы не осознали, что произошло.

Однако Microsoft была достаточно любезна, чтобы добавить намного более приятное поведение, Suspend.

Вот статья MS о выгрузке из процесса простоя, она объясняет поведение приостановки.

По сути, вместо того, чтобы убивать рабочий процесс и запускать его с нуля, меняйте его на диск. Производительность по-прежнему снижается, но это далеко не так плохо, как холодный старт. В моей организации мы видели, что это занимает 2 или 3 секунды, а не 20 секунд холодного старта.

Это действительно улучшило использование ресурсов. Вместо того, чтобы постоянно поддерживать 20 пулов приложений и потреблять ~ 1 ГБ ОЗУ на каждый, теперь наши пулы приложений могут приостанавливать работу и занимать от 1 до 5 МБ ОЗУ, пока нам это не понадобится.

Надеюсь, это поможет.

...