Ответ 1
1) Что заставляет вас думать, что это управление потоком TCP, в отличие от SQL Server, который не создает данные в промежутках, где нет трафика? Проверьте, есть ли sys.dm_exec_requests
для параметра wait_type. Типы ожидания описаны в Ожидания и очереди. Если клиент действительно использует управление потоком TCP, то вы увидите тип ожидания ASYNC_NETWORK_IO
.
2) Если проблема действительно является типом ожидания сети, то решение не должно увеличивать пропускную способность, но, очевидно, для уменьшения трафика. У клиента нет бизнеса, требующего так много данных с сервера, чтобы вызвать управление потоком TCP. Это может быть вызвано тем, что на клиенте делаются ужасно неправильные вещи, например, подсчет строк или подкачки на стороне клиента. Переместите обработку на сервере и просто получите небольшие наборы результатов с необходимыми данными.
Edit
Потребление набора результатов вызова БД в конечном итоге сводится к той или иной форме:
FetchNextRow
while (not EnfOfResults)
{
ProcessRow;
FetchNextRow;
}
Что это может означать, в реальном выражении это может быть foreach row in IQueryable
или SqlDataReader.Read()
. Но основная идея такая же, что клиент извлекает строки из результата, обрабатывает их, а затем получает еще несколько строк. Если клиентский код делает что-либо в этом ProcessRow
, который блокирует, тогда код клиента не достигнет точки, где он снова извлекает следующую строку, и, таким образом, в конечном итоге вызовет управление потоком TCP, что, в свою очередь, заставит SQL Server приостановить запрос (так как нет смысла записывать результаты). Вы ничего не можете сделать с точки зрения TCP, чтобы сделать это лучше. Увеличение размера окна может на самом деле сделать матчи хуже, так как теперь все те результаты, которые ранее были подавлены в источнике (БД), будут созданы и должны быть где-то сохранены, что в конечном итоге означает живую память, выделенную для хранения, и может сделать вещи далеко хуже, чем сейчас.
Если бы я был в вашей обуви прямо сейчас, я бы сосредоточился на определении того, где происходит эта блокировка ProcessRow
. Гипотеза, которую я выдвинул, заключалась в том, что эта обработка будет представлять собой запись MVC View в буфер ответа и, в свою очередь, блокируется управлением потоком TCP, в результате чего пользовательский агент не потребляет HTTP-ответ (например, Ajax-вызов завершен, но браузер не работает код завершения, чтобы потреблять ответ, потому что основной поток зацикливается на чем-то другом). Как всегда, наилучшим подходом является методическая оценка. Некоторые возможные инструменты:
- Посмотрите счетчики производительности ASP.Net.
- Придумайте свой код с помощью собственных счетчиков производительности (гораздо проще, чем думает большинство разработчиков, см. Использование XSLT для генерации кода счетчиков производительности)
- Неинвазивные выборочные показатели производительности, см. Быстрый профилирование веб-сайта с помощью VSPerfASPNETCmd