Моя программа использует огромные страницы. Для этом она открытых файлов следующим образом:с использованием O_TMPFILE для очистки огромных страниц ... или других методов?
oflags = O_RDWR | O_CREAT | O_TRUNC;
fd = open(filename, oflag, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
Где filename
находится в hugetlb файловой системе. Это работает. Моя программа может затем mmap()
созданных дескрипторов файлов. Но если моя программа получает убита, файлы остаются ... и в огромной страницах файловой системы, оставшиеся файлы блокируются память, как показано с помощью следующей команды (876 = 1024!):
cat /proc/meminfo | grep Huge
AnonHugePages: 741376 kB
HugePages_Total: 1024
HugePages_Free: 876
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Итак, как мои программа не передает файл кому-либо еще, мне было разумно создавать временные файлы, используя флаг O_TMPFILE. Так что я пробовал:
oflags = O_RDWR | O_TMPFILE;
fd = open(pathname, oflag, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
где путь является hugetlbfs moint точки. Это выходит из строя (по причинам я не могу объяснить) со следующей ошибкой:
open failed for /dev/hugepages: Operation not supported
Почему? и многое другое: как я могу гарантировать, что все огромные страницы, которые использует моя программа, освобождаются?
Да: я мог поймать некоторые сигналы (например, SIGTERM
); но не все (SIGKILL
)
Да: Я мог бы unlink()
файл как можно скорее, используя первый подход, но что, если SIGKILL
принимаемых между open()
и unlink()
.
Ядра как гарантии. Так же, как и я. Каковы надлежащие методы для гарантии 100% очистки независимо от того, когда и как заканчивается моя программа.
Не можете ли вы просто называть 'mmap (NULL, bytes, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);' вместо использования файловой системы 'hugetlbfs'? Per [огромная документация TLB] (https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt): «Также важно отметить, что ** никакой такой команды монтирования не требуется **, если приложения будут использовать только системные вызовы shmat/shmget или mmap с MAP_HUGETLB." –
@Andrew: Моя программа разделяет память между различными процессами, поэтому мне нужны дескрипторы файлов. Ваш комментарий имеет смысл, я должен был указать это в моем первоначальном вопросе. – user1159290
Предполагая, что ваша программа просто воссоздает файл, если файл будет очищен после того, как ваш процесс может быть убит, повторное использование существующего файла 'hugetlbfs'? Если вы только собираетесь воссоздать файл, действительно ли имеет значение, если он не очищен? –