LINUX.ORG.RU
ФорумAdmin

mdadm and scsi wce bit enabled (Write Cache Enable)

 , ,


0

1

Привет.

Имеется сервер, в него через hba подключен ряд дисков. Никаких батареек не используется, сервер также подключен без ups. Из дисков собран программный mdadm raid массив.

Правильно понимаю, что в таком случае на всех дисках нужно повыключать встроенный writeback cache? Имеется ввиду WCE bit в SCSI caching mode page диска:

# sginfo -c /dev/sdX |grep ^W
Write Cache Enabled 

Т.е. в текущей ситуации, когда кэш диска включен, SCSI WRITE может вернуть «ok» верхнему уровню до того, как переданные данные фактически запишутся. И поэтому будет возможна ситуация после потери питания, когда по metadat'е mdadm часть данных будет считаться синхронизированной и чистой, а фактически будет не так.

Но почему в таком случае writeback cache на дисках всегда по умолчанию включен, ведь чаще не используют никакого резервного питания, чем наоборт. А когда используют, тогда и включают все возможные кэши. Или я что-то неправильно понял и mdadm использует какой-то механизм для работы в обход дискового кэша?



Последнее исправление: uuborn (всего исправлений: 1)

Но почему в таком случае writeback cache на дисках всегда по умолчанию включен

Не всегда

anonymous
()

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

Почему Вы так решили? Диски у Вас в чем стоят? JBOD-корзине?

И поэтому будет возможна ситуация после потери питания, когда по metadat'е mdadm часть данных будет считаться синхронизированной и чистой, а фактически будет не так.

Если сервер у Вас без резервного питания, то такие «мелочи» Вас тем более волновать не должны - кеши файловой системы и mdadm-массива все равно пропадут при потере питания...

Serge10 ★★★★★
()
Ответ на: комментарий от Serge10

Почему Вы так решили?

Смотря что иметь ввиду под резервным питанием. Конечно у сервера 2 блока питания подключенных в разные лучи в стойке, и конечно владелец ЦОД резервирует питание. Но проблемы с питанием в конкретной стойке все равно могут случиться по неподкотрольным владельцу сервера причинам.

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

В случае, если использовать аппаратный raid контроллер с батарейкой, то чтобы не случилось все данные все равно до дисков дойдут(если включить только кэш контроллера, но не дисков).

Зачем тогда вообще использовать батарейку в raid контроллере, если можно всегда полагаться на резервное питание ЦОДа?

Диски у Вас в чем стоят? JBOD-корзине?

По разному, да и без разницы. Возьмем для примера случай, когда диски локально в сервере, подключенные к системе через hba.

Если сервер у Вас без резервного питания, то такие «мелочи» Вас тем более волновать не должны - кеши файловой системы и mdadm-массива все равно пропадут при потере питания...

А вот тут поподробнее. О каком кэше mdadm идет речь? Только direct write операции: «ok» на верхний уровень только после того, как данные на диске (или в кэше диска).

Все нормальные файловые системы имеют журналирование. Данные записанные по журналу будут и на диске (если не экспериментировать с data=writeback). Потеряются только данные, которые 'зависли' между двумя sync'ами. Сама фс при этом не покрэшится, будет валидной и дальше продолжит работать.

А вот с кэшем диска потенциально возможна ситуация, когда fs/mdadm будут думать, что все впорядке, а данные на самом деле попортятся.

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

uuborn
() автор топика
Ответ на: комментарий от anonymous

Не всегда

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

uuborn
() автор топика
Ответ на: комментарий от uuborn

Кэш на запись на дисках по дефолту включен, потому что есть несколько механизмов сделать его безопасным: 1. ОС может отдать команду FLUSH CACHE и диск сбросит все данные из кэша на диск 2. При пропадании питания привод шпинделя переходит из режима мотора в режим генератора, а HDD, пока есть энергия от вращающихся блинов занимается двумя вещами: сбрасывает весь кэш в специальную область, предназначенную для этого и паркует головки. (по этому пункту пруфов не будет, самому захотелось прочесть подробнее о том, чем занят hdd при пропадании питания, но годных статей не нашел).

larrabee
()
Ответ на: комментарий от uuborn

Конечно у сервера 2 блока питания подключенных в разные лучи в стойке, и конечно владелец ЦОД резервирует питание.

Зачем тогда вводить других читателей форума в заблуждение и писать про отсутствие резервного питания?

В случае, если использовать аппаратный raid контроллер с батарейкой, то чтобы не случилось все данные все равно до дисков дойдут(если включить только кэш контроллера, но не дисков).
Зачем тогда вообще использовать батарейку в raid контроллере, если можно всегда полагаться на резервное питание ЦОДа?

Потому что есть принципиальная разница между аппаратным raid-контроллером и mdadm. В первом случае программа, обсчитывающая raid-массив, крутится на процессоре контроллера в его памяти. Батарейка (сейчас скорее флеш) защищает именно эту память от сбоя по питанию. В случае mdadm все крутится в оперативной памяти сервера. И здесь роль батарейки действительно UPS выполняет. Иными словами, аппаратный raid всегда обеспечивает большую защиту, чем программный.

По разному, да и без разницы.

Разница есть - многие корзины сами резервируют питание ;).

Возьмем для примера случай, когда диски локально в сервере, подключенные к системе через hba.

Если выполняется условие, написанное вначале Вашего сообщения (ЦОД резервирует питание, сервер имеет избыточные блоки питания, подключенные к независимым линиям), то можете не отключать кеш дисков - он защищен точно также, как и кеш массива. В принципе, если ничего не зарезервировано, тоже можете не отключать - по тем же соображениям.

А вот тут поподробнее. О каком кэше mdadm идет речь?

Речь идет о так называемой проблеме raid hole. mdadm - это просто софт, реализующий алгоритмы raid. И манипуляции данными перед их записью на диски идут в RAM сервера. Соответственно, при пропадании питания эта порция данных теряется со всеми вытекающими последствиями.

Впрочем, относительно недавно эту проблему решили, введя в mdadm журналирование операций записи на массив.

Так что, если Вы используете данную фичу (доступна, начиная с ядра 4.5), то да, отключение кеша дисков имеет смысл.

Все нормальные файловые системы имеют журналирование.

Этого мало. Нужно еще, чтобы сам массив имел журналирование (см. выше).

Serge10 ★★★★★
()
Ответ на: комментарий от Serge10

Потому что есть принципиальная разница между аппаратным raid-контроллером и mdadm. В первом случае программа, обсчитывающая raid-массив, крутится на процессоре контроллера в его памяти. Батарейка (сейчас скорее флеш) защищает именно эту память от сбоя по питанию. В случае mdadm все крутится в оперативной памяти сервера. И здесь роль батарейки действительно UPS выполняет. Иными словами, аппаратный raid всегда обеспечивает большую защиту, чем программный.

Не правда, батарейка на рейд контроллере нужна только при использовании writeback кэша RAID контроллера, а у mdadm writeback кэша нету (его можно сделать другими инструментами), а значит все, что mdadm пишет пишется сразу на диск (или в кэш самого диска). Исчезновение питания для mdadm не страшно и не должно побить данные.

Другое дело, что в лине есть системный writeback кэш, который работает на уровне файловой системы. Именно поэтому все приложения, которые заботятся о консистентности данных, например БД, открывают файлы с опцией O_DIRECT

larrabee
()
Ответ на: комментарий от larrabee

Не правда, батарейка на рейд контроллере нужна только при использовании writeback кэша RAID контроллера

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

а у mdadm writeback кэша нету (его можно сделать другими инструментами), а значит все, что mdadm пишет пишется сразу на диск (или в кэш самого диска).

А вот это не совсем верно. Читайте статью, ссылку на которую я приводил выше - журналирование массивов не просто так придумали.

Другое дело, что в лине есть системный writeback кэш, который работает на уровне файловой системы.

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

Serge10 ★★★★★
()
Ответ на: комментарий от Serge10

А вот это не совсем верно. Читайте статью, ссылку на которую я приводил выше - журналирование массивов не просто так придумали.

Спасибо, почитал, интересная инфа, не знал.

larrabee
()
Ответ на: комментарий от Serge10

Зачем тогда вводить других читателей форума в заблуждение и >писать про отсутствие резервного питания?

Да, не совсем правильно выразил мысль. Изначально имелось ввиду отсутствие дополнительной резервации (например описанные вами jbod-корзины с встроенным резервным питанием), кроме той, что используется в ЦОДе.

Речь идет о так называемой проблеме raid hole.Впрочем, >относительно недавно эту проблему решили, введя в mdadm >журналирование операций записи на массив.

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

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

Для простоты предлагаю рассматривать RAID10 в контексте данного топика.

то можете не отключать кеш дисков - он защищен точно также, как и кеш массива.

Не также, речь про случай, когда writeback кэш в массиве не используется, про остальное написано выше.

Иными словами, аппаратный raid всегда обеспечивает большую защиту, чем программный.

Зависит от вендора и технологий, кооторые он использует. Журналирование, да, для частного случая безопасности добавит.

Этого мало. Нужно еще, чтобы сам массив имел журналирование (см. выше).

Имеет значение только в частном случае, описанном выше.

uuborn
() автор топика
Ответ на: комментарий от larrabee

ОС может отдать команду FLUSH CACHE и диск сбросит все данные из кэша на диск

Вот, изначально это и интересовало. Использует ли mdadm SYNCHRONIZE CACHE по какому-либо алгоритму и помечает отдельно где-либо, что сброшено, а что нет? В документации вроде не описано и области под это дело в metadat'е не выделено (для помечания не сброшенных на диск данных SYNCHRONIZE CACH'ом).

2. При пропадании питания привод шпинделя переходит из режима мотора в режим генератора, а HDD, пока есть энергия от вращающихся блинов занимается двумя вещами: сбрасывает весь кэш в специальную область, предназначенную для этого и паркует головки

Если эта схема работает в современных дисках, то она бы все объясняла. Правда под этот случай не попадают ssd диски.

Хотя нашел: http://www.tomsitpro.com/articles/hgst-ultrastar-c15k600-hdd,2-906-3.html

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

uuborn
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.