2016-12-01 19 views
0

Моя программа использует огромные страницы. Для этом она открытых файлов следующим образом:с использованием 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% очистки независимо от того, когда и как заканчивается моя программа.

+0

Не можете ли вы просто называть '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." –

+0

@Andrew: Моя программа разделяет память между различными процессами, поэтому мне нужны дескрипторы файлов. Ваш комментарий имеет смысл, я должен был указать это в моем первоначальном вопросе. – user1159290

+0

Предполагая, что ваша программа просто воссоздает файл, если файл будет очищен после того, как ваш процесс может быть убит, повторное использование существующего файла 'hugetlbfs'? Если вы только собираетесь воссоздать файл, действительно ли имеет значение, если он не очищен? –

ответ

1

Похоже, O_TMPFILE еще не реализован для hugetlbfs; на самом деле, этот вариант требует поддержки основной файловой системы:

O_TMPFILE requires support by the underlying filesystem; only a subset of Linux filesystems provide that support. In the initial implementation, support was provided in the ex2, ext3, ext4, UDF, Minix, and shmem filesystems. XFS support was added in Linux 3.15.

Это подтверждается, посмотрев на исходный код ядра, где нет никакого inode_ops-> tmpfile() реализация в hugetlbfs.

Я считаю, что правильный ответ здесь, чтобы работать над этой реализацией ...


Я заметил ваш комментарий о возможности Unlink(), однако, может быть следующий подход не рискованно:

  • открыть файл (по имени) с TRUNCATE (так что вы можете предположить его размер 0)
  • разъединить его
  • ММАПА() это с вашим целевого размером

Если ваша программа убита посередине, в худшем случае необходимо оставить пустой файл.

+0

hmmm не выглядит правильным, на самом деле. ваше предложение - это то, что я делаю прямо сейчас. Не то чтобы мне это действительно понравилось, хотя ... Спасибо – user1159290