2009-01-12 3 views
12

Это может быть немного глупый вопрос;Является ASP.NET многопоточным (как он выполняет запросы)

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

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

ответ

13

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

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

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

+0

Есть ли максимальное количество запросов, которые можно обрабатывать? Этот максимум включает несколько веб-сайтов, размещенных на одном сервере? Пример: если веб-сервер может обрабатывать 5000 запросов, и есть два веб-сайта, размещенных на этом сервере, означает ли это, что его 5000 запросов на обоих веб-сайтах? –

2

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

1

из this article

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

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

1

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

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

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

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

Смежные вопросы