7 votes

Réserver la RAM pour le cache et la mémoire tampon

Je fais généralement tourner de nombreux programmes et machines virtuelles sur mon bureau. Ce n'est pas le processeur qui est le goulot d'étranglement, mais la mémoire. (Acheter plus de mémoire n'est pas une solution car il ne s'agit pas de mon propre ordinateur).

J'ai commencé à expérimenter avec compcache et cela fonctionne bien pour la compression de la mémoire. Je peux augmenter son utilisation par un swappiness de 100. Mais lorsque la mémoire réelle (non compressée) commence à se remplir, Linux commence à vider les caches et les tampons avant de procéder à un échange massif, ce qui n'est pas bon pour moi car le passage d'un programme à l'autre devient douloureusement lent.

Je n'ai pas réussi à trouver un moyen de réserver de la mémoire pour les tampons et les caches, j'ai donc commencé à chercher d'autres moyens et j'ai trouvé les cgroups.

Dans les cgroups, il n'est pas possible de définir une limite de mémoire pour les ressources racine. J'ai donc essayé de déplacer tous les processus dans un groupe avec une mémoire limitée, mais cela n'a pas fonctionné.

Comment puis-je réserver de la mémoire pour les tampons et les caches et commencer à swapper vers compcache à un stade précoce ?

6voto

RandomEngy Points 6937

Si vous souhaitez réserver de la mémoire pour le cache et le tampon : echo 10 > /proc/sys/vm/vfs_cache_pressure alors que 100 est la valeur par défaut. Ensuite, vous pouvez limiter la mémoire vive maximale utilisée par chaque application : echo 8192 > /proc/sys/vm/max_map_count. Je recommande un swapiness=30 et des valeurs élevées de /proc/sys/vm/dirty_writeback_centisecs et /proc/sys/vm/dirty_expire_centisecs (toutes deux : 1250). Il peut également être utile de modifier le système de fichiers :

echo 8192 > /sys/block/mmcblk0/queue/max_sectors_kb
echo 8192 > /sys/block/mmcblk1/queue/max_sectors_kb
echo 0 > /sys/block/mmcblk0/queue/iosched/slice_idle
echo 0 > /sys/block/mmcblk1/queue/iosched/slice_idle
echo 160 > /sys/block/mmcblk0/queue/iosched/quantum
echo 160 > /sys/block/mmcblk1/queue/iosched/quantum
echo 800 > /sys/block/mmcblk0/queue/iosched/fifo_expire_sync
echo 800 > /sys/block/mmcblk1/queue/iosched/fifo_expire_sync
echo 180 > /sys/block/mmcblk0/queue/iosched/fifo_expire_async
echo 180 > /sys/block/mmcblk1/queue/iosched/fifo_expire_async
echo 1 > /sys/block/mmcblk0/queue/iosched/back_seek_penalty 
echo 1 > /sys/block/mmcblk1/queue/iosched/back_seek_penalty

Ces valeurs proviennent de mon mobile et de mon ordinateur portable et fonctionnent de manière très stable et rapide. Mon portable est limité en mémoire mais ce tweaks aide beaucoup. Mon portable a aussi les cgroups activés et je recommanderais le wonderpatch 4k parce qu'il ajoute des cgroups personnalisés à chaque application qu'un utilisateur exécute depuis le terminal (pas le bureau) mais je ne sais pas comment limiter la mémoire avec les cgroups.

1voto

David Spillett Points 23094

Il n'est pas possible de réserver directement de la mémoire pour les tampons et le cache. Le noyau utilisera la mémoire qui n'est pas utilisée pour autre chose à cette fin, parfois en échangeant de très vieilles pages inutilisées pour faire plus de place. La façon de réserver de la mémoire pour les caches/tampons est donc de limiter la quantité de RAM que les applications (y compris vos machines virtuelles) utilisent.

Un problème courant consiste à allouer aux VM plus de mémoire que nécessaire, afin que le système d'exploitation de la VM ait de la place pour les caches de disque. Vous pouvez supprimer ce besoin en activant le support de mise en cache pour vos disques virtuels (la manière de procéder dépend de votre solution de virtualisation, que vous n'indiquez pas) et en laissant ainsi l'hôte décider de la quantité de mémoire utilisée globalement pour la mise en cache. De cette façon, vous pouvez réduire la quantité de mémoire allouée à chaque VM avec moins de dégradation des performances d'E/S qu'autrement. Un avertissement cependant : en procédant ainsi, vous vous exposez à un risque supplémentaire de corruption du système de fichiers sur les disques virtuels si votre machine hôte est arrêtée de manière non ordonnée (par exemple à la suite d'une coupure d'électricité).

1voto

harrymc Points 394411

Si vous disposez d'une mémoire limitée, n'essayez pas de dicter l'utilisation de la mémoire au noyau. Le noyau fait probablement déjà un meilleur travail que ce que vous pouvez faire avec cgroups ou compcache.

La seule véritable solution, si l'augmentation de la mémoire n'est pas envisageable, est de limiter l'utilisation de la RAM. L'augmentation de l'espace d'échange peut "résoudre" le problème, mais entraîne de longs échanges entre les processus. La réduction de l'utilisation de la RAM par la VM peut améliorer la situation.

Voir l'article Réduire l'empreinte mémoire de Linux . Bien qu'il date de 2007, il peut encore être utile.

Vous pouvez également compiler votre propre noyau, en désactivant tous les services et options dont vous n'avez pas besoin. Voir par exemple cet article : Guide de réglage de la taille du noyau .

Vous pourriez plutôt opter pour une version de Linux à faible mémoire, comme dans cet article : 8 des meilleures petites distributions Linux .

Mais je répète qu'il n'y a pas de solution miracle qui vous permette d'utiliser beaucoup de mémoire sur un ordinateur qui en manque, du moins pas sans un échange lent. Vous devrez optimiser vos habitudes d'utilisation. L'optimisation du noyau peut aider un peu, mais elle a ses limites.

0voto

theman5142 Points 1

Allez dans le terminal puis en mode root et faites : nano /etc/sysctl.conf et en bas copiez ceci.

vm.swappiness = 60

vm.overcommit_ratio = 100

vm.min_free_kbytes = 1000000

C'est la configuration actuelle que j'utilise, les 2 lignes du bas correspondent à 1gb car je suis limité à 10gb sur mes 12gb de ram donc il me réserve 10% et l'ajuste bien sûr comme il le faut.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X