Restreindre la taille du cache tampon sous Linux

25

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_cachespeut ê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.

Wim
la source
1
Il existe quelque chose appelé hiérarchisation du cache. ceph osd pool set {cachepool} hit_set_count 1 ceph osd pool set {cachepool} hit_set_period 3600 ceph osd pool set {cachepool} target_max_bytes 1000000000000 comme un exemple voir. docs.ceph.com/docs/master/rados/operations/cache-tiering
Michael D.
2
Étant donné que ce problème n'affecte apparemment que le démarrage des applications gourmandes en mémoire, vous pouvez peut-être démarrer des applications via un script qui vide le cache avant de les démarrer. Peut-être que cela les démarre plus rapidement tout en laissant la gestion du cache au noyau pendant leur exécution.
Dégel

Réponses:

14

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 slabtopcommande. Dans votre cas, les valeurs dentryet *_inode_cachedoivent ê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 le memory.limit_in_bytesparamètre pour le groupe de contrôle.

memory.memsw.limit_in_bytesdéfinit la quantité maximale pour la somme de la mémoire et l'utilisation de 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 kilo-octets, m ou M pour mégaoctets et g ou G pour gigaoctets.

Les références:

[1] - Réglage du noyau Linux de GlusterFS

[2] - Guide de gestion des ressources RHEL 6

NOLFXceptMe
la source
1
Un cgroup avec limit_in_bytesset semble le faire. Merci!
Wim
4
Je pense vfs_cache_pressureque ne supprime que les caches dentry et inode, et n'a rien à voir avec le cache de tampon.
kawing-chiu
Augmenter vfs_cache_pressureci 100- 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.
Mikko Rantalainen
3

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, puis ajoutez 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 modifiant le premier paramètre sur * ou * / 5 au lieu de * / 15

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

free -m | sed -n -e '3p' | grep -Po "\d+$
DnrDevil
la source
Je sens ici un peu de redondance. Autant que je sache, le 3 > drop_cachescomprend le comportement desync
andras.tim
1
@ andras.tim no - sync écrit les pages sales sur le disque, 3 dans drop_caches ne récupère / libère que la mémoire utilisée par les pages propres et autres caches. vous n'avez pas besoin d'exécuter la synchronisation, mais si vous le faites, plus de mémoire sera propre au lieu de sale et plus de mémoire sera libérée lorsque vous déposerez des caches
Daniel S. Sterling
2

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:

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!

etherfish
la source
2

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é):

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
Alexei Martianov
la source
0

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.

 $ 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

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 ).

Ijaz Ahmad Khan
la source
1
N'est-ce pas seulement pour les entrées sales? Je ne pense pas que ce soit le problème sur mon système car ils sont tous propres - le retard n'est pas dans la réécriture des pages sales mais dans la défragmentation de l'espace laissé en supprimant les propres.
Wim
Oui, c'est pour les pages sales, je pense que vous pouvez également résoudre d'autres problèmes de performances en réglant le mode dynamique.
Ijaz Ahmad Khan
"Depuis Linux 2.6, [l'appel système bdflush] est obsolète et ne fait rien. Il est probable qu'il disparaisse complètement dans une future version du noyau. De nos jours, la tâche effectuée par bdflush () est gérée par le thread pdflush du noyau." man7.org/linux/man-pages/man2/bdflush.2.html
sourcejedi