Мне нужно загрузить несколько файлов из 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
Почему существует так много разницы во времени, ч / б получает ответ от сервера и записывает его в журнал?