Непостоянное резервное хранилище Linux для mmap ()

Сначала небольшая мотивирующая справочная информация: у меня есть серверный процесс на C ++, работающий на встроенном компьютере на базе ARM / Linux. Он работает довольно хорошо, но в рамках своей работы он создает довольно большой массив фиксированного размера (например, от десятков до сотен мегабайт) временной / непостоянной информации о состоянии, которую он в настоящее время хранит в куче, и к которой он обращается и / или обновляет эти данные время от времени.

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

У меня есть одна идея, как решить эту проблему, — разместить этот большой массив в локальном флэш-разделе компьютера, а не непосредственно в ОЗУ, а затем использовать mmap (), чтобы он отображался в процессе сервера, как будто он все еще находится в ОЗУ. Это значительно уменьшило бы использование ОЗУ, и я надеюсь, что кэш-память файловой системы Linux замаскирует большую часть результирующих затрат производительности.

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

У меня вопрос: есть ли в Linux какие-либо встроенные средства для обработки такого рода сценария использования? Я особенно представляю себе какой-нибудь способ пометить файл (или дескриптор mmap () или аналогичный), чтобы при выходе или сбое файла, создавшего процесс, ОС автоматически удаляла файл (аналогично тому, как Linux уже автоматически) восстанавливает всю оперативную память, которая была выделена процессом, когда процесс завершается или завершается сбоем).

Или, если в Linux нет встроенной функции автоматической очистки временных файлов, есть ли «лучшая практика», которую используют люди, чтобы убедиться, что большие временные файлы не заполняют диск из-за непреднамеренного настойчив?

Обратите внимание, что AFAICT, просто поместив файл в / tmp, мне не поможет, так как / tmp использует RAM-диск и, следовательно, не дает мне никакого преимущества в использовании RAM по сравнению с простым выделением динамической памяти.

0

Решение

Да, и я делаю это все время …

open файл, unlink это использовать ftruncate или лучше) posix_fallocate чтобы сделать его нужного размера, затем используйте mmap с MAP_SHARED отобразить это в ваше адресное пространство. Вы можете тогда close дескриптор немедленно, если хотите; само отображение памяти будет держать файл вокруг.

Для ускорения вы можете захотеть помочь Linux управлять кешем страниц. Ты можешь использовать posix_madvise с POSIX_MADV_WILLNEED посоветовать ядру размещать данные в POSIX_MADV_DONTNEED посоветовать ядру выпустить страницы.

Вы можете обнаружить, что последнее не работает так, как вы хотите, особенно для грязных страниц. Ты можешь использовать sync_file_range явно контролировать сброс на диск. (Хотя в этом случае вы захотите оставить дескриптор файла открытым.)

Все это совершенно стандартный POSIX, за исключением Linux sync_file_range,

3

Другие решения

Да, Вы создаете / открываете файл. Затем вы remove() файл по имени файла.

Файл по-прежнему будет открыт вашим процессом, и вы сможете читать / записывать его так же, как любой открытый файл, и он исчезнет, ​​когда завершится процесс с открытым файлом.

Я полагаю, что такое поведение предписано posix, поэтому оно будет работать на любой Unix-подобной системе. Даже при полной перезагрузке пространство будет восстановлено.

2

Я считаю, что это зависит от файловой системы, но большинство файловых систем Linux позволяют удалять открытые файлы. Файл будет существовать до тех пор, пока последний дескриптор к нему не будет закрыт. Я бы порекомендовал вам открыть файл, а затем сразу же удалить его, и он будет автоматически очищен при выходе из процесса по любой причине.

Для получения дополнительной информации см. Этот пост: Что происходит с дескриптором открытого файла в Linux, если указанный файл перемещается, удалите

1
По вопросам рекламы [email protected]