Re: write-back cache в дисках и целостность данных
Ты серьезно считаешь, что тебе в этом форуме кто-то квалифицированно ответит на твой вопрос?
На самом деле я надеюсь, что кто-нибудь проведёт аналогичный эксперимент с другими ОС/железом.
Вот например, на Sun Ultra 10 стоит вроде бы обычный IDE от Seagate. Так там этот кеш по умолчанию выключен. Субъективно - дисковая подсистема в несколько раз тормознее, чем похожий Seagate в PC (тоже с выключенным кешом). Возможно, этот эффект как-то связан со слухами, что IDE-диски от Seagate в любом случае включают кеш, если считают нагрузку достаточно большой (чтоб результаты бенчмарков лучше выглядели, а Sun могли попросить эту "фичу" отключить - но это уже дикие спекуляции).
Linux 2.4.21-pre4-ac7
Software RAID1
2*(IBM IC35L030AVER07-0, 7200 RPM)
Write cache:
off 6892 RPM
on 175073 RPM
Теория полностью согласуется с практикой.
> Однако сегодня попробовал запустить на FreeBSD со сказей (это shire) и увидел такое же
> нереально большое значение, в противоположность заявлению из tuning(7).
> Где же правда?
Просмотрел tuning(7) на shire. Про scsi write caching я там ничего не нашёл.
У scsi дисков вообще write caching настраивается? Или заранее предполагается его отсутствие?
Там написано, юзайте SCSI, и всё у вас будет мягкое и шелковистое
> У scsi дисков вообще write caching настраивается? Или заранее предполагается его отсутствие?
Вроде бы настраивается, но скорее у контроллеров, чем у дисков. Дорогие это игрушки, я с ними почти не сталкивался.
> используется кеш, который позволяет аппаратуре переупорядочивать
> операции записи, добиваясь оптимальной производительности.
Это нe write-back. Это Tagged Queueing. Он работает на всех современных SCSI дисках, а также на последних IDE от IBM.
write-back на SCSI дисках конфигурится в BIOS контроллера, и по умолчанию отключен, тк в условиях возможной потери питания
является опасным. Кстати говоря на shire он отключен. Идея write-back
более проста чем TQ - контроллер просто кэширует данные, которые следует записать на диск в своей памяти. (последнее - моё imho, могу ошибаться)
Маза эксперимент показывает, что это не совсем так, о чём собственно и речь.
> Маза эксперимент показывает, что это не совсем так, о чём собственно
> и речь.
Аппаратный отключен наглухо. Результат эксперимента объясняется тем, что тест был запущен на файловой системе с softupdates. sync(2) на ней возвращается раньше, чем производится реальная запись на диск. Есть подозрение, что fsync(2) делает так же. Доказать это теоретически тяжело ввиду сложности кода. Если есть энтузиазм, то смотри softdep_fsync в файле ffs_softdep.c.
vmstat показывает нехилый i/o, это не согласуется с твоей версией
проверьте ещё кто-нибудь, а то я не уверен, что правильно интерпретирую показания vmstat
Нижеследующие высказывания касаются FreeBSD-4.7.
> на файловой системе с softupdates. sync(2) на ней возвращается раньше, чем производится реальная запись на диск.
Ну кто, кто, тебя всё время так жестоко обманывает?!
> Есть подозрение, что fsync(2) делает так же.
Дебильное подозрение.
Да, а в гугле ты смотрел про fsync и softupdates?
http://www.cnri.dit.ie/Downloads/fsopt.pdf
Впрочем, не только.
> > раньше, чем производится реальная запись на диск.
> Ну кто, кто, тебя всё время так жестоко обманывает?!
sync(2):
BUGS
Sync may return before the buffers are completely flushed.
> > на файловой системе с softupdates. sync(2) на ней возвращаетсяИ каким боком тут softupdates?
> > раньше, чем производится реальная запись на диск.
> Ну кто, кто, тебя всё время так жестоко обманывает?!
sync(2):
BUGS
Sync may return before the buffers are completely flushed.
Ты правда код смотрел? Ну глянь ещё раз, я очень тебя прошу.
1) на fs с softupdates:
> rm BIG.FILE
> df
(смотрим, что место не освободилось)
> sync
> df
(смотрим, что место не освободилось)
(ждем некоторое время)
> df
видим что место освободилось
2) тоже самое на fs без softupdates.
После sync результат виден сразу же.
Команда sync, только и делает что вызывает sync(2).
s420r $ ./dt
Started
Finished: 3375 iter, 3375 RPM
s420r $ uname -rsi
SunOS 5.7 SUNW,Ultra-80
s420r $
Started
Finished: 3375 iter, 3375 RPM
s420r $ uname -rsi
SunOS 5.7 SUNW,Ultra-80
s420r $
По поводу sync и soft updates:
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/ufs/ffs/ffs_softdep.c (смотри ревизии 1.94, 1.105).
И почитай сочинение МакКьюзика. Он хоть и пидар, но soft updates рюхает нипадецки.
morannon:~:|>mount | grep /home
/dev/da0s1f on /home (ufs, local, nodev, nosuid, with quotas, soft-updates)
morannon:~:|>df /home
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/da0s1f 9836244 8009638 1039708 89% /home
morannon:~:|>rm Short\ Circuit\ \(1986\).ShareReactor.avi
morannon:~:|>df /home
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/da0s1f 9836244 8009638 1039708 89% /home
morannon:~:|>sync
morannon:~:|>df /home
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/da0s1f 9836244 8009638 1039708 89% /home
morannon:~:|>
(минута прошла)
morannon:~:|>df /home
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/da0s1f 9836244 7335926 1713420 81% /home
Ну прочитай ты commit messages по ссылке выше, там же чётко объяснена причина такого поведения.
1.105 радует, но он еще не MFC. У меня этот глюк часто возникает.
Только я не понимаю какое это отношение имеет к возвращению из sync(2) для FreeBSD 4.7? Обе указанных тобой ревизии относятся к CURRENT. К обработке sync(2) для softupdates fs они тоже не имеют отношения.
Объясните лучше причину странного поведения вышеприведённого теста на FreeBSD
> [...]
> К обработке sync(2) для softupdates fs они тоже не имеют отношения.
И я не понимаю. Маза , что именно ты начал приклеивать проблему с df (размер свободного пространства) на файловой системе с softupdates к возвращению из sync.
Ты запускал свою программу на linux+scsi? Какое там поведение при отключенном кэше записи?
Если странное, то, маза, причина именно в TCQ.
Кстати, разве в линуксе есть поддержка TCQ для IDE винтов?
Да, патчи для этого существуют, но используются ли они реально в твоём дистрибутиве?
Да
> Какое там поведение при отключенном кэше записи?
Не знаю, как был настроен кеш, но скорость вращения дисков измерялась очень точно
> Кстати, разве в линуксе есть поддержка TCQ для IDE винтов?
Причём здесь это?
> Причём здесь это?
Просто есть предположение, что странное поведение объясняется SCSI TCQ + технология soft updates (в силу особенностей последней).
На дятле с включенным hw.ata.tags оно, правда, не подтвердилось.
Маза Глебу стоит попробовать тест на SCSI на файловой системе без soft updates, но подмонтированной с флагом async.
> проблему с df (размер свободного пространства) на
> файловой системе с softupdates к возвращению из sync.
Я показал что sync действительно раньше возвращается, чем происходит запись на диск. df послужил иллюстрацией.
> 3649 iter, 3649 RPM
softdep > 3646 iter, 3646 RPM
async > 7299 iter, 7299 RPM
Seagate Barracuda (7200 RPM, TQ)
> 65213 iter, 65213 RPM
softdep > 64403 iter, 64403 RPM
async > 161613 iter, 161613 RPM
SCSI?
Оба.
Так что же, у Сигейта и в сказёвых дисках эта наёбка?
Твой пример показывает лишь то, что df на ФС с soft updates врёт. Из него _не_ следует, что злобный sync забивает на какую-то часть данных.
Блин, ну если ломает смотреть исходники, то почитай ты МакКьюзика.
Поcле sync df врать не должен. Но он это делает. Потому что sync возвращается раньше, чем происходит реальная запись. И об этом написано в man. А df я вообще привел как частный случай, чего ты к нему прицепился?
Я не знаю как объяснить полученные результаты. Но, то что softupdates здесь не причем очевидно.
А другие примеры есть? Мои эксперименты с доступными машинами под FreeBSD не смогли обнаружить вообще какой-либо эффект от sync(8 но может быть я из-за отсутствия знаний об особенностях тамошнего VM просто не умею генерировать dirty pages в нужном количестве?
Больше всё-таки похоже на особенности аппаратуры. В машинах со сказёй и линуксом, на которых я тестировал, везде сигейты были, моделей не помню.
Может быть, где-нибудь ещё есть флажок про кеширование, который надо сбросить?
> Sync may return before the buffers are completely flushed.
Кстати, пресловутая строчка существует в мануале аж с 1994 года.
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/sys/sync.2?rev=1.1&content-type=text/x-cvsweb-markup
А контроллеры там какие?
Оба винта висят на AHA2940U2W и работают соответсвенно в режиме U2W.
softupdates не причем.
Особенно учитывая это:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;281672
http://support.microsoft.com/default.aspx?scid=kb;en-us;332023
То вот тебе замер моего единственного винта
IDE WD800JB
Write Cache Enabled: 117592 RPM
Write Cache Disabled: 6558 RPM
ЗЫ. Только не пойму, какой он может представлять интерес
ЗЗЫ. Поскольку я АЭС не рулю, то кэш отрубать не собираюсь.
ЗЗЫ ОС win2k pro sp3
В BIOS'е таки было включено, так что этот конкретный случай объяснён
НУ сто тут эксперименты ставить. Это давно известный факт. На всех серваках отключают кеш для сохранности данных.
Известно не всем, и отключают не все, и у некоторых есть причины не отключать.
А на IDE это вообще страшная потеря производительности.
Правда сейчас для Linux активно разрабатывается write-barrier support для IDE, может скоро смогу потестировать.
Оставить комментарий
abrek
Не секрет, что часто для обеспечения целостности данных программа должна иметь возможность убедиться, что записанные данные достигли поверхности диска (или попали в иное энергонезависимое запоминающее устройство). Например, это относится к журналирующим файловым системам и базам данных.Чуть менее распространено знание, что во многих современных дисках используется кеш, который позволяет аппаратуре переупорядочивать операции записи, добиваясь оптимальной производительности. В случае IDE-дисков включение write-back-кеширования в большинстве случаев приводит к невозможности гарантировать завершение операции записи. Я использовал для проверки вот эту программу:
s/fdatasync/fsync/ для систем, не имеющих функции fdatasync
Если f(data)sync реализуется честно, то каждое выполнение цикла требует не менее одного оборота диска, и количество RPM, которое сообщает программа, не превосходит реальной скорости вращения. Если же программа выдаёт нереально большое значение - значит, где-то обман.
Тестирование на IDE дисках под Linux подтвердило, что честность достигается только после выключения write cache (hdparm -W0)
(К сожалению, выключение приводит к охрененной потери производительности, цитату из tuning(7) от FreeBSD здесь уже неоднократно приводили).
На SCSI всё было нормально.
Однако сегодня попробовал запустить на FreeBSD со сказей (это shire) и увидел такое же нереально большое значение, в противоположность заявлению из tuning(7).
Где же правда?