Existe-t-il un moyen de dire au noyau Linux d'utiliser uniquement un certain pourcentage de mémoire pour le cache de tampon? Je sais que /proc/sys/vm/drop_caches
peut être utilisé pour effacer temporairement le cache, mais y a-t-il un paramètre permanent qui l'empêche d'augmenter à plus de 50% de la mémoire principale, par exemple?
La raison pour laquelle je veux le faire, c'est que j'ai un serveur exécutant un OSD Ceph qui sert constamment des données du disque et parvient à utiliser toute la mémoire physique comme cache de tampon en quelques heures. Dans le même temps, je dois exécuter des applications qui alloueront une grande quantité (plusieurs 10 s de Go) de mémoire physique. Contrairement à la croyance populaire (voir les conseils donnés sur presque toutes les questions concernant le cache de tampon), la libération automatique de la mémoire en supprimant les entrées de cache propres n'est pas instantanée: le démarrage de mon application peut prendre jusqu'à une minute lorsque le cache de tampon est plein ( *), alors qu'après avoir effacé le cache (en utilisant echo 3 > /proc/sys/vm/drop_caches
) la même application démarre presque instantanément.
(*) Pendant cette minute de démarrage, l'application fait défaut dans la nouvelle mémoire mais passe 100% de son temps dans le noyau, selon Vtune dans une fonction appelée pageblock_pfn_to_page
. Cette fonction semble être liée au compactage de la mémoire nécessaire pour trouver des pages volumineuses, ce qui m'amène à croire que la fragmentation est le problème.
Réponses:
Si vous ne voulez pas de limite absolue mais faites simplement pression sur le noyau pour vider les tampons plus rapidement, vous devriez regarder
vm.vfs_cache_pressure
Plage de 0 à 200. Déplacez-le vers 200 pour une pression plus élevée. La valeur par défaut est fixée à 100. Vous pouvez également analyser votre utilisation de la mémoire à l'aide de la
slabtop
commande. Dans votre cas, les valeursdentry
et*_inode_cache
doivent être élevées.Si vous voulez une limite absolue, vous devriez chercher
cgroups
. Placez le serveur Ceph OSD dans un groupe de contrôle et limitez la mémoire maximale qu'il peut utiliser en définissant lememory.limit_in_bytes
paramètre pour le groupe de contrôle.Les références:
[1] - Réglage du noyau Linux de GlusterFS
[2] - Guide de gestion des ressources RHEL 6
la source
limit_in_bytes
set semble le faire. Merci!vfs_cache_pressure
que ne supprime que les caches dentry et inode, et n'a rien à voir avec le cache de tampon.vfs_cache_pressure
ci100
- dessus peut vous aider si vous n'avez pas assez de RAM pour votre charge de travail. Cela réduira l'utilisation de la RAM, mais entraînera globalement de moins bonnes performances d'E / S.Je ne connais pas A% mais, vous pouvez définir une limite de temps pour qu'il la laisse tomber après x quantité de minutes.
Premier dans un terminal
Pour effacer les caches actuels.
Faites-en un
cron-job
Appuyez sur Alt-F2, tapezgksudo gedit /etc/crontab
, puis ajoutez cette ligne vers le bas.Cela nettoie toutes les 15 minutes. Vous pouvez régler sur 1 ou 5 minutes si vous le souhaitez vraiment en modifiant le premier paramètre sur * ou * / 5 au lieu de * / 15
Pour voir votre RAM libre, à l'exception du cache:
la source
3 > drop_caches
comprend le comportement desync
Je pense que votre intuition à la toute fin de votre question est sur la bonne voie. Je soupçonne soit A, l'allocation de mémoire compatible NUMA migrant les pages entre les processeurs, soit B, plus probablement, le code de défragmentation d'énormes pages transparentes essayant de trouver des régions contiguës et alignées.
Les pages énormes et les pages énormes transparentes ont été identifiées à la fois pour des améliorations de performances marquées sur certaines charges de travail et responsables de la consommation d'énormes quantités de temps processeur sans fournir beaucoup d'avantages.
Il serait utile de savoir quel noyau vous exécutez, le contenu de / proc / meminfo (ou au moins les valeurs HugePages_ *.), Et, si possible, plus du callgraph du profileur vtune faisant référence à pageblock_pfn_to_page ().
De plus, si vous voulez me permettre de deviner, essayez de désactiver la défragmentation de la page énorme avec:
(ça peut être ça à la place, selon votre noyau :)
Enfin, cette application utilise-t-elle plusieurs dizaines de concerts de RAM quelque chose que vous avez écrit? Quelle langue?
Depuis que vous avez utilisé le terme «défaillance des pages de mémoire», je suppose que vous êtes assez familier avec la conception opérationnelle et la mémoire virtuelle. J'ai du mal à imaginer une situation / application qui ferait défaut si agressivement qu'elle ne lit pas beaucoup d'E / S - presque toujours à partir du cache de tampon que vous essayez de limiter.
(Si vous êtes curieux, consultez les indicateurs mmap (2) comme MAP_ANONYMOUS et MAP_POPULATE et mincore (2) qui peuvent être utilisés pour voir quelles pages virtuelles ont réellement une page physique mappée.)
Bonne chance!
la source
Si l'OSD Ceph est un processus distinct, vous pouvez utiliser des groupes de contrôle pour contrôler les ressources utilisées par le processus:
Créez un groupe de contrôle nommé comme group1 avec une limite de mémoire (de 50 Go, par exemple, d'autres limites comme CPU sont prises en charge, dans l'exemple CPU est également mentionné):
Ensuite, si votre application est déjà en cours d'exécution, placez l'application dans ce groupe de contrôle:
Ou exécutez votre application dans ce groupe de contrôle:
la source
tuned est un démon de réglage du système adaptatif dynamique qui ajuste les paramètres du système de manière dynamique en fonction de l'utilisation.
Voir la documentation associée et les fichiers de configuration.
Information additionnelle
le commande sync vide le tampon, c'est-à-dire qu'elle force toutes les données non écrites à être écrites sur le disque et peut être utilisée lorsque l'on veut être sûr que tout est écrit en toute sécurité. Dans les systèmes UNIX traditionnels, il existe un programme appelé mise à jour exécuté en arrière-plan qui effectue une synchronisation toutes les 30 secondes, il n'est donc généralement pas nécessaire d'utiliser la synchronisation. Linux a un démon supplémentaire, bdflush , qui effectue une synchronisation plus imparfaite plus fréquemment pour éviter le gel soudain dû aux E / S de disque lourdes que la synchronisation provoque parfois.
Sous Linux, bdflush est démarré par mise à jour. Il n'y a généralement aucune raison de s'en inquiéter, mais si bdflush meurt pour une raison quelconque, le noyau en avertira et vous devriez le démarrer à la main ( / sbin / update ).
la source