У меня есть следующий код для индексации документов в ElasticSearch и я хочу посмотреть, что занимает больше всего времени.
private void DoIndex(IEnumerable<TDocument> documents, LanguageCode languageCode, ElasticSettings elasticSettings, string indexName, List<Exception> errors)
{
var waitHandle = new CountdownEvent(1);
var bulkAll = ElasticClient.BulkAll(Project(documents, languageCode), b => b
.BackOffRetries(elasticSettings.BulkBackOffRetries)
.BackOffTime(elasticSettings.BulkBackOffTime)
.RefreshOnCompleted()
.MaxDegreeOfParallelism(elasticSettings.BulkThreadCount)
.Refresh(Refresh.False)
.Size(500)
.Index(indexName));
bulkAll.Subscribe(new BulkAllObserver(
onError: exception =>
{
errors.Add(exception);
Log.Error(exception, "ES indexing failed for batch.");
},
onCompleted: () => waitHandle.Signal(),
onNext: response =>
{
Logger.Log($"Processed {response.Page * 500} documents");
}));
waitHandle.Wait(CancellationToken);
}
Когда я присоединяю профилировщик (в моем случае dotTrace), я вижу, что 99%время тратится внутри функции Wait
моего кода.В некоторой степени это понятно, поскольку именно здесь мой код ожидает завершения, но мне очень трудно выяснить, куда уходит все мое время.
Потоки ожидают почти 100%, я не вижу никакой активности: