en utilisant O_TMPFILE pour nettoyer les pages énormes ... ou d'autres méthodes?

voix
0

Mon programme utilise des pages énormes. Pour faire, il les fichiers ouverts comme suit:

oflags = O_RDWR | O_CREAT | O_TRUNC;
fd = open(filename, oflag, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

filenamese trouve dans le système de fichiers hugetlb. Ça marche. Mon programme peut alors mmap()les descripteurs de fichier créé. Mais si mon programme est tué, les fichiers restent ... et dans l'immense système de fichiers de la page, les autres fichiers est bloqué mémoire, comme le montre la commande suivante (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

Alors, que mon programme ne partage pas le fichier à quelqu'un d'autre, il était logique pour moi de créer des fichiers temporaires en utilisant le drapeau O_TMPFILE. J'ai donc essayé:

oflags = O_RDWR | O_TMPFILE;
fd = open(pathname, oflag, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

où est le chemin hugetlbfs point de moint. Cela ne fonctionne pas (pour une raison que je ne peux pas expliquer) avec l'erreur suivante:

open failed for /dev/hugepages: Operation not supported

Pourquoi? et plus au point: Comment puis-je garantir que toutes les grandes pages de mon programme utilise se libérer?

Oui: Je pourrais attraper quelques signaux (par exemple SIGTERM); mais pas tous ( SIGKILL)

Oui: Je pourrais unlink()le fichier le plus rapidement possible en utilisant la première approche, mais si SIGKILLest reçu entre open()et unlink().

Noyaux comme cautionnement. Moi aussi Qu'est-ce que les méthodes appropriées aux garanties de nettoyage 100% quel que soit le moment ou sur la façon dont mon programme se termine.

Créé 01/12/2016 à 13:40
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

On dirait que O_TMPFILE n'est pas encore mis en œuvre pour hugetlbfs; En effet, cette option nécessite le soutien du système de fichiers sous-jacent:

O_TMPFILE nécessite un soutien par le système de fichiers sous-jacent; un sous-ensemble de systèmes de fichiers Linux fournir ce soutien. Dans la mise en œuvre initiale, le soutien a été fourni dans les EX2, ext3, ext4, UDF, Minix et systèmes de fichiers SHMEM. le soutien XFS a été ajouté sous Linux 3.15.

Ceci est confirmé en regardant le code source du noyau où il n'y a pas inode_ops-> tmpfile () mise en œuvre hugetlbfs.

Je crois que la bonne réponse est ici pour travailler sur cette mise en œuvre ...


J'ai remarqué vos commentaires sur l'option unlink (), cependant, peut-être l'approche suivante est pas risquée:

  • ouvrez le fichier (par nom) avec TRUNCATE (afin que vous puissiez assumer sa taille est 0)
  • découplez.la
  • mmap () avec votre taille cible

Si votre programme est tué au milieu, le pire des cas est de laisser un fichier vide.

Créé 01/12/2016 à 16:14
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more