Счетчики производительности для TPL? - PullRequest
6 голосов
/ 26 октября 2011

Есть ли способ узнать (желательно через встроенный счетчик производительности), сколько работы TPL поставил в очередь, через которую он пытается работать?

Вот некоторые подробности о том, что я пытаюсь сделать и что я вижу:

У меня большая рабочая нагрузка, которую я выгружаю в пул потоков .NET с помощью Task.Factory.StartNew () (планировщик по умолчанию). Когда нагрузка выше, чем может выдержать моя система, работа ставится в очередь до тех пор, пока либо нагрузка не уменьшится, либо мне не хватит памяти. Я обновляю пользовательский счетчик производительности (это счетчик в секунду) как часть моей обработки, и я вижу, что этот счетчик не превышает 27 000 (сообщений в секунду) независимо от того, сколько сообщений я в очереди Task.Factory.StartNew ().

Мой вопрос больше относится к мониторингу, чем к советам о том, как заставить систему работать лучше - я могу проводить микрооптимизацию, но на данный момент в счетчиках производительности нет никакой видимости, что работа налаживается. Помимо оптимизации, я хотел бы иметь возможность точно видеть, сколько работы TPL было забуферено, просто для того, чтобы я мог измерить отзывчивость моей системы. Я просматриваю, приведет ли добавление нового сообщения на стороне ввода к немедленной обработке (нулевая задержка) или будет некоторая задержка, прежде чем я увижу результаты моего запроса.

Что происходит сейчас, так это то, что ниже 27 000 сообщений в секунду, если я останавливаю ввод, я вижу, что счетчик «Сообщения, обработанные в секунду» падает до нуля. Выше этой критической точки счетчик некоторое время продолжает регистрировать 27 Кбит / с (в зависимости от того, как долго я позволил накопить резерв), пока остальная нагрузка не пройдет через систему.

1 Ответ

2 голосов
/ 10 ноября 2011

Я думаю, что проще всего было бы поддерживать другой счетчик перфектов, который вы увеличиваете по мере того, как каждая задача ставится в очередь и уменьшается при запуске каждой задачи.

Более сложный вариант - написать пользовательский TaskScheduler, который обрабатывает публикациювсе необходимые события, но опять же, я полагаю, что это может значительно замедлить ситуацию, если не будет реализовано тщательно, но это цена, которую вы платите за контрольно-измерительные приборы.Затем вы можете переключать используемый вами планировщик только тогда, когда вам нужны инструменты.

Вот статья о написании пользовательского TaskScheduler: http://msdn.microsoft.com/en-us/library/ee789351.aspx

Если вы написали это TaskScheduler реализация, хотя я думаю, что это было бы полезно для сообщества, поэтому, пожалуйста, опубликуйте результаты здесь и, возможно, разместите код на GitHub:)

...