Слишком большая разница во времени между получением ответа от сервера и записью его в журнал при чтении файла из Google Cloud Storage с использованием HttpClient

Мне нужно загрузить несколько файлов из GCS. Для этого я использовал код

public class GCSStorage 
{
    static HttpClient httpClient;
    static GoogleCredential credential = GoogleCredential.FromFile(ConfigurationManager.AppSettings["GCPCredentials"]);
    if (credential.IsCreateScopedRequired)
    {
        credential = credential.CreateScoped(new[]
        {
           "https://www.googleapis.com/auth/devstorage.read_only"

        });
        httpClient = new Google.Apis.Http.HttpClientFactory()
                        .CreateHttpClient(
                        new Google.Apis.Http.CreateHttpClientArgs()
                        {
                            ApplicationName = "",
                            GZipEnabled = true,
                            Initializers = { credential },
                        });
        httpClient.Timeout = new TimeSpan(0, 0, 5);
    }

    public string ReadObjectData(string bucketName, string location)
    {
        string responseBody = "";
        bool isFetched = false;
        try
        {
            Stopwatch sw = new Stopwatch();
            string pathcode = System.Web.HttpUtility.UrlEncode(location);
            UriBuilder uri = new UriBuilder(string.Format(googleStorageApi, bucketName, pathcode));
            sw.Start();
            var httpResponseMessage = httpClient.GetAsync(uri.Uri).Result;
            var t = sw.ElapsedMilliseconds;
            if (httpResponseMessage.StatusCode == HttpStatusCode.OK)
            {
                responseBody = httpResponseMessage.Content.ReadAsStringAsync().Result;
                log.Info($"Read file from location : {location} in Get() time : {t} ms , ReadAsString time :  {sw.ElapsedMilliseconds - t} ms, Total time : {sw.ElapsedMilliseconds} ms");
            }
            isFetched = true;
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return responseBody;
    }
}

И назвал это для нескольких файлов, используя

GCSStorage gcs = new GCSStorage();
ParallelOptions option = new ParallelOptions { MaxDegreeOfParallelism = options };
    Parallel.ForEach(myFiles, option, ri =>
    {
        text = gcs.ReadObjectData(bucket, ri); ;
    });

Я записываю время, затраченное на загрузку каждого отдельного файла в ReadObjectData (). Когда я загружаю файлы с помощью MaxDegreeOfParallelism как 1, каждый файл загружается примерно в 100-150 мс. Но когда я изменяю MaxDegreeOfParallelism до 50, время изменяется от 1-3 до. Я загружаю кучу из 50 файлов.

Я понятия не имею, почему это происходит. Может ли кто-нибудь помочь мне понять это поведение.

Кроме того, я попытался сделать то же самое с Amazon S3. S3 дает постоянное время загрузки 50-100 мс в обоих сценариях.

Я профилировал ответ GCS с помощью скрипача. Для запросов, которые занимают время (~> 200 мс ), Общее Истекшее составляет около 100-200 мс, но время для записи журнала намного выше. Для других это точно в одно и то же время. Почему вовремя было бы так много разницы по времени ч / б некоторые из запросов?

Статистика Fiddler

Request Count:   1
Bytes Sent:      439        (headers:439; body:0)
Bytes Received:  7,759      (headers:609; body:7,150)

ACTUAL PERFORMANCE
--------------
ClientConnected:    18:03:35.137
ClientBeginRequest: 18:04:13.606
GotRequestHeaders:  18:04:13.606
ClientDoneRequest:  18:04:13.606
Determine Gateway:  0ms
DNS Lookup:         0ms
TCP/IP Connect: 0ms
HTTPS Handshake:    0ms
ServerConnected:    18:03:35.152
FiddlerBeginRequest:    18:04:13.606
ServerGotRequest:   18:04:13.606
ServerBeginResponse:    18:04:13.700
GotResponseHeaders: 18:04:13.700
ServerDoneResponse: 18:04:13.700
ClientBeginResponse:    18:04:13.700
ClientDoneResponse: 18:04:13.700

    Overall Elapsed:    0:00:00.093

Журнальный файл

INFO  2018-08-25 18:04:13,606 41781ms GCSStorage ReadObjectData -  Get() time : 114 ms 
INFO  2018-08-25 18:04:14,512 42688ms GCSStorage ReadObjectData -  Get() time : 902 ms 

Я мог видеть, что

LogTime - ClientDoneResponse + Overall Elapsed is approximately equal to Total Time
18:04:14.512 - 18:04:13.700 + 0:00:00.093 = 905 ms

Почему существует так много разницы во времени, ч / б получает ответ от сервера и записывает его в журнал?

c#,google-cloud-storage,

0

Ответов: 1


0

Когда вы выполняете параллельное программирование, с несколькими потоками вам нужно иметь в виду несколько вещей. Прежде всего, правда, что параллелизм улучшает производительность, но не то, что бесконечные параллелимы лучше, чем последовательные. Существует много причин для этого. Во-первых, вы ограничены количеством ваших физических ядер, а также гиперпотоками в вашей ОС. Например, если у вас есть 8 ядер, лучшая производительность, которую вы получите, состоит из 8 потоков, если также включена гиперпоточность, то может быть, что с 16 потоками вы получите хорошую производительность.

В вашем примере изменение количества потоков от 1 до 50 - это слишком много. Попробуйте это по шагам, 2, 4, 6, 8, 10 и посмотрите, когда вы получите лучшую производительность (запишите время, как вы это делали до сих пор).

Это число является лучшим числом для вашего параллелизма.

C #, Google-облако хранения,
Похожие вопросы
Яндекс.Метрика