Я не беспокоюсь ни об использовании оперативной памяти (так как у меня достаточно), ни о потере данных в случае случайного выключения (так как мое питание поддерживается, система надежна и данные не критичны). Но я много занимаюсь обработкой файлов и могу повысить производительность.
Вот почему я хотел бы настроить систему так, чтобы она использовала больше оперативной памяти для кэширования чтения и записи файловой системы, для агрессивной предварительной выборки файлов (например, упреждающего чтения всего файла, к которому обращается приложение, в случае, если файл имеет нормальный размер или по крайней мере в противном случае - упреждающее чтение, и реже записывать буферы записи. Как этого добиться (возможно ли это)?
Я использую файловые системы ext3 и ntfs (я часто использую ntfs!) С XUbuntu 11.10 x86.
sudo mount -o ro,nobarrier /path/to/mountpoint
или настройте,/etc/fstab
чтобы включитьnobarrier
для любой файловой системы, которую вы готовы пожертвовать ради повышения производительности. Однако, если ваше устройство хранения данных имеет внутреннюю батарею, такую как Intel 320 SSD, использование неnobarrier
приводит к потере данных.Ответы:
Улучшение производительности дискового кеша в целом - это больше, чем просто увеличение размера кеша файловой системы, если только вся ваша система не помещается в ОЗУ, в этом случае вам следует использовать ОЗУ (
tmpfs
это хорошо, потому что это позволяет вернуться к диску, если вам в некоторых случаях требуется ОЗУ) для хранения во время выполнения (и, возможно, сценарий initrd для копирования системы из хранилища на диск RAM при запуске).Вы не сказали, является ли ваше устройство хранения SSD или HDD. Вот что я нашел работу для меня (в моем случае
sda
это HDD , установленный на/home
иsdb
является SSD установлен на/
).Сначала оптимизируйте часть загрузки содержимого из хранилища в кэш:
Вот мои настройки для жесткого диска (убедитесь, что AHCI + NCQ включен в BIOS, если у вас есть переключатели):
Стоит отметить, что в случае с жестким диском высокая
fifo_expire_async
(обычно с записью) и большая длинаslice_sync
позволяет одному процессу получать высокую пропускную способность (установитеslice_sync
меньшее значение, если вы сталкиваетесь с ситуациями, когда несколько процессов ожидают некоторые данные с диска параллельно). Этоslice_idle
всегда компромисс для жестких дисков, но установка его в диапазоне от 3 до 20 должна быть приемлемой, в зависимости от использования диска и прошивки диска. Я предпочитаю ориентироваться на низкие значения, но слишком низкое значение ухудшит вашу пропускную способность.quantum
Установка , кажется, влияет на пропускную способность много , но попытаться сохранить это как можно меньше , чтобы сохранить время ожидания на разумном уровне. Установкаquantum
слишком низкого уровня приведет к разрушению пропускной способности. Значения в диапазоне 3-8, похоже, хорошо работают с жесткими дисками. Наихудшая задержка для чтения - (quantum
*slice_sync
) + (slice_async_rq
*slice_async
мс, если я правильно понял поведение ядра. Асинхронный режим в основном используется для записи, и, поскольку вы готовы отложить запись на диск, установите оба значенияslice_async_rq
иslice_async
очень низкие значения. Однако установкаslice_async_rq
слишком низкого значения может остановить чтение, поскольку запись не может быть отложена после чтения. Моя конфигурация будет пытаться записать данные на диск в большинстве через 10 секунд после того, как данные были переданы ядру , но так как вы можете терпеть потерю данных о потере мощности и наборfifo_expire_async
для3600000
сказать , что 1 часы в порядке задержки на диск. Просто сохраняйтеslice_async
низкий уровень, потому что в противном случае вы можете получить высокую задержку чтения.Эта
hdparm
команда необходима для предотвращения потери AAM большей части производительности, которую позволяет AHCI + NCQ. Если ваш диск издает слишком много шума, пропустите это.Вот моя установка для SSD (Intel 320 серии):
Здесь стоит отметить низкие значения для разных настроек среза. Наиболее важным параметром для SSD является
slice_idle
значение 0-1. Установка его в ноль перемещает все решения о порядке в собственный NCQ, в то время как установка его в 1 позволяет ядру упорядочивать запросы (но если NCQ активен, аппаратная часть может частично изменить порядок ядра). Проверьте оба значения, чтобы увидеть разницу. Для Intel серии 320, это кажется , что установкаslide_idle
на0
дает наилучшую производительность , но установка его1
дает лучший ( самый низкий) общее время ожидания.Для получения дополнительной информации об этих настройках см. Http://www.linux-mag.com/id/7572/ .
Теперь, когда мы настроили ядро для загрузки содержимого с диска в кеш с ощутимой производительностью, пришло время настроить поведение кеша:
В соответствии с тестами, которые я сделал, я бы вообще не стал настраивать чтение вперед
blockdev
. Настройки ядра по умолчанию в порядке.Установите для системы предпочтение замены файловых данных по сравнению с кодом приложения (это не имеет значения, если у вас достаточно ОЗУ для хранения всей файловой системы и всего кода приложения и всей виртуальной памяти, выделенной приложениями в ОЗУ). Это уменьшает задержку для переключения между различными приложениями по сравнению с задержкой для доступа к большим файлам из одного приложения:
Если вы предпочитаете хранить приложения почти всегда в оперативной памяти, вы можете установить это значение равным 1. Если вы установите это значение равным нулю, ядро вообще не поменяется местами, если только в этом нет крайней необходимости избегать OOM. Если у вас была ограниченная память и вы работали с большими файлами (например, редактирование HD-видео), то, возможно, имеет смысл установить это значение близко к 100.
Я сейчас (2017) предпочитаю вообще не иметь подкачки, если у вас достаточно оперативной памяти. Отсутствие свопинга обычно приводит к потере 200-1000 МБ ОЗУ на давно работающей настольной машине. Я готов пожертвовать этим, чтобы избежать задержки в худшем случае (замена кода приложения при заполнении ОЗУ). На практике это означает, что я предпочитаю обмен OOM Killer. Если вы разрешаете / нуждаетесь в обмене, вы также можете увеличить его
/proc/sys/vm/watermark_scale_factor
, чтобы избежать некоторой задержки. Я бы предложил значения от 100 до 500. Вы можете рассматривать эту настройку как торговую загрузку ЦП для более низкой задержки свопа. По умолчанию установлено значение 10, а максимально возможное значение равно 1000. Более высокое значение должно (в соответствии с документацией ядра ) привести к более высокой загрузке ЦПkswapd
процессами и снижению общей задержки обмена.Далее, скажите ядру, чтобы оно предпочитало хранить иерархию каталогов в памяти, а не содержимое файла, в случае, если необходимо освободить часть ОЗУ (опять же, если все умещается в ОЗУ, этот параметр ничего не делает):
настройка
vfs_cache_pressure
низкое значение имеет смысл, потому что в большинстве случаев ядру необходимо знать структуру каталогов, прежде чем оно сможет использовать содержимое файла из кэша, и слишком быстрая очистка кэша каталога сделает файловый кэш почти бесполезным. Если у вас много маленьких файлов, попробуйте пойти до 1 с этим параметром (моя система имеет около 150K 10-мегапиксельных фотографий и считается системой «много маленьких файлов»). Никогда не устанавливайте его в ноль, или структура каталогов всегда сохраняется в памяти, даже если системе не хватает памяти. Установка этого значения в большую имеет смысл, только если у вас есть только несколько больших файлов, которые постоянно перечитываются (опять же, пример HD-редактирования без достаточного объема ОЗУ был бы примером). Официальная документация по ядру говорит, что "Исключение: если у вас действительно огромное количество файлов и каталогов, и вы редко касаетесь / читаете / выводите список всех файлов, значение которых
vfs_cache_pressure
превышает 100, может быть целесообразным. Это применимо только в том случае, если у вас недостаточно ОЗУ и вы не можете сохранить всю структуру каталогов в ОЗУ и при этом все еще иметь достаточно ОЗУ для обычного файлового кэша и процессов (например, файловый сервер всей компании с большим количеством архивного содержимого). Если вы чувствуете, что вам нужно увеличитьvfs_cache_pressure
выше 100, вы работаете без достаточного количества оперативной памяти. Увеличениеvfs_cache_pressure
может помочь, но единственное реальное решение - получить больше оперативной памяти. Имеяvfs_cache_pressure
набор для большого числа жертвует среднюю производительность для имеющих более стабильной работы в целом (то есть, вы можете избежать очень плохо наихудшего поведения случая , но иметь дело с худшей общей производительностью).Наконец, скажите ядру использовать до 99% ОЗУ в качестве кэша для записи и дайте указание ядру использовать до 50% ОЗУ перед тем, как замедлить процесс записи (по умолчанию для
dirty_background_ratio
is10
). Предупреждение: лично я бы не стал этого делать, но вы утверждали, что у вас достаточно оперативной памяти и готовы потерять данные.И скажите, что задержка записи в 1 час - это нормально, даже если вы начнете записывать что-то на диск (опять же, я бы этого не делал):
Если вы добавите все это
/etc/rc.local
и включите в конце следующее, все будет в кеше как можно скорее после загрузки (делайте это только в том случае, если ваша файловая система действительно помещается в ОЗУ):Или немного более простая альтернатива, которая может работать лучше (только для кеша,
/home
и/usr
делайте это только в том случае, если ваша/home
и/usr
действительно умещается в ОЗУ):источник
Во-первых, я НЕ РЕКОМЕНДУЮ вам продолжать использовать NTFS, так как реализация ntfs в Linux может привести к проблемам с производительностью и безопасностью в любое время.
Есть несколько вещей, которые вы можете сделать:
ext4
илиbtrfs
bfq
preload
systemd
предварительной загрузки при загрузкеМожет быть, вы хотите попробовать :-)
источник
btrfs
что недавно была разработана файловая система, я бы избегал этого, если требуется производительность. Мы эксплуатируем в противном случае идентичных системы сbtrfs
иext4
файловыми системами иext4
победы в реальном мире , с большим отрывом (btrfs
кажется, требует около ого процессорного времени наext4
потребности того же уровень производительности и вызывает больше дисковых операции для одной логической команды). В зависимости от рабочей нагрузки, я бы предложилext4
,jfs
илиxfs
для любой работы, требующей высокой производительности.Читать дальше:
В 32-битных системах:
В 64-битных системах:
Записать за кешем:
Это будет использовать до 100% вашей свободной памяти в качестве кэша записи.
Или вы можете сделать все возможное и использовать tmpfs. Это актуально, только если у вас достаточно оперативной памяти. Вставь это
/etc/fstab
. Замените 100G объемом физической памяти.Затем:
Затем используйте / mnt / tmpfs.
источник
Вы можете установить размер упреждающего чтения с помощью
blockdev --setra sectors /dev/sda1
, где секторы - это размер, который вы хотите в 512-байтовых секторах.источник
Моя настройка убийцы очень проста и очень эффективна:
Объяснение из документации ядра :
vfs_cache_pressure
в 2000 приводит к тому, что большая часть вычислений происходит в ОЗУ и очень поздние записи на диск.источник
vfs_cache_pressure
слишком высокого (я бы посчитал2000
слишком высоким) приведет к ненужному доступу к диску даже для простых вещей, таких как списки каталогов, которые должны легко помещаться в кэш. Сколько у вас оперативной памяти и что вы делаете с системой? Как я писал в своем ответе, использование высокого значения для этого параметра имеет смысл, например, для редактирования HD-видео с ограниченным объемом ОЗУ.Не связано с кэшированием записи, но связано с записью:
Для системы ext4 вы можете полностью отключить ведение журнала
Это уменьшит количество операций записи на диск для любого конкретного обновления, но может привести к тому, что файловая система будет в нестабильном состоянии после неожиданного завершения работы, требующего fsck или хуже.
Чтобы остановить чтение диска от запуска записи на диск:
Смонтировать с релевантностью или опцией noatime
Когда вы читаете файл, метаданные «время последнего доступа» для этого файла обычно обновляются.
noatime
Опция будет отключить это поведение. Это уменьшает ненужные записи на диск, но у вас больше не будет этих метаданных. Некоторые дистрибутивы (например, Manjaro) приняли это как значение по умолчанию для всех разделов (возможно, для увеличения срока службы более ранних моделей твердотельных накопителей).relatime
обновляет время доступа реже, в соответствии с эвристикой, которая помогает поддерживать приложения, которые используют atime. Это значение по умолчанию в Red Hat Enterprise Linux.Другие опции:
источник