Запись в log4net FileAppender с несколькими проблемами производительности потоков

TickZoom является очень высокопроизводительным приложением, которое пользуется своей собственной библиотекой распараллеливания и несколькими потоками O/S для гладкого использования многоядерных компьютеров.

Приложение поражает узкое место, где пользователи должны записать информацию в LogAppender от отдельных потоков O/S.

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

Если MinimalLock отключен, log4net ошибки отчетов о файле, уже заблокированном другим процессом (поток).

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

Таким образом MinimalLock мог быть отключен для большого улучшения производительности входа.

Кроме того, приложение делает много ЦП интенсивная работа, таким образом, это также улучшит производительность для использования отдельного потока для записи в файл, таким образом, ЦП никогда не будет ожидать на вводе-выводе для завершения.

Таким образом, вопрос, log4net уже предлагает эту функцию? Если так, как дела включите поточную запись в файл? Есть ли другой, более усовершенствованный appender, возможно?

В противном случае затем, так как log4net уже перенесен в платформу, которая позволяет реализовать отдельный поток и очередь с этой целью в коде TickZoom.

С уважением, Wayne

Править:

Спасибо это кажется ответами, указывает на разработку нашего собственного решения как, возможно, расширение log4net в некотором роде. И они ясно показывают, что log4net не делает этого типа вещи.

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

Конечно, мы также используем log4net "нормальными" способами к отладке, предупреждениям и такому.

Но они больше похожи на "журналы транзакций", чем отладка или пользовательские журналы уведомления. Строго говоря, является ненужным для этих журналов быть непосредственно человекочитаемым. При необходимости какое-то "средство просмотра" может показать содержание в форме ASCII.

Таким образом, мы запланируем создание их, журнал типа транзакции записан в высокоскоростное двоичное устройство хранения данных.

Спасибо это кажется обоими из ответов ниже, было большими пошаговыми перемещениями к разработке нашего собственного решения.

7
задан Wayne 14 February 2013 в 17:37
поделиться

3 ответа

Log4net не поддерживает точно описанный вами сценарий. Однако он предлагает другие приложения, которые не блокируются, например приложение базы данных или приложение UDP. Вот несколько идей:

  1. Зарегистрируйте свои сообщения в очереди сообщений , а затем попросите читателя (или нескольких читателей) прочитать сообщения из очереди и написать их в журнал. Это обеспечивает надежный механизм для отправки / записи сообщений. Честно говоря, я не знаю, есть ли уже приложение MSMQ, но написать его самостоятельно не составит труда.

  2. Используйте приложение UDP для отправки сообщений , а затем напишите свою собственную службу , которая прослушивает эти сообщения и записывает их в файл.

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

7
ответ дан 6 December 2019 в 23:02
поделиться

Очень желательно избегать добавления ввода-вывода в целевые потоки, поэтому посылать сообщение в поток сборщика логов - хорошая идея. Я также иногда использую System::Diagnostics::Debug::WriteLine из целевого потока, чтобы выгрузить его вывод, но там все равно будет небольшая блокировка.

Конечно, добавление любого дополнительного протоколирования приведет к эффектам Гейзенберга, поэтому вам нужно как-то определить, когда эти эффекты пренебрежимо малы, а когда нет, чтобы иметь полезное протоколирование высокопроизводительных потоков.

Если вы хотите немного изощриться, можно сделать так, чтобы каждый поток сохранял свой собственный список сообщений, а затем выбрасывал его куда-нибудь после определенного количества итераций. Таким образом, данные будут полезны только в период времени до того, как какой-либо поток выполнит вход/выход для регистрации, но, возможно, вы сможете получить достаточно информации для отладки. Кроме того, вы получите забавную задачу объединения журналов отдельных потоков в единый журнал для анализа.

1
ответ дан 6 December 2019 в 23:02
поделиться

Посмотрите логгер The Object Guy - это высокопроизводительный, многопоточный безопасный логгер с возможностью асинхронного протоколирования, а также многими другими возможностями - довольно хороший, на мой взгляд - http://www.theobjectguy.com/DotNetLog/. Смотрите видео о многопоточности на этой странице.

3
ответ дан 6 December 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: