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.

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

Ответ на: комментарий от Manhunt

>> Если эта функциональность будет использоваться хотя бы на 50% ФС, тогда Линус может и вернётся к разговору о расширении внешнего API ядра. По крайней мере, я бы так сделал на его месте :)

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

Раз всё хорошо работает и никто использовать не будет, значит он не нужен.

Есть не только ФС поверх жёстких дисков. Такое там не только не требуется, а может повредить.

Поведение программы, ядра в особенности, должно быть предсказуемым. Предсказуемость в случае ioctl обеспечится проверкой вызова ioctl - прикладная программа будет уверена, что работает с "правильной" для неё ФС.

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

>> Я, может, туплю, но абсолютно не понимаю, к чему параметры HDD

> Потому, что имено эти параметры делают sync дорогим. Именно вокруг свойств HDD городится огород с отложенными записями, multiblock allocation, и тд

Я привёл абстрактных программистов, пишущих абстрактные программы. Но если так хочется прийти к ФС, то свет не сошёлся клином даже на блочных устройствах, не говоря уже о конкретном типе носителя - HDD. Для SSD совсем другие оптимизации нужны, Ext4 для них не подходит.

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

>> Вот Ext4 и "глючит".

> Да ну? Ext4 делает всё, что обещано posix-ом.

Только как-то странно делает, не так, как ожидают от надёжной ФС.

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

> Я привёл абстрактных программистов, пишущих абстрактные программы.

Кажется, разговор превратился в спор ради спора, с весьма поверхностной аргументацией. Скучно.

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

>> Я привёл абстрактных программистов, пишущих абстрактные программы.

> Кажется, разговор превратился в спор ради спора, с весьма поверхностной аргументацией. Скучно.

Конечно, если смотреть и цитировать только вырванные из контекста фразы :)

Но про спор я согласен, мне незнакомы случаи влияния ЛОР`а на разработчиков ядра или glibc :)

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

Как бы оно давно так, посему и весь разговор сводится к тому что ext3 достаточно, а зоопарк фс не нужен.

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

>> Вот Ext4 и "глючит".

>Да ну? Ext4 делает всё, что обещано posix-ом.

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

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

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

>Программы, которым требуется надежность, нещадно используют fsync. Например, sqlite. И на моей рабочей ext3 это иногда выливается в ди-ииикие тормоза.

Понятно. Мне непонятно тока одно: зачем функции ФС тащить в апликуху? (если, конечно, она не субд какая-нибудь, что вообще без ФС работать может)

>Может, пора с этим что-то делать?

Да. Вопрос - что именно? Костыли городить (читай: обеспечить надежность путем усложнения системы)?

>А если твоей программе надежность не нужна, то ты действительно можешь полагаться на те костыли, которые предлагает Торвальдс. Которые 9 раз спасут, и 1 раз убъют твою инфу. Лотерея.

" -- Какова вероятность встретить живого мамонта?\n --50/50: или встретим, или нет"

короче, не было такого (если не считать отказы оборудования).

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

>Какая офигительная самоуверенность :) Тебе, долбодятлу, уже два человека сказали, что может. Ты проверил бы что ли, прежде чем на своем настаивать. Вот тебе простенький примерчик, дарю.

А теперь пиши не в пайп, а не block device. И харошь рефлектировать.

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

> А теперь пиши не в пайп, а не block device. И харошь рефлектировать.

Ты ж говорил, что write - блокирующий, и потому вывалиться не может. А теперь вдруг съехал с темы и начал нести что-то про девайсы. Вот тебе блокирующий write, и вот тебе выпадание. Давай-ка теперь пруфлинк на документ, где было бы написано, что блокирующие вызовы не могут быть прерваны сигналом. Или слив засчитан.

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

> пруфлинк на документ, где было бы написано

Хотя бы для блок девайсов :)

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

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

val-amart ★★★★★
()

ИМХО Новость лучше назвать - Линус объяснил кто по его мнению неправ.;-)

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

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

> вот то-то и оно! тут-то собака и порылась! чтобы сделать такое - потребовалось бы отказаться от всех преимуществ многозадачной системы.

Почему? Достаточно убедить их работать с оглавлением через системный API, а не напрямую обращаться к блокам, в которых хранится каталог.

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

> Да ну? Ext4 делает всё, что обещано posix-ом.

Все что обещано posix'ом ext4 делает с отключенным журналом.
Поверь, все кто включают журнал хотят НАМНОГО БОЛЬШЕ чем обещано posix.

posix - минимальный общий набор правил, абсолютно не достаточный в реальной жизни.

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

> какого сигнала? write - по умолчанию блокирующий вызов. При чем блокируемость? Если во время вызова write поступит сигнал (скажем, EPIPE), вызов write будет прерван и вернет либо неполное число записанных байт, либо EINTR, если ничего не успел записать.

ЕМНИП это Стивенсон пишет и я склонен ему верить.

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

> Поверь, все кто включают журнал хотят НАМНОГО БОЛЬШЕ чем обещано posix.

Где можно прочитать спецификации, каких конкретно гарантий они хотят? В смысле, не высеры коллективного ЛОР-овского разума, а официальные стандарты.

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

> убедить их работать с оглавлением через системный API, а не напрямую
о чём и речь - а это будет уже другая система и другая организация работы. напомнить, во что это вылилось для M$-ДОСа?

mumpster ★★★★★
()

fixed:собжество жестко раскритиковало Линуса за потворствование криворуким программистам(see also "Виндузятник" и "программоид").

BasileyOne
()

Самое интересное, на мой взгляд, это не обеспечение атомарности операций, - это очевидная необходимость, - а просто решение вопроса КТО будет эту самую атомарность обеспечивать. А в самом деле кто? Ведь все споры, насколько я понимаю, ведутся не на уровне "нужно или не нужно", а на уровне "приложение или ФС". Я вижу дело так: если ФС гарантирует атомарность той или иной операции, то мне, как программисту, совершенно не нужно знать как ФС ее, операцию, реализует. Банальная инкапсуляция рулит. И тут никакие новые интерфейсы не нужны. А вот если разработчики ФС атомарноть не гарантируют, то, взамест, они вынужденны предоставить мне интерфейс, для того что бы уже я сам гарантировал атомарность операций в той мере, в какой меня устраивают накладные расходы. Совершенно очевидно, что Линус имел ввиду, что хорошая ФС должна развиваться по пути номер раз. То есть инкапсулировать свои операции, гарантируя при этом их атомарность и транзакционность. И знаете что? Я полностью с этим согласен. Я лично пользую XFS, и мне совершенно не надо знать как она там проводит свои fsync'и. Главное нет потерь данных, а потеря производительности, если она вообще есть, не существенна. По крайней мере не существенна для меня. Точка. А делать новый АПИ под одну-единственную ФС, вообще крайне глупое занятие, на мой взгляд. Оки, кому-то глянулась экст4. Хорошо. Но ведь есть и те, кому по душе ReiserFS или XFS, как мне. Так что? Я уже и так на уровне конфигов с эксклюзивными параметрами монтирования едиственной и неповторимой намучился, а теперь туже шнягу тащить и на уровень АПИ? Так что ли?! Глюк, по-моему. Пускай создатели экста4 выкручиваются как хотят, а не хотят - сливают проект. Свято место пусто не бывает.

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