LINUX.ORG.RU

Линус Торвальдс выступил с критикой дизайна файловых систем

 


1

0

В виду последних событий, когда многие люди обнаружили пропадание и обнуление файлов в файловой системе ext4 после краха ОС, создатели ext4 высказались за идею включения в ядро новых системных вызовов, которые бы позволили безопасно работать с файлами.

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

Цитата: "Поэтому вместо того, чтобы придумывать новые системные вызовы, которые никто не будет использовать, разработчики файловых систем должны стараться обеспечить нормальную работу даже плохого кода. Потому что, хотите вы этого или нет, 99% программ именно так и написаны.

Тот неоспоримый факт, что люди не проверяют ошибки, которые возвращает системный вызов close() (закрытие файла и сброс "грязных" данных из кэша на диск) должен означать, что, например, при отложенной записи на диск нужно обязательно проверять ситуацию переполнения диска. Если ваша файловая система возвращает ENOSPC при закрытии файла через вызов close(), а не при записи в него через write(), значит, что вы потеряли обработку ошибок переполнения диска у 90% приложений. Вот так всё просто.

Жаловаться на то, что ошибка в приложении - это всё равно, что жаловаться на скорость света: вы должны иметь дело с реальным миром, а не с тем, каким бы вы хотели его видеть. То же самое относится к идее, что "люди должны писать во временный файл, вызывать функцию fsync для него и переименовывать его вместо оригинала". Вы думаете, что так должно быть, но в реалии программисты пишут open(filename, O_TRUNC | O_CREAT, 0666). Это неправильно, я знаю. Но в конечном итоге, даже разработчики хорошо написанного приложения могут решить, что fsync() не стоит тех потерь в производительности. В git, например, где мы обычно пытаемся быть очень, очень и очень аккуратными, fsync() в объектных файлах по умолчанию выключен.

Почему? Потому что его включение вызывает неприемлемое поведение ext3. Сейчас, надо сказать, дизайн git'a рассчитан на то, что потеря нового БД файла не фатальна, но потенциально это очень беспокоит и смущает - вам, возможно, придётся откатить изменения назад и переделать некоторые операции вручную.

К чему я всё это говорю ? Иногда те разработчики файловых систем, которые говорят "вы должны использовать fsync(), чтобы получить предсказуемые результаты" - это те же люди, которые испортили всё это до такого безобразия, что fsync'ом абсолютно нереально пользоваться.

Теория и практика иногда сталкиваются. Когда это случается, теория проигрывает. Всегда."

Взято с opennet.

>>> Подробности

> Теория и практика иногда сталкиваются. Когда это случается, теория проигрывает. Всегда."

просто повод дополнить теорию в тех местах где она лажает.

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

vasaka ★★★
()

Сбои в работе существующих свободных фс происходят очень редко (нтфс и тот чаще сыпется) А на те редкие случаи когда надежности фс не хватило существуют бакапы всех важных данных. По поводу ненужности сабжа с Линусом согласен.

af5 ★★★★★
()

IMHO - тут всё зависит от того "JustForFun" или не "JustForFun".

Если первое, то "берём ядро и патчим" до необходимого.
Если второе - то "нафиг-нафиг"

Третье получится с течением времени :)

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

> Если на ext3 в режиме ordered и включенными barriers - то никаких.
> Если на ext4 в новом режиме alloc_on_commit и включенными barriers - то никаких.
Без barriers тоже мало шансов залететь.

...


>> пишу в него, ставлю в его конце сигнатуру "файл корректен", затем удаляю первый файл, после чего второй переименовываю. При запуске аппликухи я ищу оба файла и выбираю из них тот, в которого в конце есть заветная сигнатура "всё корректно".

> с некорректными данными дело иметь не придется но Ты можешь так потерять все данные (сюрприз?) если это не ext3+ordered / ext4+alloc_on_commit

а ordered на ext3 -- оноже поумолчанию?

eсли 
$ mke2fs /dev/sda2
$ tune2fs -j /dev/sda2

??

то ordered уже есть?

mkfifo
()

>Жаловаться на то, что ошибка в приложении - это всё равно, что жаловаться на скорость света Это пять!

Vitaly-KF
()
Ответ на: комментарий от Manhunt

> что спасают только 9 раз из 10
о! это очень хорошая цифра. Даже если б было 7 против 3 - я за решение Л.Т. а 10% - пусть идут в сад допиливать своё глюкавое поделие.

mumpster ★★★★★
()

новые вызовы в ядро пихать? Это ж еще и системные либы переписать придется, ради криворукого поделия?

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

> тоскую по RT-11
гы-гы! а восстанавливать файлуху никогда не приходилось в "рт-11"?
а мне вот приходилось :( - а под tsx-11 (не путать с rsx-11, tsx-11 - это такая rt-11 многопользовательская) это случалось даже чаще чем хотелось бы. так что не надо нам ерунды говорить что вода раньше была мокрее и девушки - красивее.;)
по поводу "атомарности замены" - а как ФИЗИЧЕСКИ Вы это сделаете?
Особенно с учётом того, что 99% железок - PC.

mumpster ★★★★★
()

Если б так на ЛОРе кто-нибудь написал, его бы назвали юыдлокодером или в лучшем случае сказали: не нравится - сделай сам как надо. :)

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

> если им пользуются только 1-2 приложения (скажем, БД)
дык эта - у оракла например есть выбор, под солярку напрмиер: directio - и впеееерёд, ДБА ССЗБ. при это всё API - сохраняется, меняется только повдеение ОС и (в некоторых случаях) даже и внешних СХД.
Барьерами будет пользоваться 1-2% и у них уже давно есть свои способы избежать упомянутых проблем.

mumpster ★★★★★
()

Торвальдс вообще всегда прав :)

Слава Линусу!
Свободу Рейзеру!

IBM-ch
()

Из 2х "зол" нужно выбирать меньшее, а компьютерное соообшество (да и весь мир) в этом направлении двигаются. А по этому - решенеие будет принято верным, как бы Вы этого не хотели, и не зависимо от ваших нравом и воплей. Это ж линукс епрст.

.

linux
()

новости про линуса делятся на две группы:
1. линус отжог (ниасилил дебиан, обосрал гном, потом перешел с кед на гном)
2. линус мудрствует (как эта новость например)

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

> ФС должна быть бесопасной для всех приложений ПО УМОЛЧАНИЮ. ТОЧКА.
Не будет она бесопасной, пока есть в оной файлы с правами 666!

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

> а ordered на ext3 -- оноже поумолчанию?

Да
/usr/src/linux/fs/ext3/super.c
/* No mode set, assume a default based on the journal
capabilities: ORDERED_DATA if the journal can
cope, else JOURNAL_DATA */

szh ★★★★
()

и правильно
и поделом нам

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

Торвальдс> This is why I absolutely _detest_ the idiotic ext3 writeback behavior.

По-моему, Торвальдс только что расписался в полной некомпетентности. Как был студентом-очкариком, так и не поумнел.

Есть разные уровни требуемой надёжности (со стороны программ), как и разное железо. Отложенная запись для 99% десктопов - громадный плюс. Не говоря уже о SSD дисках, где "много раз по малу" - это работа на уровне скорости дискет, когда отложенная запись может ускорить запись до 150МБ/с. Но это так, часности. Главное - горячий финский парень мутит сообщество своим ламеризмом. Да и те, кому требуется надёжность, смотрят на Линукс в последнюю очередь. Легче заплатить и заказать драйвер для QNX, чем плясать вокруг сообщества энтузазистов "Ну напишите драйверок к принтеру!".

matumba ★★★★★
()

Приятно, что на ЛОРе есть люди, готовые ржать над собой.

Я говорю, конечно, о dikiy.

Ничего не понал, но уже поржал.

Прекрасно!

Так держать.

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

>Ничего не понал, но уже поржал.

Не надо по себе судить.

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

Ещё один эксперт.

1) Прочитайте весь lkml thread.

2) Для 99% desktop'ов важна *надёжность* сохранения данных, а не скорость. При теперешней инфраструктуре Линукс итак достаточно быстр.

3) Для таких умных, как вы, есть open(O_DIRECT) и фс, которые его поддерживают.

4) Для ищущих надёжности никуда не делся fsync()

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

Кони разговаривают? Кони разговаривают ?! Кони разговаривают!

Дайте пять!

dikiy, вы себя уже трижды дискредитировали, уймитесь.

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

>dikiy, вы себя уже трижды дискредитировали, уймитесь.

пруф или слив.

А пока садитесь.

dikiy ★★☆☆☆
()

> Если ваша файловая система возвращает ENOSPC при закрытии файла через вызов close(), а не при записи в него через write(), значит, что вы потеряли обработку ошибок переполнения диска у 90% приложений. Вот так всё просто.

Золотые слова, блин. Если произошла ошибка, то приложение должно иметь возможность обработать ее. И если ENOSPC вернулась в момент close(), то как, пардон, определить начиная с какого момента данные не были записаны? Или после каждого write прозрачно делать еще и fsync() и писать логику if (write()==0) { return fsync(); } ???

no-dashi ★★★★★
()
Ответ на: комментарий от fi

> Чушь спороли-с. Если коротко, то вы ничего не знаете о тестировании.

А можно не "коротко", а "длинно" и детально? Расскажите, как надо? ,)

Manhunt ★★★★★
()
Ответ на: комментарий от no-dashi

Если вернулась ENOSPC на close(), то надо считать что ничего вообще не записалось. Обрабатывать такую ошибку если был сделан O_TRUNK уже поздняк, единственное, что можно сделать, это удалить на хрен и попробывать еще раз, но ведь так можно бесконечно пробывать.

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

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

Можно еще уведомить пользователя, что место исчерпано :)

Manhunt ★★★★★
()
Ответ на: комментарий от no-dashi

Ну да. Явно посчитать влезает файл или нет на свободное место на диске можно без записи данных.

Впрочем, боюсь ошибку ENOSPC мало кто проверяет, где бы она не вылезла. Для обычных приложений, типа vim, firefox и т.д. это всё-таки серьёзный форс-мажор. И что после этого делать совершенно непонятно. А вот wget, lftp, *torrent, очень бы стоило знать, когда место кончается.

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

>Для 99% desktop'ов важна *надёжность* сохранения данных, а не скорость. При теперешней инфраструктуре Линукс итак достаточно быстр.

М-м-м. Домашняя машинка. Слабая - 3200+. Ставим копироваться что-нить с ftp, попутно запускаем фильм в 720p, например. Загрузка процессора 45%, память есть. И все писец как начинает тормозить. Скорость копирования падает до 10МБ/сек.

jackill ★★★★★
()

как по мне так Линус прав - далеко не все приклады будут переписаны и пропатчены... только те что поддерживаются...

а вообще коли фс журналируемая то 1 почему фс не может сделать теневую копию файла (при обрезании его длины? точнее оставить старый файл на месте как есть пока не закомитится (не закроется и не запишутся все данные диск или не будет сделан fsync() (это тоже является признаком в уверенности удаления старого файла, после того как данные окажутся на диске) на край удалять от нехватки места на носителе) - это решило бы с текущим апи 99% сноса данных при перезаписи конфигов, при больших файлах и если места не достаточно - то удалялось бы содержимое старого, в данном случае это оправданно. 2 почему происходит коммит и затирание метаданных о старом файле до переноса данных нового файла на диск? 3 проверку целостности журнала сделать мне кажется оч просто - в конце х-байтовая свёртка блока журнала (например crc32) и всё - не сошлось - блок (возможно и далее ) отбрасываем, а пока данные не лежат на диске основная фc на диске не обновляется данными об этом файле.

всё это не запрещает делать delayed alloc, но в то же время происходит сохранность и структуры фc и данных по максимуму.

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

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

>Куда столько ФС?

тсс... это заговор. есть только одна фс - ntfs. ей и пользуйся.

а власти скрывают...

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

>гы-гы! а восстанавливать файлуху никогда не приходилось в "рт-11"? >это случалось даже чаще чем хотелось бы, мал

А в чем были сложности в этом дружие?

create/start/end с трудом дались?

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

Это не фантазии, это реальность. Я хочу писать переносимый код и не думать, где он будет выполнятся.

ОС и, в частности, ФС должны обеспечить схожее выполненение на всех совместимых по API платформах.

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

> Например, можно было бы, уже открывая файл, указать не CREATE|TRUNCATE, а некую (пока гипотетическую) опцию REPLACE_ON_CLOSE. И всё! Думаю, семантика понятна из названия. А уж когда файл будет реально перенесён на диск - сразу (как в fsync()) или в некотором абстрактном будущем (как с барьерами) - будет уже определяться где-то в другом месте (опцией sync монтирования либо явным вызовом fsync()). В любом случае, целостность данных можно будет запросить явно на уровне API.

> Барьеры же, как попытка сделать эту функциональность, на мой взгляд, ничему не противоречат: безопасный и эффективный способ ДОЛЖЕН существовать, даже если им пользуются только 1-2 приложения (скажем, БД).

ДОЛЖЕН => может. И НЕ в ядре. Или пользовательская библиотека, или glibc.

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

>Не будет она бесопасной, пока есть в оной файлы с правами 666!

вы не священник?

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

>М-м-м. Домашняя машинка. Слабая - 3200+. Ставим копироваться что-нить с ftp, попутно запускаем фильм в 720p, например. Загрузка процессора 45%, память есть. И все писец как начинает тормозить. Скорость копирования падает до 10МБ/сек.

М-м-м. кому жемчуг мелкий, кому суп жидкий.

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

>Явно посчитать влезает файл или нет на свободное место на диске можно без записи данных.

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

"Теория и практика иногда сталкиваются. Когда это случается, теория проигрывает. Всегда."

+много

A-234 ★★★★★
()
Ответ на: комментарий от dm123

> 1 почему фс не может сделать теневую копию файла (при обрезании его длины? точнее оставить старый файл на месте как есть пока не закомитится (не закроется и не запишутся все данные диск или не будет сделан fsync() (это тоже является признаком в уверенности удаления старого файла, после того как данные окажутся на диске)

Признаком уверенности удаления старого файла является удаление данных старого файла одним из 3 способов (unlink; rename; open O_TRUNC). Вот уже 30 лет.
Не уверен - не удаляй.

> 2 почему происходит коммит и затирание метаданных о старом файле до переноса данных нового файла на диск?


о том и разговор.

> 3 проверку целостности журнала сделать мне кажется оч просто


так и делают

szh ★★★★
()
Ответ на: комментарий от A-234

> Представьте ситуацию когда в момент вызова write место еще есть, а к моменту сброса кэша места уже внезапно нет (диск в массиве вылетел, например)

Придумай пример получше %) Если вылет диска из массива приводит к уменьшению его размера, то это фатальный сбой и вся ФС накроется.

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

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

A-234 ★★★★★
()
Ответ на: комментарий от tailgunner

> Придумай пример получше %) Если вылет диска из массива приводит к уменьшению его размера, то это фатальный сбой и вся ФС накроется.

мм А если записывает на диск несколько приложений?

Ximik
()
Ответ на: комментарий от no-dashi

>Золотые слова, блин. Если произошла ошибка, то приложение должно иметь возможность обработать ее. И если ENOSPC вернулась в момент close(), то как, пардон, определить начиная с какого момента данные не были записаны? Или после каждого write прозрачно делать еще и fsync() и писать логику if (write()==0) { return fsync(); } ???

Просто проверять, равно ли возвращенное write значение количеству байт, которое пытались записать. Как и написано в man write.

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

>Признаком уверенности удаления старого файла является удаление данных старого файла одним из 3 способов (unlink; rename; open O_TRUNC). Вот уже 30 лет.

>Не уверен - не удаляй. unlink - в журнал до сброса метаданных журнала в фc на диске (я так понял это происходит периодически а не сразу по факту) rename - тут вполне однозначно только в журнал пока новый файл не окажется полностью на диске. open O_TRUNC - в журнал пока не будет коммита одним из перечисленных выше способов.

в случае reset мы (практич) всегда имеем либо старую не тронутую версию либо новую. это сделать сложно? а про уверенность - прога с уверенностью пишет в файл данные, и с уверенностью хочет их прочитать, но вот какая то тварь сбросила комп или привела к этому и хз что за файл у неё там остался - как варинт просто нулевой длины. обработка может быть и не предусмотрена, прога считает что если отдала данные в систему то пусть дальше о них заботится система и запишет на диск неважно когда, но главное чтобы был потом нормальный файл - об этом Линус и писал когда говорил что бред когда метаданные пишутся вперёд данных(я так его понял), это и происходило когда конфиги слетали с нулевой длиной.

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

>> Придумай пример получше %) Если вылет диска из массива приводит к уменьшению его размера, то это фатальный сбой и вся ФС накроется.

> мм А если записывает на диск несколько приложений?

В этом случае ФС может и обязана обеспечить резервирование места. О чем Линус и говорит :)

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

> Загрузка процессора 45%, память есть. И все писец как начинает тормозить. Скорость копирования падает до 10МБ/сек.

Проблемы IO scheduler'a.

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

> unlink - в журнал до сброса метаданных журнала в фc на диске

Нет, только до коммита транзакции в журнале.

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

> в случае reset мы (практич) всегда имеем либо старую не тронутую версию либо новую. это сделать сложно?


это делается с помощью rename на избранных фс и с fsync+rename на остальных

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

>Впрочем, боюсь ошибку ENOSPC мало кто проверяет, где бы она не вылезла. Для обычных приложений, типа vim, firefox и т.д. это всё-таки серьёзный форс-мажор. И что после этого делать совершенно непонятно. А вот wget, lftp, *torrent, очень бы стоило знать, когда место кончается

RETURN VALUE
fread() and fwrite() return the number of items successfully read or written (i.e., not the number of characters). If an error
occurs, or the end-of-file is reached, the return value is a short item count (or zero).

dikiy ★★☆☆☆
()

Линус прав, НО

Линус прав, НО почему нельзя сделать и то и другое?

- Ядро всеми силами спасает приложения без нового sync()
- Новые аппликухи получают выигрышь в скорости
- ???
- PROFIT!

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