Насколько важны эти записи? У меня есть три предложения (которые можно объединить), но одно из них - большая работа, а одно менее безопасное ...
Журналирование
Я предполагаю, что вы видите низкую производительность из-за ведения журнала , характерного для большинства современных файловых систем Linux. Журналирование приводит к вставке барьеров в очередь ввода-вывода при записи метаданных файла. Вы можете попробовать отключить предохранитель (и возможно увеличит скорость) с mount(8)
параметрами barrier=0
и data=writeback
.
Но если происходит сбой, журнал не сможет предотвратить длительный fsck(8)
. И есть вероятность, что fsck(8)
будет выбрасывать ваши данные при устранении проблемы. С одной стороны, это не легкомысленный шаг, с другой стороны, в прежние времена мы запускали наши ext2
файловые системы в режиме async
без журнала в обе стороны, и нам понравилось.
IO Scheduler Лифт
Другая возможность - поменять лифт IO; смотрите Documentation/block/switching-sched.txt
в дереве исходников ядра Linux. Короткая версия: deadline
, noop
, as
и cfq
доступны. cfq
- это ядро по умолчанию и, вероятно, то, что использует ваша система. Вы можете проверить:
$ cat /sys/block/sda/queue/scheduler
noop deadline [cfq]
Наиболее важные части из файла:
As of the Linux 2.6.10 kernel, it is now possible to change the
IO scheduler for a given block device on the fly (thus making it possible,
for instance, to set the CFQ scheduler for the system default, but
set a specific device to use the deadline or noop schedulers - which
can improve that device's throughput).
To set a specific scheduler, simply do this:
echo SCHEDNAME > /sys/block/DEV/queue/scheduler
where SCHEDNAME is the name of a defined IO scheduler, and DEV is the
device name (hda, hdb, sga, or whatever you happen to have).
The list of defined schedulers can be found by simply doing
a "cat /sys/block/DEV/queue/scheduler" - the list of valid names
will be displayed, with the currently selected scheduler in brackets:
# cat /sys/block/hda/queue/scheduler
noop deadline [cfq]
# echo deadline > /sys/block/hda/queue/scheduler
# cat /sys/block/hda/queue/scheduler
noop [deadline] cfq
Изменение планировщика может быть целесообразным, но в зависимости от барьеров, вставленных в очередь в соответствии с требованиями ведения журнала, может быть мало возможности переупорядочения. Тем не менее, вероятность потери ваших данных меньше, поэтому это может быть первым шагом.
Изменения в приложении
Другая возможность состоит в том, чтобы радикально изменить ваше приложение, чтобы самим связывать файлы и записывать на диск меньше, более крупных файлов. Я знаю, это звучит странно, но (а) команда разработчиков iD упаковала свои карты, текстуры, объекты и т. Д. В гигантские zip
файлы, которые они считывали в программу с помощью нескольких системных вызовов, распаковывали и запускали, потому что они нашли производительность намного лучше, чем чтение нескольких сотен или нескольких тысяч небольших файлов. Время загрузки между уровнями было значительно короче. (b) Команда рабочего стола Gnome и группа рабочего стола KDE использовали разные подходы к загрузке своих значков и файлов ресурсов: команда KDE упаковывает свои многочисленные небольшие файлы в более крупные пакеты какого-либо типа, а команда Gnome этого не делала. Команда Gnome имела более длительные задержки при запуске и надеялась, что ядро может предпринять некоторые усилия, чтобы улучшить время запуска. Команда ядра продолжала предлагать меньший, больший, файловый подход.