- Вопрос или проблема
- Уведомление о перемещении поста
- Актуальный вопрос
- Обычный способ
- Легкий способ
- Почему файловая система?
- Ответ или решение
- Преимущества применения файлового подхода для HugeTLB в Linux
- 1. Упрощение управления памятью
- Условия жизни страниц
- 2. Управление доступом
- Разграничение прав доступа
- 3. Прозрачность и видимость данных
- Доступность данных через файл
- 4. Совместимость и расширяемость
- Легкая интеграция с другими технологиями
- Заключение
Вопрос или проблема
Уведомление о перемещении поста
Я только что переместил этот вопрос (с небольшими изменениями) из вопроса на StackOverflow (который я удалил, так как кросс-постинг настоятельно не рекомендуется), который не был там отвечен и, возможно, лучше подходит сюда.
На вопрос на StackOverflow было оставлено два комментария (но ни одного ответа). Вот краткое содержание этих комментариев (обратите внимание, что вам может понадобиться прочитать сам вопрос, чтобы понять это):
- Подход с файловой системой позволяет использовать
libhugetlbfs
, который может делать всевозможные вещи.- Это меня не убеждает – если я, как программист приложений, могу выделять большие страницы, не прибегая к файловой системе, так и
libhugetlbfs
тоже может, верно?
- Это меня не убеждает – если я, как программист приложений, могу выделять большие страницы, не прибегая к файловой системе, так и
- Использование файловой системы позволяет установить разрешения на то, кто может выделять большие страницы.
- Конечно, но это не обязательно делать через файловую систему. Если кто угодно может использовать
mmap(…, MAP_HUGETLB, …)
, то любой, кому отказан доступ на уровне файловой системы, все равно может исчерпать все большие страницы, используя методmmap
.
- Конечно, но это не обязательно делать через файловую систему. Если кто угодно может использовать
Актуальный вопрос
В настоящее время я изучаю различные способы выделения памяти в больших страницах под Linux. Я как-то не могу осознать концепцию ‘файловой системы’ HugeTLB. Обратите внимание, что я не говорю о прозрачных больших страницах – это совершенно другое.
Обычный способ
Обычная мудрость (как, например, представлено в вики Debian или документации ядра) заключается в следующем:
- Убедитесь, что ваша конфигурация ядра настроена правильно
- Установите различные параметры ядра правильно
- Смонтируйте специальную файловую систему (
hugetlbfs
) в какой-либо произвольный каталог, скажем,/dev/hugepages/
(это, кажется, по умолчанию в Fedora…) mmap()
файл в этом каталоге в ваше адресное пространство, т.е. что-то вроде:
int fd = open("/dev/hugepages/myfile, O_CREAT | O_RDWR, 0755);
void * addr = mmap(0, 10*1024*1024, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, 0);
… и если эти два вызова успешны, я должен получить addr
, указывающий на 10 МБ памяти, выделенной в пяти огромных страницах по 2 МБ. Отлично.
Легкий способ
Однако это кажется ужасно усложненным?
По крайней мере, в Linux 5.15 вся эта файловая система кажется совершенно ненужной. Я только что попробовал это:
- ядро настроено с HugeTLBfs
- параметры ядра установлены правильно (т.е.,
vm.nr_hugepages > 0
) - нигде не смонтирован
hugetlbfs
А затем просто сделайте mmap
анонимной памяти:
void *addr = mmap(0, 10*1024*1024, (PROT_READ | PROT_WRITE),
(MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB), 0, 0);
Это дает мне 10 МБ памяти, выделенной в больших страницах (по крайней мере, если я правильно интерпретирую флаги в таблице страниц).
Почему файловая система?
Итак, мой вопрос: почему файловая система? Действительно ли “необходимо” проходить через файловую систему, как предполагают различные руководства, а моя попытка выше была просто удачной? Есть ли у подхода с файловой системой другие преимущества (кроме наличия файла, который представляет части вашей ОЗУ, что, похоже, является огромным подводным камнем…)? Или это может быть просто остаток из какого-то предыдущего времени, когда MAP_ANONYMOUS | MAP_HUGETLB
не был разрешен?
Одно из отличий между этими двумя способами заключается в управлении временем жизни.
Если процесс, который выделил большую страницу, погибает, большие страницы, выделенные с помощью простого mmap, будут немедленно возвращены ядру, в то время как большие страницы, выделенные с помощью hugetlbfs, останутся.
Это может быть важно, когда большие страницы разделяются между процессами или когда они используются с каким-либо аппаратным устройством, которое выполняет DMA с ними или к ним. В таких случаях вы захотите отложить освобождение страниц до тех пор, пока все пользователи страниц не завершат свою работу.
Ответ или решение
Преимущества применения файлового подхода для HugeTLB в Linux
Вопрос о том, зачем использовать файловый подход в управлении огромными страницами (HugeTLB) в Linux, является интересным и многогранным. Действительно, можно выделить несколько аспектов, которые подчеркивают преимущества данного подхода в сравнении с простым использованием системных вызовов.
1. Упрощение управления памятью
Условия жизни страниц
Первое важное преимущество, которое следует отметить – это управление жизненным циклом выделенных страниц. При использовании hugetlbfs
страницы будут оставаться в памяти даже после завершения работы процесса, который их выделил. Это позволяет другим процессам продолжать обращаться к данным, пока они необходимы. Если данные, размещаемые на больших страницах, используются несколькими процессами или взаимодействуют с аппаратным обеспечением, выполненным с использованием DMA, такая функция становится ключевой.
В отличие от этого, при использовании простого mmap
с флагами MAP_ANONYMOUS | MAP_HUGETLB
, если процесс завершает работу, все выделенные страницы немедленно возвращаются в ядро, что может привести к неожиданному поведению для других процессов, использующих эти страницы.
2. Управление доступом
Разграничение прав доступа
Использование hugetlbfs
позволяет более тонко настраивать права доступа к выделяемым огромным страницам. С помощью стандартной модели прав Unix можно определить, какие пользователи и группы могут создавать файлы и соответственно выделять огромные страницы. Это предоставляет уровень безопасности, который отсутствует при использовании анонимного mmap
.
Хотя возможен случай, когда разрешения на уровне файловой системы могут не блокировать доступ к выделению памяти через mmap
, но системы управления правами и контроля доступа в файловом подходе обеспечивают большую гибкость в настройках и политике безопасности для приложений и процессов.
3. Прозрачность и видимость данных
Доступность данных через файл
Файловый подход также улучшает видимость данных. Данные, размещенные в hugetlbfs
, могут быть смотримы и анализируемы с помощью стандартных инструментов работы с файловой системой. Это упрощает отладку и мониторинг памяти, выделенной под ресурсы, так как можно использовать стандартные команды для просмотра и анализа файлов, чтобы понять структуру и потребление памяти.
4. Совместимость и расширяемость
Легкая интеграция с другими технологиями
Использование файлового подхода открывает возможности для интеграции с другими технологиями, например, с системами управления ресурсами или средствами мониторинга. Используя hugetlbfs
, разработчики могут легко внедрять решения для отслеживания использования памяти и оптимизации потребления, не прибегая к необходимости экстраординарных вмешательств в системы управления памятью.
Заключение
В заключение, хотя существует возможность работы с HugeTLB без использования файловой системы, преимущества применения подхода hugetlbfs
становятся очевидными, особенно при разработке сложных систем, где требуются надежность, безопасность и эффективное управление памятью. Управление жизненным циклом, тонкая настройка прав доступа, возможность видимости данных и легкость интеграции – все это делает файловый подход более предпочтительным для специалистов в области информационных технологий.