web-dev-qa-db-fra.com

Restreindre la taille du cache tampon sous Linux

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 connais /proc/sys/vm/drop_caches peut être utilisé pour vider temporairement le cache, mais existe-t-il un paramètre permanent qui l'empêche de s'étendre à plus que par exemple 50% de la mémoire principale?

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 est pas instantanée: le démarrage de mon application peut prendre jusqu'à une minute lorsque le cache du tampon est plein (*), tandis qu'après avoir vidé 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 est défaillante 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.

25
Wim

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

Cette variable contrôle la tendance du noyau à récupérer la mémoire utilisée pour la mise en cache des caches VFS, par rapport à la pagecache et au swap. L'augmentation de cette valeur augmente le taux de récupération des caches VFS.

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 commande slabtop. Dans votre cas, les dentry et *_inode_cache les valeurs doivent être élevées.

Si vous voulez une limite absolue, vous devez rechercher 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 le memory.limit_in_bytes paramètre pour le groupe de contrôle.

memory.memsw.limit_in_bytes définit la quantité maximale pour la somme de la mémoire et de l'utilisation du swap. Si aucune unité n'est spécifiée, la valeur est interprétée comme des octets. Cependant, il est possible d'utiliser des suffixes pour représenter des unités plus grandes - k ou K pour les kilo-octets, m ou M pour les mégaoctets et g ou G pour les gigaoctets.

Références:

[1] - GlusterFS Linux Kernel Tuning

[2] - Guide de gestion des ressources RHEL 6

13
NOLFXceptMe

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

sync && echo 3 | Sudo tee /proc/sys/vm/drop_caches

Pour effacer les caches actuels.

Faites-en un cron-job Appuyez sur Alt-F2, tapez gksudo gedit /etc/crontab, Ajoutez ensuite cette ligne vers le bas.

 */15 *    * * *   root    sync && echo 3 > /proc/sys/vm/drop_caches

Cela nettoie toutes les 15 minutes. Vous pouvez régler sur 1 ou 5 minutes si vous le souhaitez vraiment en changeant le premier paramètre en * ou */5 au lieu de */15

Pour voir votre RAM libre, à l'exception du cache:

free -m | sed -n -e '3p' | grep -Po "\d+$
3
DnrDevil

Si Ceph OSD est un processus distinct, vous pouvez utiliser cgroups 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é):

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

Ensuite, si votre application est déjà en cours d'exécution, placez l'application dans ce groupe de contrôle:

cgclassify -g memory,cpu:group1 $(pidof your_app_name)

Ou exécutez votre application dans ce groupe de contrôle:

cgexec -g memory,cpu:group1 your_app_name
2
Alexei Martianov

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 consommer 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:

echo 'jamais'>/sys/kernel/mm/transparent_hugepage/defrag

(ça peut être ça à la place, selon votre noyau :)

echo 'jamais'>/sys/kernel/mm/redhat_transparent_hugepage/defrag

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!

2
etherfish

optimisé est un démon d'optimisation système adaptatif dynamique qui ajuste les paramètres système de manière dynamique en fonction de l'utilisation.

 $ man tuned

Voir la documentation associée et les fichiers de configuration.

 /etc/tuned
 /etc/tuned/*.conf
 /usr/share/doc/tuned-2.4.1
 /usr/share/doc/tuned-2.4.1/TIPS.txt

This parameter may be useful for you.

** Set flushing to once per 5 minutes
** echo "3000" > /proc/sys/vm/dirty_writeback_centisecs

Informations supplémentaires

La commande sync vide le tampon, c'est-à-dire 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é pdate exécuté en arrière-plan qui effectue un sync 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û à des E/S de disque lourdes que sync 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).

0
Ijaz Ahmad Khan