Бен, это Данила - Solaris
Sep. 10th, 2009 05:44 pmПроблемы с записью в лог-файл на ZFS.
Убираю под кат. Мне не хватает базисного понимания процесса. Не связанным с профессией френдам приношу извинения. Завтра с утра еще в ру_рут закину, наверное.
Есть некий модуль, который обрабатывает события и пишет error-лог в случае, если что-то не так.
Пока модуль крутился на машине, которая держала логи на NFS, мы не чаяли беды.
Сейчас модуль крутится на последнем релизе Соляриса. Файловая система - ZFS, mirror на два диска.
События в лог пишутся не сразу, а по факту накопления некоторого количества событий. Хуже того, если штатно погасить модуль, послав ему предписанный SIGTERM, ошибки, которые произошли (их можно спровоцировать), но еще не записались в лог - пропадают.
Выглядит это как некорректная работа кэша, хотя аналогия, конечно, враг решения.
На этом мысль останавливается. Я повесила мониторинг ошибок в системных вызовах скриптиком из DTraceKit - все в порядке, да и, мне кажется. так и должно быть, поскольку на другой файловой системе все работает нормально.
Я правильно понимаю, что системный вызов write записывает куда дают (то есть по умолчанию в кэш файловой системы) и умывает руки? То есть если что и мониторить, то это zfs? Но что именно? У меня огромный провал в этом месте, и я поблагодарю за любой хинт. А если удастся что починить - расскажу.
Убираю под кат. Мне не хватает базисного понимания процесса. Не связанным с профессией френдам приношу извинения. Завтра с утра еще в ру_рут закину, наверное.
Есть некий модуль, который обрабатывает события и пишет error-лог в случае, если что-то не так.
Пока модуль крутился на машине, которая держала логи на NFS, мы не чаяли беды.
Сейчас модуль крутится на последнем релизе Соляриса. Файловая система - ZFS, mirror на два диска.
События в лог пишутся не сразу, а по факту накопления некоторого количества событий. Хуже того, если штатно погасить модуль, послав ему предписанный SIGTERM, ошибки, которые произошли (их можно спровоцировать), но еще не записались в лог - пропадают.
Выглядит это как некорректная работа кэша, хотя аналогия, конечно, враг решения.
На этом мысль останавливается. Я повесила мониторинг ошибок в системных вызовах скриптиком из DTraceKit - все в порядке, да и, мне кажется. так и должно быть, поскольку на другой файловой системе все работает нормально.
Я правильно понимаю, что системный вызов write записывает куда дают (то есть по умолчанию в кэш файловой системы) и умывает руки? То есть если что и мониторить, то это zfs? Но что именно? У меня огромный провал в этом месте, и я поблагодарю за любой хинт. А если удастся что починить - расскажу.
no subject
Date: 2009-09-10 04:28 pm (UTC)fsync() делается после write()? Какие опции у open()? O_DSYNC, O_SYNC?
Хочу предупредить, правда - я имел очень и очень серьезные проблемы с msync() на ZFS, latency там получается даже под не очень большой нагрузкой раз в 10 выше, чем на UFS, в итоге мы все попытки использовать ZFS для активной random-access записи отложили до лучших времен. С другой стороны, это всего один лог-файл, не так уж и страшно.
no subject
Date: 2009-09-10 05:13 pm (UTC)no subject
Date: 2009-09-10 06:23 pm (UTC)no subject
Date: 2009-09-10 06:31 pm (UTC)no subject
Date: 2009-09-10 08:37 pm (UTC)Может, этому zfs-у размер блока зарезать по самое не могу? ;)
no subject
Date: 2009-09-11 07:41 am (UTC)Вопрос пока не в том, как это правильно написать, а как отлоовить, где работает неправильно, ты же понимаешь.
no subject
Date: 2009-09-11 07:43 am (UTC)no subject
Date: 2009-09-11 07:50 am (UTC)no subject
Date: 2009-09-11 08:08 am (UTC)к тому же, ну ты же понимаешь, давать советы, которые я толком сама не понимаю, я не рискну... попробую посмотреть, вызывает ли модуль fsync вообще.
no subject
Date: 2009-09-11 10:37 am (UTC)(большая все-таки польза от таких разговоров мне :) я серьезно. спасибо.)
no subject
Date: 2009-09-11 10:37 am (UTC)no subject
Date: 2009-09-11 11:17 am (UTC)Вот у тебя надо изменить блок. Ну, дописать например туда. Как я понимаю ZFS, она дуплит исходный блок и начинает измываться над дублем блока. Тут софту приходит сигтерм. По чистой логке (он же не сигкилл) софт должен скинуть буфера в FS, почистить потоки и закрыть транзакцию. FS должна засинхрить данные на диск и закоммитить блок. (то есть сказать, что этот файл "готов к использованию с новым содержимым") Чего-то из этого не происходит. Надо выяснять почему.
Потом FS видит грязный файл, выцепляет из него новый блок, подцепляет старый и ставит флажочек "чисто". Транзакция откачена. Нужные тебе данные тоже в принципе лежат на диске, но этот блок уже давно перераспределён обратно в "свободные".
Это как я понимаю механику ZFS... Может, и неправильно.