Низкий уровень ввода / вывода на Linux

Может ли программа уровня пользователя выполнять уровень страницы или блокировать уровень ввода-вывода на SSD?

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

ОБНОВЛЕНИЕ # 1

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

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

3 Solutions collect form web for “Низкий уровень ввода / вывода на Linux”

Вы можете делать низкоуровневые дисковые операции ввода-вывода на любом типе хранилища с помощью блочного устройства , что-то вроде /dev/sda (для всего диска) или /dev/sda1 (для раздела) под Linux. Это полностью обходит файловую систему.

Если вы реализуете свое собственное хранилище ключей, я абсолютно гарантирую, что то, что вы придумаете, будет значительно медленнее и хуже, чем файловые системы и базы данных, написанные профессионалами. Эффективный механизм хранения должен учитывать такие вещи, как кеширование, одновременная запись, устойчивость к сбоям питания и т. Д. Это очень сложно!

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

 MAX_OBJS=100 M[100]=new M[100] function saveObj(obj) { if (M.size > MAX_OBJS-1) { outputStream.appendArrayToBinary(M) M = new M[100] } M.add(obj) } while (true) { saveObj( new Obj ) } 

Как вы можете видеть, у него будет буфер из 100 объектов. Как только 101-й объект будет сохранен , он записывает на диск другие 100 и очищает буфер, чтобы оставить место для еще 100 объектов. Конечно, вы можете реализовать более сложные методы, такие как выполнение записи в другом потоке и блокирование массива, чтобы другие объекты не добавлялись до тех пор, пока они не будут записывать объекты на диск и освобождать буфер. Или что-то типа того.

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

Прежде чем вы начнете заниматься такими усилиями, необходимо уточнить несколько моментов:

«Высокая производительность» – это не одноразовое свойство.

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

Вы должны задать себе следующие вопросы:

  • Я оценил текущие основные реализации систем хранения ключевых ценностей? Если нет, почему бы и нет?
  • Если бы я сделал, почему они не подходят для моего случая использования? Я провел обширный бенчмаркинг и тестирование? Я проследил основное узкое место? Могу ли я исправить это в современных современных версиях? Если нет, то почему я могу исправить это в своей собственной реализации?
  • Каковы мои точные требования к производительности? Я определил «производительность» и нашел ли я способы ее измерения? Высокая производительность во время операций хранения? Высокая производительность во время операций поиска? Высокая производительность при высокой нагрузке из-за большого количества клиентских подключений?

Если у вас есть четкое представление о том , что именно вы хотите достичь, и как только вы отклонили текущее современное программное обеспечение, только тогда вам следует начать изучение потенциальных стратегий реализации.

Ядро – последнее место, к которому вы хотите прикоснуться. Особенно, если у вас нет опыта разработки ядра. Большинство подсистем ядра сильно оптимизированы с помощью процессов, которые прошли годы тестирования и разработки высококвалифицированными инженерами.

Моим советом было бы рассмотреть оптимизацию с помощью комбинации предварительного кодирования, интеллектуального кэширования и замедленной записи. Было бы неплохо ознакомиться с популярными алгоритмами кэширования, подходами балансировки нагрузки и посмотреть, как все работает под управлением современных файловых систем (например, readahead , Write policies , LRU ) – может быть, они напрямую не связаны с вашей проблемой , но это помогает узнать, как люди решали проблемы с производительностью в подобных областях. Разумеется, это не означает, что вы повторно используете эти функции в своем приложении, поскольку они уже лучше реализованы самой файловой системой – в большинстве случаев это может повредить производительности вашего приложения, а не улучшать его.

  • fstrim, похоже, не обрезает раздел, который использует lvm и dm-crypt
  • FreeBSD 11 не обнаруживает внутренний eMMC 32 ГБ диск
  • Как это объяснить? Superblock поврежден в SSD
  • Могу ли я стереть свой SSD из самого диска?
  • Есть ли какая-то особая причина, почему GRUB не может видеть SSD?
  • Использовать SSD для кэширования файлов с жесткого диска
  • Возможно ли отключить SSD в режиме ожидания / сна / S3?
  • Установка двух жестких дисков
  • Почему fstrim обрезает все свободное пространство на моем зеркале mdraid после перезагрузки?
  • SSD: как часто я должен делать fstrim?
  • Установка загрузки и ОС на SSD, отдых на жестком диске
  • Оптимизация для SSD?
  • Interesting Posts

    Почему люди рекомендуют использовать параметр -j3 при использовании двухъядерного процессора?

    Список установленных программ без запуска программы в системе

    набор в ksh93 работает не так, как ожидалось

    В чем разница между «Ретро» и «Стандартной» версией Puppy Linux?

    tcp / ip – действие триггера или событие после периода отсутствия активности сети на определенных портах

    Остановка вывода из программы, выполняемой в сеансе SSH СЕЙЧАС

    Как увеличить таймер перед вращением диска?

    Сила сопоставления Bash (капитальные знаки против малого)

    Поддержка UTF-8 шрифта Monaco для Linux

    Замените UID известными строками при выполнении ls и подобных кодов

    У меня есть USB-накопитель, установленный как в sdb1, так и в sdb2. Как правильно отформатировать его?

    Результаты сообщества snmpwalk для тайм-аута

    btrfs – недостающее пространство, что его берет?

    Загрузка «Linux from Scratch» не вызывает # подсказки

    Как выводить только столбец с постоянными соседями?

    Linux и Unix - лучшая ОС в мире.