Как мне профилировать WaitHandle? - PullRequest
0 голосов
/ 04 июля 2019

У меня есть следующий код для индексации документов в 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%, я не вижу никакой активности: The threads are waiting for almost 100% enter image description here enter image description here enter image description here

...