Проблема с производительностью процессора NLog - PullRequest
8 голосов
/ 22 февраля 2011

У меня проблема с этим методом в библиотеке NLog: NLog.Targets.Wrappers.AsyncTargetWrapper.ProcessPendingEvents(object state)

Это занимает слишком много процессорного времени.У меня давно работает служба Windows, использующая Nlog, и через два дня мой сервис потребляет более 80% процессорного времени (одно ядро ​​почти на 80%, второе на 30%).Это не 100% процессорного времени, но оно меняется и примерно через 2 часа его нормализуется.Итак, я запустил профилировщик, и этот метод может быть причиной этого: NLog.Targets.Wrappers.AsyncTargetWrapper.ProcessPendingEvents (состояние объекта)

У меня есть 10 файловых целей, все они установлены как асинхронные.Это факт, что у меня есть много журналов в моем приложении, но только на уровне Trace, если я переключился на уровень Info, это не помогло.

Можете ли вы помочь мне, я должен уменьшить регистрацию в моем приложении?

Ответы [ 3 ]

5 голосов
/ 02 марта 2011

В соответствии с этим потоком, я бы также предположил, что установка большего числа для timeToSleepBetweenBatches должна сократить время процессора.Похоже, что бета-версия 2.0 NLog должна исправить это поведение, если одновременно запускается только один ленивый поток записи.

Тем временем вам не нужно изменять исходный код для изменения timeToSleepBetweenBatches .Вы можете установить его в файле конфигурации :

<targets>
  <target xsi:type="AsyncWrapper"
          name="String"
          queueLimit="Integer"
          timeToSleepBetweenBatches="Integer"
          batchSize="Integer"
          overflowAction="Enum">
    <target xsi:type="wrappedTargetType" ...target properties... />
  </target>
</targets>

Параметры буферизации
timeToSleepBetweenBatches - Время в миллисекундах доперерыв между партиями. По умолчанию: 50

2 голосов
/ 24 февраля 2011

Я кратко изучил источники.Мое предположение:

попробуйте изменить ctor AsyncTargetWrapper (wrappedTarget, queueLimit, overflowAction) ...

this.TimeToSleepBetweenBatches = 50;

на что-то менее частое:

this.TimeToSleepBetweenBatches = 1000;

, поэтому внутренний таймер не будет срабатывать каждые 50 мс !

0 голосов
/ 18 января 2013

Я предлагаю использовать BufferingWrapper, таймер запускается только когда что-то регистрируется, а не каждые 50 мс.Даже если ничего не зарегистрировано.

Обновление NLog ver.4.6 теперь использует timeToSleepBetweenBatches = 1, где он запускает событие таймера, только если что-то записано.

...