HttpClient Скорость передачи Медленная - PullRequest
0 голосов
/ 22 февраля 2019

Я запутался с пропускной способностью команды HttpClient.PostAsync() или HttpSelfHostServer сервера.Попытка разместить файл размером 500 МБ в локальной сети кажется медленной, но я не уверен, что это ожидаемое поведение, или мне следует заняться чем-то другим.Все небольшие запросы выполняются менее чем за секунду, поэтому я не беспокоился о них в данный момент.

Итак, чтобы перейти к этой проблеме, у меня есть два раздела кода, которые я рассчитал и нашел длябыть моим узким местом:

Клиент с использованием HttpClient.PostAsync()

private async Task<Stream> PostContentAsync(...)
{
    using (var formData = new MultipartFormDataContent())
    {
        // stream is a MemoryStream object with a Length of 524288000
        formData.Add(new StreamContent(stream), "file", fileName);
        formData.Add(new StringContent(DateTime.Now.ToString()), "UploadStart");
        var response = await client.PostAsync(uriEndpoint, formData);

Сервер контроллер работает на HttpSelfHostServer

[HttpPost]
public async Task<HttpResponseMessage> ProcessUpload(...)
{
    // record the time as soon as the request is received
    var BeginRequest = DateTime.Now;
    // custom parsing of form content
    var requestForm = await GetFormContentAsync(Request);
    var uploadStartString = await requestForm["UploadStart"]?.ToStringAsync() ?? "N/A";
    if (DateTime.TryParse(uploadStartString, out DateTime uploadStart))
    {
        var uploadTime = BeginRequest.Subtract(uploadStart);
        Console.WriteLine($"Client took {uploadTime.ToString("c")} to connect");
    }

Что касается вывода, то при публикации файла размером 500 МБ с сервера я вижу такие времена:

Клиенту потребовалось 00: 00: 49.7152052 для подключения

IsЕсть ли причина, по которой он публикует только ~ 10 МБ / с?Вся эта связь происходит между компьютерами в одной сети, поэтому максимальная пропускная способность сети должна составлять 1,25 ГБ / с (кабели CAT-6 между всеми серверами / коммутаторами).

Я особенно удивлен местнымитесты не работают быстрее (я запускал сервер и клиент на одной машине и достигал одинаковых результатов).Есть ли предел передачи данных на HttpClient.PostAsync()?Или это проблема с настройкой хоста?Хотите знать, как я диагностирую это дальше / если кто-то еще имел эту проблему раньше.Есть ли что-то, что происходит между этими двумя событиями, на которые я должен обратить внимание?

Самая большая проблема с этим заключается в том, что эти записи представляют собой только фрагменты размером 500 МБ различных файлов размером более 100 ГБ на многих серверах как часть данных.процесс, и это ~ 50 секунд на кусок занимает слишком много времени.Будет ли работать их параллельно, если некоторые конечные серверы находятся на одной физической машине?Я пытался осмотреться, чтобы узнать больше информации об этих чрезвычайно медленных скоростях передачи, но пока не нашел ничего, что бы работало.

Примечание: - Я пытался включитьи отключение AutomaticDecompression и UseProxy ложно.HttpClient создается один раз и повторно используется для всех клиентских публикаций во время процесса, который удаляет его по завершении.


Редактировать: Похоже на установку TransferMode = System.ServiceModel.TransferMode.Streamed; для HttpSelfHostConfiguration на стороне сервера заставили нас пройти через большое «ожидание».Теперь у меня есть новое узкое место, чтение входящего потока.Само чтение кажется медленнее, чем то, что может быть достигнутоПозже рассмотрим другие (потенциально более быстрые) способы чтения формы.В настоящее время это то, что блокирует:

private async Task<Dictionary<string, RequestData>> GetFormContentAsync(HttpRequestMessage request)
{
    try
    {
        var timer = new Stopwatch();
        timer.Start();
        Console.WriteLine($"- Reading content stream");
        var provider = await request.Content.ReadAsMultipartAsync();
        timer.Stop();
        Console.WriteLine($"- Took {timer.Elapsed.ToString("c")} to ReadAsMultipart");
  • Чтение потока контента
  • Взял 00: 00: 25.4309885 для ReadAsMultipart
...