В фильтре ISAPI, что является хорошим подходом для общего файла журнала для нескольких процессов? - PullRequest
2 голосов
/ 02 октября 2009

У меня есть фильтр ISAPI, который работает на IIS6 или 7. Когда есть несколько рабочих процессов («Веб-сад»), фильтр будет загружен и запущен в каждом файле w3wp.exe.

Как эффективно разрешить фильтру регистрировать свои действия в одном консолидированном лог-файле?

  • сообщения журнала от разных (параллельных) процессов не должны мешать друг другу. Другими словами, одно сообщение журнала, отправляемое любым файлом w3wp.exe, должно быть реализовано в виде одной непрерывной строки в файле журнала.

  • должен быть минимальный конфликт для файла журнала. Веб-сайты могут обслуживать сотни запросов в секунду.

  • предпочтителен строгий порядок времени. Другими словами, если процесс # 1 w3wp.exe отправляет сообщение в момент времени t1, то процесс № 2 отправляет сообщение в момент времени t2, а процесс № 1 отправляет сообщение в момент времени t3, сообщения должны появляться в правильном порядке времени в файле журнала.

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

Некоторые идеи:

  • назначить один из w3wp.exe в качестве "владельца файла журнала" и отправить все сообщения журнала через этот специальный процесс. Это имеет проблемы в случае переработки рабочего процесса.

  • использовать мьютекс ОС для защиты доступа к файлу журнала. Это достаточно высокого качества? В этом случае каждый файл w3wp.exe будет иметь ФАЙЛ в одном и том же файле файловой системы. Должен ли я читать файл журнала после каждой записи? Будет ли это работать?

есть предложения?

Ответы [ 7 ]

2 голосов
/ 17 октября 2009

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

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

Итак, запустите другой процесс на том же компьютере (с более низким приоритетом?), Который фактически записывает сообщения журнала на диск. Обменивайтесь информацией с другим процессом, используя не UDP, как предлагается, а память, которую процессы совместно используют. Также известный, как запутанно, как отображенный файл памяти. Подробнее о отображенных в память файлах . В моей компании мы обнаружили, что отображаемые в память файлы намного быстрее, чем шлейф TCP / IP для связи по одному и тому же блоку, поэтому я предполагаю, что это будет быстрее, чем UDP.

То, что у вас есть в общей памяти, для начала может быть std :: queue, где push-и-pops защищены мьютексом. Ваши потоки ISAPI будут захватывать мьютекс, чтобы поместить вещи в очередь. Процесс регистрации будет захватывать мьютекс, чтобы вытаскивать вещи из очереди, освобождать мьютекс, а затем записывать записи на диск. Мьютекс защищен только обновлением совместно используемой памяти, а не обновлением файла, поэтому теоретически кажется, что мьютекс будет удерживаться в течение более короткого времени, создавая меньше узкого места.

Процесс регистрации может даже изменить порядок написания, чтобы привести в порядок метки времени.

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

Проблема со всем, что я здесь написал, заключается в том, что вся система - аппаратная часть, ОС, способ работы многоядерного кэш-памяти L1 / L2 ЦП, ваше программное обеспечение - слишком сложна, чтобы ее можно было легко предсказать, просто подумав. Создайте несколько простых приложений для проверки концепции, установите для них время и испытайте их на реальном оборудовании.

1 голос
/ 14 октября 2009

В прошлом я использовал систему журналирования на основе UDP, и я был доволен таким решением.

Журналы отправляются через UDP процессу сбора журналов, который отвечает за его регулярное сохранение в файл.

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

Надеюсь, это поможет.

1 голос
/ 02 октября 2009

Будет ли логирование здесь в базу данных?

0 голосов
/ 20 января 2010

Трассировка событий для Windows , включенная в Windows Vista и более поздние версии, предоставляет хорошую возможность для этого.

Выдержка:

Event Tracing for Windows (ETW) - это эффективная функция трассировки на уровне ядра, которая позволяет записывать события ядра или приложения в файл журнала. Вы можете использовать события в режиме реального времени или из файла журнала и использовать их для отладки приложения или определения проблем с производительностью в приложении.

0 голосов
/ 17 октября 2009

Вы можете продолжить запись в отдельные файлы и найти / написать инструмент для их объединения позже (возможно, автоматизированный, или вы можете просто запустить его в тот момент, когда вы хотите использовать файлы.)

0 голосов
/ 17 октября 2009

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

0 голосов
/ 17 октября 2009

Вместо ОС Mutex для управления доступом к файлу, вы можете просто использовать механизмы блокировки файлов Win32 с LockFile () и UnlockFile ().

...