Какую библиотеку или API я должен использовать для реализации модуля ядра Linux, выполняющего асинхронный ввод-вывод? - PullRequest
0 голосов
/ 24 июня 2018

Сначала я расскажу об окружении моего ПК, предыстории моего вопроса, моей проблеме, а затем объясню свой точный вопрос.

Окружающая среда:
ОС: Ubuntu 16.04
Ядро: 4.17.1
Процессор: i7-6700k
Память: 8 ГБ DRAM
Хранение: SSD 120 ГБ

Справка:
Я пытаюсь оптимизировать ядро ​​Linux для моего конкретного приложения. Ниже приведена абстрактная логика этого приложения.
1. вызовите malloc, выделите пространство памяти, размер которого точно равен 4 КБ (размер страницы)
2. Скопируйте предварительно определенные данные (также размером 4 КБ) в выделенную область памяти.
3. Сделай расчет
4. Свободное выделенное пространство памяти.
Эта последовательность происходит от нескольких тысяч до десяти тысяч раз в секунду. Поэтому я подумал, что копировать предопределенные данные в выделенную область памяти с помощью memcpy () тысячи раз в секунду очень неэффективно. Но я не могу исправить код этого приложения.

Моя проблема:
Я хочу делать эти копии асинхронно модулем ядра, используя как можно меньше циклов ЦП. Поэтому я пытаюсь реализовать модуль ядра, который копирует эти предопределенные данные для асинхронного освобождения фреймов страниц в ядре, и управляю фреймами страниц пула, в которых есть предопределенные данные. Когда мое конкретное приложение запрашивает фрейм страницы, мое ядро ​​выдаст фрейм страницы из этого пула.

Для асинхронного копирования данных я сначала рассмотрел DMA, но intel idma64 моего ЦП не может копировать память данных в память асинхронно. Теперь я пытаюсь скопировать эти данные из вторичного хранилища (SSD) в память. Я обнаружил, что в Linux есть библиотека для асинхронного ввода-вывода с именем libaio.

Мой вопрос:
1. Могу ли я использовать библиотеки libaio в модуле ядра? Если нет, какую библиотеку или API нужно использовать для асинхронного копирования в моем модуле ядра?
2. Будет ли libaio (или что-то еще) делать копии без использования циклов ЦП?

1 Ответ

0 голосов
/ 25 июня 2018

Не думаю, что вам нужно писать модуль ядра.Пул потоков пользовательского пространства с закрепленными процессором потоками, работающими с набором карт памяти файлов, будет настолько эффективным, насколько это возможно реализовать.Просто будьте осторожны с «перебором TLB», т. Е. Избегайте изменения адресного пространства процесса и добавьте как можно больше виртуального адресного пространства, чтобы избежать этого.Возможно, немного подсказок ядру о том, какие записанные страницы никогда не будут использоваться снова через madvise(), и вы должны быть оптимальными - достаточное количество потоков максимизирует глубину очереди до SSD, вы хотите стремиться к QD8 - QD16,и вам следует легко насыщать канал NVMe, сохраняя при этом загрузку ЦП ниже 100%.

Ситуация усложняется, если у вас есть много SSM-дисков, связанных с NVMe, вам может потребоваться замена Linux на что-то более масштабируемое для ввода-вывода,но есть компромисс между пропускной способностью и масштабируемостью.Windows и FreeBSD будут лучше масштабироваться с большим количеством устройств, если вы правильно распределите работу, но Linux будет намного лучше с несколькими устройствами.Удачи!

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