Комментарии 34
Не надо такие статьи писать, это сильно мешает естественному отбору (а он — мудрый)!
;)
Э… Я правильно понял, что в облаке, даже не выставляя "nobarrier" у своей vm — не можешь быть уверен, что он не выставлен уровнем выше?
Абсолютно верно.
Разные есть сервис провайдеры. Есть крупные, к которым клиенты идут, потому что они крупные. А есть мелкие, региональные. У которых даже своего ДЦ и нет, но клиенту деваться некуда — он не готов переплачивать *3 (опять же вспомню сравнения хетцнер вс амазон).
К тому же, проверить провайдера на то, что у него корректно реализован весь стек хранения… Попросту невозможно. Остается доверять. И это… Мы еще не говорим про самые обыкновенные баги в ПО...
Бытует мнение, что nobarrier допустим и оправдан для контроллеров с батарейным кешем. Как по-вашему, для серверных ssd с суперконденсатором он тоже работает без потерь данных?
Мне кажется, что вопрос не верен. Серверные ssd с супер конденсатором и с, и без nobarrier ничего не гарантируют. Я уж не говорю о ситуации, когда накопитель после аварийного выключения просто превращается в тыкву из-за ошибки в фирмваре, например. Слава Богу, такое не каждый день происходит
Не могли бы порекомендовать другие безопасные, но более практичные способы «подачи»?
Проще и сложнее одновременно:
- От приложения до условной поверхности диска у вас могут быть несколько посредников: какой-нибудь asyncio-фреймворк, ядро, гипервизор, кеширующий контроллер с батарейкой или без, контроллер диска с батарейкой/конденсатором или без.
- Если хотя-бы кто-то из посредников "без батарейки" пере-упорядочивает запись, то целостность данных не гарантируется.
Так рекомендации какие? Я для себя вижу так.
- Обращение в техпод облака. Да, мы узнаем настройки в моменте, но они могут поменяться в любой момент, и мы об этом не узнаем.
- Строить распределенной систему с репликацией и пр. При этом мы теряем в быстродействии — rtt никто не отменял.
- Использовать managed решения. Те же БД. Они "как бы" гарантируют определенной уровень целостности и у нас не болит голова о низкоуровневых вещах вроде nobarrier.
- Ваш вариант
Никак, кроме как попросить посадить вас на медленные HDD и мониторить latency ;)
Можно предположить что «что-то не так» если виртуалка показывает нереально хорошие цифры в коротком тесте fio --rw=randwrite --runtime=1 --direct=1 и те же цифры с fio --rw=randwrite --runtime=1 --direct=1 --fsync=1. Естественно, тестировать напрямую на блочном устройстве а не на файле на файловой системе, то есть тест «деструктивный».
Но даже тогда достоверно сказать что «меня кидают» нельзя — может вашу машину положили на супер-пупер SSD локально на гипервизоре.
поправки:
1) unsafe в qemu разрешает ему игнорировать запросы на синхронизацию (даже когда они приходят).
2) SSD, которая может сделать 2000 flush'ей в секунду (во время записи) — это крутая энтерпрайзная SSD. Консьюмерские выдают порядка 100 или даже меньше.
А как вы бенчмаркали? Выше вы приводили хорошую строчку, вот её полная версия: fio --rw=randwrite --runtime=1 --direct=1 --fsync=1 --iodepth=32 --filename=/test --size 4G--ioengine=libaio
Важно запускать её на файловую систему, а не на блочное устройство, потому что на блочное устройство не проходил fsync когда я проверял это.
С синком 1K IOPS: fio direct.fio --filename=/dev/mailbox/xxx --rw=randwrite --iodepth=1 --runtime=30 --fsync=1 --fdatasync=1
fsync/fdatasync взаимоисключающие (fdatasync облегчённая версия fsync). В списке ключей ещё добавить --direct=1
и --blocksize=4k
. Ваша цифра выглядит довольно крутой, и я не думаю, что какие-то устройства покажут сильно больше без мухлежа с writeback'ом.
У вас получилось сделать SCSI-команду SYNCHRONIZE CACHE при использовании --fsync=1
для блочных устройств? Я вот, сколько не смотрел scsi-логгинг, ни разу не сумел добиться.
Я пребываю в уверенности, что без использования файловой системы заставить делать SYNCHRONIZE CACHE с помощью fio не получится. Если кто-то найдёт как — я буду очень благодарен.
Так вот, вы уверены, что fio по блочному устройству хоть что-то такое отправляет и оно транслируется уровнем ниже? У меня большие сомнения.
Я внимательно прочёл документацию к ядру в Documentation/block касающуюся writeback cache, запустил fio без синков и с синками и действительно увидел обещание поведение когда на устройство отправляются пустые bio с флагом pre-flush — поэтому да, я уверен что запросы на сброс кэша на устройство отправляются. Не вижу причин не доверять увиденному
О вреде неправильных оптимизаций