Состояние сеанса ASP.NET SQL Server чрезвычайно медленное
У меня проблемы с приложением ASP.NET, которое мне нужно для веб-фермы, однако простой вход в приложение занимает около 15 секунд.
Я провел небольшой эксперимент, в котором я создал версию приложения без веб-фермы, а затем использовал состояние сеанса INPROC, и время входа в систему мгновенно. В этом тестовом экземпляре я запускаю SQL Express на той же машине.
Я знаю, что состояние сеанса на SQL-сервере медленнее, но никоим образом не должно быть ЭТОГО медленнее. Любые предложения о том, как отследить проблему?
Это мое состояние сеанса:
<sessionState mode="SQLServer" timeout="60" sqlConnectionString="Data Source=localhost;Integrated Security=SSPI;" sqlCommandTimeout="30" cookieless="false" useHostingIdentity="False" regenerateExpiredSessionId="True" />
Я пробовал использовать как имя пользователя, так и встроенную защиту.
2 ответа
Ваш вопрос охватывает широкую область -
- Код: То, что вы вкладываете в сессию, имеет большое значение. Если вы храните большие двоичные объекты и т. Д., Сериализация / десериализация происходит каждый раз, когда данные сеанса сохраняются и считываются из базы данных. Можете ли вы проанализировать сохраняемые данные и попытаться определить средний размер? Я видел бизнес-приложения, хранящие данные от 1 МБ до 2 МБ на сервере sql с тысячами подключенных пользователей, но тогда базовое оборудование было достаточно способным для поддержки пропускной способности.
- Инфраструктура. Сколько оперативной памяти у вас на компьютере? Можете ли вы попробовать запустить трассировку sql в вашей базе данных aspstate, чтобы увидеть, сколько подключений приходит и сколько времени требуется для выполнения запроса? Возможно, проблема не в стороне базы данных, а в том, что ваше приложение пытается что-то сделать при хранении информации о сеансе.
Хранилище сеансов SQL Server не такое медленное, на моей машине с 8-гигабайтным ОЗУ и приложением asp.net, работающим в Visual Studio (IIS Express), требуется всего лишь секунда для подключения и запуска приложения.
Реляционные базы данных являются атомарными (ACID), поэтому дают довольно низкую производительность, когда все используют одну и ту же таблицу (ASPStateTempSessions).
У нас была та же проблема, что и при использовании режима SessionState, вместо этого мы запустили службу состояния ASPNet на балансировщике нагрузки и использовали ее. Намного лучше пропускная способность.
<sessionState mode="StateServer" stateConnectionString="tcpip=localhost:42424" cookieless="false" timeout="60" />
Лучшее, что вы можете сделать (если ваше приложение позволяет), - это полностью отказаться от серверной части хранилища сеансов. Если данные сеанса вписываются в сами заголовки HTTP (что обычно так), вы можете их закодировать и перемещать туда и обратно с самими запросами в виде файлов cookie.
Кроме того, большинство реализаций провайдера состояния сеанса "блокируют", поэтому вы не можете иметь одновременные запросы для одного и того же сеанса, что превращается в огромное узкое место.
Эта статья указывает на поставщика состояний сеанса на основе JWT:
http://www.drupalonwindows.com/en/content/aspnet-session-state-scaling-and-performance-issues