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.

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

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

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

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

Если верить lkml, это проблемы ext3.

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

Провидец был прав.

>Где Нина, Райзер?

В аду, вестимо. Но гениальности Райзера это не отменяет. Гении они не всегда адекватны.

PS: я не прошу Гансу за Reiser4 всё простить, пусть его нигры на зоне пердолят, но в файловых системах он понимал больше чем сейчас многие.

Camel ★★★★★
()

Согласен с г-ном Торвальдсом. Файловая система должна работать железно и без сбоев.

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

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

Это вполне можно сделать на уровне приложения или glibc, поддержка ядра не нужна. Создаешь временный файл, пишешь данные, далее fsync/fdatasync и потом либо unlink, remane старого файла, либо unlink временного. Достаточно добавить флаг fopen. И это автоматически заработает во всех системах (поддержка fs не нужна).

Почему это еще не сделано? :-)

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

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

> 2) Для 99% desktop'ов важна *надёжность* сохранения данных

Давайте оттолкнёмся от обратного: в чём вы видите НЕнадёжность сегодняшних ФС? Смешно, даже FAT - более чем достаточно для подавляющего большинства десктопов! Сбои питания можно лечить журналированием, дублированием на перфокарты, проклятиями Чубайса, но ГОРАЗДО ПРОЩЕ поставить каждому UPS (это $100), чем тормозить ВСЮ работу системы ради одного дурацкого перебоя раз в 5 лет.
При сейчашнем уровне качества можно спокойно уделять внимание скорости, не переживая за аппаратные проблемы.

matumba ★★★★★
()

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

Да пожалуйста, вот только этот ваш люникс на ней не пашет :(

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

Как как вы сказали? Логопед, фас!

А вообще-то пашед, давайте ко, оставляйте корень на какой-нибудь вменяемой фс, а всё остальное пихайте себе на здоровье в ntfs, драйвер ложите в initrd и жуйте с причмокиванием!

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

> ГОРАЗДО ПРОЩЕ поставить каждому UPS (это $100), чем тормозить ВСЮ работу системы ради одного дурацкого перебоя раз в 5 лет.

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

А сбои и зависания бывают из-за кривых проприетарных драйверов, и по другим причинам.

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

>но ГОРАЗДО ПРОЩЕ поставить каждому UPS (это $100), чем тормозить ВСЮ работу системы ради одного дурацкого перебоя раз в 5 лет.

согласен. займитесь этим. судя по апломбу, средства у Вас есть. поставьте каждому UPS за 100$. мне можете не ставить.

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

>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).

Мосье не в курсе, что одна из распространенных причин неполных write'ов -- получение сигнала, а не ENOSPC?

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

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

Драйвер должен считать свободное место, исходя из размера всех незаписанных данных.

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

PS Линус прав. Надеятся на надежность одной части системы глупо. Система надежна только тогда, когда _все_ подсистемы надежны.

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

>>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).

>Мосье не в курсе, что одна из распространенных причин неполных write'ов -- получение сигнала, а не ENOSPC?

какого сигнала? write - по умолчанию блокирующий вызов.

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

>Обнаружили, что что программисты криво работают с файлами - напишите tutorial "как работать правильно", и подержите его недельку на первых страницах линуксячих сайтов. Пусть user-level приложения подтягиваются.

Томас Мор, не узнаю вас в гриме!

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

>Сбои питания можно лечить журналированием, дублированием на перфокарты, проклятиями Чубайса, но ГОРАЗДО ПРОЩЕ поставить каждому UPS (это $100), чем тормозить ВСЮ работу системы ради одного дурацкого перебоя раз в 5 лет.

Дебил, ups не спасет от сбоя по питанию! Нужен смартюпс, к тому же с настроенной поддержкой со стороны ОС.

И кроме сбоев по питанию есть еще сбои в драйверах и железе, приводящие к моментальному фризу.

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

Ну блин, зря евгенику запретили. Ох зря...

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

> какого сигнала? write - по умолчанию блокирующий вызов.

Любого. И твой write запросто может вывалиться, не выполнив записи. Помедитируй над "man 2 write" :)

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

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

Тогда зачем линукс, если он не дает никаких преимуществ по сравнению с другими системами? Зачем тогда баш, если у всех sh?

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

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

> гы-гы! а восстанавливать файлуху никогда не приходилось в "рт-11"?

Приходилось, внутри оно ещё проще fat'а. Конечно, журнала тоже нет. Размазывания важных данных по диску тоже нет. Вышла на несколько лет раньше фата, и для свего года имеет лучшую надёжность, чем фат - для своего. Сужу по RT-11 SJ и немного FB; TSX не видел. Судя по архитектуре, в многозадачном режиме у системы действительно можно ожидать определённые сложности. В любом случае, давать нескольким приложениям одновременный прямой доступ к оглавлению тома нельзя - хотя именно так многие прикладные программы и делали.

В целом, система вполне соответствует своему времени. Только речь не о том, как круто продвинулись системы с тех пор, а о том, что функциональность-то очень простая и просто мегаудобная. Я потом ещё очень долго и болезненно отучался от привычки давать команды типа "sort <file.txt >file.txt" - как Вы знаете, в досах и никсах оно ничего не сортирует, а просто тупо губит файл. Пользователи RT-11 успешно делали это, даже не догадываясь, что в каких-то системах тут может быть подложена бомба.

> по поводу "атомарности замены" - а как ФИЗИЧЕСКИ Вы это сделаете?

журнал, как обычно. А что?

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

>> по поводу "атомарности замены" [старого файла новым] - а как ФИЗИЧЕСКИ Вы это сделаете?

> Да сделать-то несложно, полным журналированием. Но цена...


Похоже, я невнятно выразился.

Итак.

1. Пользователь "открывает файл" с опцией O_REPLACE. (На самом деле система создаёт для него новый, пока ещё временный, файл на той же fs, что и целевой).
2. Пользователь начинает писать в файл.
3. В это время все видят старое содержимое. И даже тот же пользователь, если открывает на чтение файл по тому же имени, видит старое содержимое (вот вам и второй бонус - возможность дать команду sort <file.txt >file.txt).
4. Пользователь делаеть close() (точнее, commit). После этого момена все остальные видят, что в каталоге произошла атомарная замена одного файла (инода) другим.

Параллельно или через некоторое время после этого на диске происходят следующие изменения:

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

Всё.

Никаких танцев с бубном вокруг open/rename, никаких потерь данных, никаких journal=data.

Строго говоря, даже нового системного вызова не нужно, всё делается через "обычный" open().

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

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

... ага, представляю программу, прочитавшую мегаважные данные из своего файла, затеревшую её и начавшую писать туда новые. Но - увы - новые данные на диск не влазят. Да и старые уже не влазят, т.к. пока программа думала, место кончилось. Остаётся этой программе вывалить на экран, как в старом анекдоте - фразу "да не получается у меня ничего!" - и сохранить эти мегаважные данные в /dev/null.

Теперь представим себе, что это должна делать программа, написанная в цейтноте и/или просто на коленках.

И как тут применять мысль, косвенно упомянутую Линусом, что "ось должна создать для программы такие условия, чтобы та могла быть надёжной без специальных усилий"?

/* Казалось бы, решение просто - реализуйте режим O_REPLACE или аналогичный приём. */

alexsaa
()
Ответ на: Линус прав, НО от DOKA

> Линус прав, НО почему нельзя сделать и то и другое?
>- Ядро всеми силами спасает приложения без нового sync()

>- Новые аппликухи получают выигрышь в скорости


Ядро не знает, какая перед ним аппликуха - старая или новая - т.к. апи общее.

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

>> какого сигнала? write - по умолчанию блокирующий вызов.

>Любого. И твой write запросто может вывалиться, не выполнив записи. Помедитируй над "man 2 write" :)

write - блокирующий вызов. Он не может вывалиться не отработав.

dikiy ★★☆☆☆
()

чВариант: опции монтирования с тремя типами защиты (без журнала, стандартный журнал, параноидальный журнал). Данная степень - API работы с файлами по умолчанию. Т.е. если программа открыла "по дефолту" файл на ФС, смонтированной по API X, работа будет по API X. Но с другой стороны, если программе нужна лишняя производительность (временные файлы при рендеринге) или защита (БД) - можно при открытии файла указывать свою степень защиты.

Ядро разбухнет может даже метров до пяти (у мну ща 3.3)...но модульность и галки в menuconfig нас спасут :)

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

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

> давать нескольким приложениям одновременный...доступ к оглавлению тома > нельзя
вот то-то и оно! тут-то собака и порылась!
чтобы сделать такое - потребовалось бы отказаться от всех преимуществ многозадачной системы. кроме того, Вы не задумывались, за счёт чего и как это сделано и где физически хранится эта информация? ведь не в вакууме же она лежит? вот если в таком состоянии завалить систему, она могла и не подняться. если Вы не помните уже - Я напомню, что у советских PDP-11/LSI-11 AKA СМ-4/1420/ДВК/Э-60 штатно ИБП не был предусмотрен.
Потом, такой подход противоречит самим принципам работы UNIX-систем (возьмите книжку Кернигана и Пайка и почитайте).
Т.е. он нужен чтобы облегчить жизнь лентяев и незнаек.
То, что Вы хотите, было сделано потом в VMS в виде версионности файла, в Линуксе доступно если ФС поддерживает и смонтирована с xattr и Ваше ПО поддерживает соответствующую работу с XATTR.
Тепреь про журнал - само по себе его трудно сделать атомарным, более-менее удобно это сделать только разбиением на возможно мелкие действия и их записью в него. Что, собственно, и делается - с воплями некоторых о "тормозах". Тем не менее, наличие журнала позволяло мне запускать Постгрес без fsync с соответствующим повышением ОБЩЕЙ производительности. То есть приемлемое сочетание скорости и надёжности разработчиками Постгрес было достигнуто на существующем API.

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

> Представьте ситуацию когда в момент вызова write место еще есть

Так это, проверять можно в 2-х местах :-).

> (диск в массиве вылетел, например)

Сдаётся мне, что на этот случай есть другие коды ошибок. Впрочем, это беда универсальности - для десктопа вылет винта - жуткий форс-мажор (типа не должно приложение обрабатывать нажатие на кнопку Reset ;-).

constRS
()

Мде... Я не понял, разработчики ФС под Linux не знают волшебного слова ТРАНЗАКЦИЯ? Представляю, как в огромной БД открывается восьмигиговый файл чтобы дописать пару килобайт, переносится во временный файл и перезаписывается обратно, это же верх идиотизма. Где же журналирование и транзакции???

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

>Представляю, как в огромной БД открывается восьмигиговый файл чтобы дописать пару килобайт, переносится во временный файл и перезаписывается обратно, это же верх идиотизма

Есть мнение, что верх идиотизма -- размещать "огромную БД" с множеством "восьмигиговых файлов" на какой-либо ФС

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

> write - блокирующий вызов. Он не может вывалиться не отработав.

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

============================

#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>

void signal_handler(int n)
{
	fprintf(stderr, "got signal %d\n", n);
}

int main()
{
	int ret;
	struct sigaction sa;
	int fd[2] = {-1, -1};

	memset(&sa, 1, sizeof(sa));
	sa.sa_handler = signal_handler;
	sigemptyset(&sa.sa_mask);

	ret = sigaction(SIGUSR1, &sa, 0);
	if(-1 == ret)
	{
		perror("sigaction");
		return ret;
	}

	ret = pipe(fd);
	if(-1 == ret)
	{
		perror("pipe");
		return ret;
	}

	while(1)
	{
		ret = write(fd[1], fd, sizeof(fd));

		if(-1 == ret)
		{
			perror("write");
			fprintf(stderr, "write returned error\n");
			return ret;
		}
		else if (sizeof(fd) != ret)
		{
			fprintf(stderr, "written %d bytes (expected %d bytes)\n", ret, (int) sizeof(fd));
			return ret;
		}
	}

	return 0;
}

==================

Компилируешь, запускаешь. Пайп довольно быстро переполняется, программа блокируется во write, и может висеть хоть неделями. В соседней консоли теперь пишешь
killall -USR1 a.out
и наблюдаешь, как блокирующий write вываливается с errno = "Interrupted system call".

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

> write - блокирующий вызов. Он не может вывалиться не отработав.

И даже если на конкретной реализации write не вываливался бы, это ничего не значило бы.

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

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

> Тогда зачем линукс, если он не дает никаких преимуществ по сравнению с другими системами? Зачем тогда баш, если у всех sh?

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

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

пусть будет #ifdef в коде приложения, но зачем его в ядро нести? Если разработчикам сильно хочется, чтоб кто-то мог использовать их хитрый функционал, пусть вносят свой /sys/ или другой файл, на этот файл желающие пусть делают ioctl.

Файловых систем в ядре много. И только для _нескольких_ этот вызов будет что-то значить. Какой смысл делать такой syscall?

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

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

Не хочешь учиться - вон из профессии!

> Платформа должна быть стабильной и простой.


Она _уже_ нифига не простая.

> Если разработчикам сильно хочется, чтоб кто-то мог использовать их хитрый функционал, пусть вносят свой /sys/ или другой файл, на этот файл желающие пусть делают ioctl.


Ну что за любовь к костылям?

> Файловых систем в ядре много. И только для _нескольких_ этот вызов будет что-то значить. Какой смысл делать такой syscall?


1. Ext4 претендует на роль основной и дефолтной ФС
2. Смысл в повышении быстродействия при гарантированной корректности

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

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

> Не хочешь учиться - вон из профессии!

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

Данный специалист - плохой программист? Или криворукие писатели драйверов ФС и создатели самих ФС?

sstass
()

Блин подловили....
Ни в одной программе у меня нету проверки чего же там происходит после Close()
Хотя программы архитектурно написаны так, что Close() вызывается в страшных местах после сброса буферофф....

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

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

Тут два варианта.
1. Его программа не делает sync. Тогда чем агрессивнее ФС оптимизирует свои действия, тем быстрее программа будет работать. И разработчики ФС как раз выступают за агрессивную оптимизацию, а Линус - против.
2. Программа делает sync. На многих платформах sync - очень дорогое удовольствие. Это связано с природой жестких и ssd дисков, которые любят обмениваться большими вподряд идущими блоками данных; и катастрофически теряют производительность, когда идут обмены маленькими кусочками данных то по одним адресам, то по другим (это как раз то, что происходит при sync). Так что везде будет не слишком-то шоколадно. Но если разработчик осилит дополнительное API и добавит в свою программу пару #ifdef, то на линуксе его программа будет работать быстрее, чем на других платформах. За это выступают разработчики ФС, и против этого выступает Линус.

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

>Тогда чем агрессивнее ФС оптимизирует свои действия, тем быстрее программа будет работать. И разработчики ФС как раз выступают за агрессивную оптимизацию, а Линус - против.

В первую очередь, от ФС требуется надежное хранение данных. Если твоей программе этого не требуется - используй /dev/null

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

>> Платформа должна быть стабильной и простой.

> Она _уже_ нифига не простая.

И зачем её усложнять ещё больше? Сейчас, кстати, намечается тенденция на "упрощение" - вынесение схожей логики в "базовые классы".

Так что количество системных вызовов надо уменьшать, а не увеличивать :) Plan 9 обходится 51 системным вызовом, а в ядре Linux их всё больше и больше :)

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

> В первую очередь, от ФС требуется надежное хранение данных. Если твоей программе этого не требуется - используй /dev/null

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

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

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

>> Если разработчикам сильно хочется, чтоб кто-то мог использовать их хитрый функционал, пусть вносят свой /sys/ или другой файл, на этот файл желающие пусть делают ioctl.

> Ну что за любовь к костылям?

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

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

> Неспособность сделать некоторые вещи

Бгггг. Ну давай, запусти в производство жесткий диск с нулевым seek time.

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

>> Файловых систем в ядре много. И только для _нескольких_ этот вызов будет что-то значить. Какой смысл делать такой syscall?

> 1. Ext4 претендует на роль основной и дефолтной ФС

Это их желание, они не диктаторы :) Тем более она должна быть надёжной по умолчанию, только потом всё остальное - возможность оптимизации, ускорения, и т.д.

> 2. Смысл в повышении быстродействия при гарантированной корректности

На _конкретной_ ФС. Какой смысл ставить этот syscall для ядра? Для конкретной ФС пусть будет ioctl, желающие пользоваться пусть пользуются.

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

> 2. Программа делает sync. На многих платформах sync - очень дорогое удовольствие. Это связано с природой жестких и ssd дисков, которые любят обмениваться большими вподряд идущими блоками данных; и катастрофически теряют производительность, когда идут обмены маленькими кусочками данных то по одним адресам, то по другим (это как раз то, что происходит при sync). Так что везде будет не слишком-то шоколадно. Но если разработчик осилит дополнительное API и добавит в свою программу пару #ifdef, то на линуксе его программа будет работать быстрее, чем на других платформах. За это выступают разработчики ФС, и против этого выступает Линус.

Так я не против этого API, я против его в драйвере ФС, который в ядре. Пусть желающие выносят такую функциональность в библиотеки, syscall, etc.

Разницы для "оптимизаторов" не будет, остальные получат простой, понятный и надёжный интерфейс (который и есть сейчас).

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

> Тем более она должна быть надёжной по умолчанию, только потом всё остальное - возможность оптимизации, ускорения, и т.д.

О надежности можно говорить лишь применительно к корректно написанным программам. И с этим у ext4 проблем нет и не было.

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

> На _конкретной_ ФС. Какой смысл ставить этот syscall для ядра?

Вполне вероятно, что на _нескольких_ конкретных ФС.

> Для конкретной ФС пусть будет ioctl, желающие пользоваться пусть пользуются.

ioctl здесь - лишняя сущность

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

>> И зачем её усложнять ещё больше?

> Затем, что новое api дает реальные преимущества.

Какие преимущества даёт системный вызов? Который должен быть для всех ФС.

Ещё раз. Пусть это API будет в библиотеках, ioctl, и других вещах, специфичных для этой ФС.

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

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

>> Неспособность сделать некоторые вещи

> Бгггг. Ну давай, запусти в производство жесткий диск с нулевым seek time.

Хмммм. Причём тут это? Я, может, туплю, но абсолютно не понимаю, к чему параметры HDD к аюстракции разработчиков?

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

>> Тем более она должна быть надёжной по умолчанию, только потом всё остальное - возможность оптимизации, ускорения, и т.д.

> О надежности можно говорить лишь применительно к корректно написанным программам. И с этим у ext4 проблем нет и не было.

То же самое можно сказать в отношении Ext4.

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

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

>> На _конкретной_ ФС. Какой смысл ставить этот syscall для ядра?

> Вполне вероятно, что на _нескольких_ конкретных ФС.

Не факт, что на всех _нескольких_ требуется единый подход к их ускорению.

>> Для конкретной ФС пусть будет ioctl, желающие пользоваться пусть пользуются.

> ioctl здесь - лишняя сущность

Лишняя сущность как раз syscall. ioctl никак не влияет на части ядра и программы, которые его не используют. syscall - не обязательно, но может повлиять, тем более при его использовании на разных ФС (кто знает, что кто-то выставит параметром по умолчанию?)

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

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

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

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

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

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

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