Является ли ASP.NET многопоточным (как он выполняет запросы) - PullRequest
17 голосов
/ 12 января 2009

Это может быть немного глупо, но;

Если на мой сайт одновременно заходят два человека, будет ли серверный код выполняться один за другим или они будут выполняться одновременно в отдельных потоках?

Мне любопытно, что касается атаки типа «отказ в обслуживании» при входе на сайт. Сервер замедляется, потому что у него огромная очередь входов, или он медленный, потому что у него миллиард одновременных входов!

Ответы [ 4 ]

18 голосов
/ 12 января 2009

Это не относится к ASP.NET как таковому (у меня очень мало знаний в этой области), но, как правило, к веб-серверам. Большинство веб-серверов используют потоки (или процессы) для обработки запросов, поэтому любой фрагмент кода, который вы используете, будет выполняться для обоих соединений параллельно. Конечно, если вы обращаетесь к базе данных или какой-либо другой серверной системе, в которой установлена ​​блокировка, позволяющая выполнять запросы только одному сеансу, вы могли бы неявно сериализовать все запросы.

Веб-серверы обычно имеют минимальное и максимальное количество рабочих, которые настроены на текущее оборудование (процессоры, память и т. Д.). Если они исчерпаны, новые запросы будут поставлены в очередь в ожидании готовности рабочего или пока не будет достигнута максимальная длина ожидающих запросов, после чего он игнорирует новые соединения, фактически отказывая в обслуживании (если это делается специально отказ в обслуживании или DoS-атака).

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

3 голосов
/ 12 января 2009

Следует использовать пул потоков. Обратите внимание, что они все еще находятся в одном приложении, поэтому элементы уровня приложения, такие как статические переменные, по-прежнему совместно используются ими.

1 голос
/ 12 января 2009

Как говорили другие, большинство веб-серверов используют несколько процессов или потоков (лучше) для обслуживания нескольких запросов одновременно. В частности, вы можете установить для каждого пула приложений ASP.NET максимальное количество запросов в очереди и максимальное количество рабочих процессов. Каждый процесс имеет несколько потоков максимум (не настраивается AFAIK, я могу ошибаться), и входящие запросы обрабатываются в порядке поступления.

Более того, ASP.NET обрабатывает один отдельный запрос для каждого сеанса, но злонамеренный пользователь может открыть столько сеансов, сколько ему нужно.

Несколько входов в систему, вероятно, ударит базу данных и поставит ее на колени, вероятно, перед самим веб-сервером.

Насколько я знаю, не существует встроенного способа регулирования запросов ASP.NET, кроме установки максимального числа запросов в очереди (ожидающих обработки). Это число должно быть идеально очень маленьким. Вы можете отслеживать количество запросов ASP.NET в очереди с помощью счетчиков производительности. Скажем, вы обнаружите, что в пиковом трафике это число равно 100. Затем вы можете обновить приложение, чтобы оно отклоняло попытки входа в систему, когда это число превышает 100, чтобы база данных не была повреждена (никогда не делал этого, просто мысль).

1 голос
/ 12 января 2009

из эта статья

" Помните, что ISAPI является многопоточным , поэтому запросы будут поступать в несколько потоков через ссылку, возвращенную ApplicationDomainFactory.Create (). В листинге 1 показан дизассемблированный код из метод IsapiRuntime.ProcessRequest, который получает в качестве параметров объект ecb ISAPI и тип сервера в качестве параметров. Этот метод является потокобезопасным, поэтому несколько потоков ISAPI могут безопасно вызывать этот единственный возвращенный экземпляр объекта одновременно. "

Так что да, в случае атаки DOS, она будет медленной из-за большого количества соединений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...