1 votes

Existe-t-il un moyen de limiter la taille du cache tampon sous Linux ?

J'ai un programme qui consomme beaucoup de mémoire pendant les opérations d'entrée/sortie, ce qui est un effet secondaire de l'exécution d'un grand nombre d'entre elles. Lorsque j'exécute le programme en utilisant direct_io, le problème de mémoire disparaît, mais le temps nécessaire au programme pour terminer son travail est quatre fois plus important.

Existe-t-il un moyen de réduire la taille maximale de la mémoire tampon (mémoire tampon du noyau utilisée lors des opérations d'E/S) ? De préférence sans changer les sources du noyau.

J'ai essayé de réduire /proc/sys/vm/ dirty_bytes, etc. Mais cela ne semble pas faire de différence notable.

UPDATE : en utilisant echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches Pendant l'exécution du programme, réduit temporairement la quantité de mémoire utilisée.

Puis-je d'une manière ou d'une autre limiter le pagecache, les dentries et les inodes au lieu de les libérer constamment ? Cela résoudrait probablement mon problème.

Je n'avais jamais remarqué cela auparavant, mais le problème se produit avec toutes les opérations d'E/S, pas seulement avec le partitionnement. Il semble que linux mette en cache tout ce qui passe par les E/S jusqu'à un certain point, lorsqu'il atteint presque la mémoire maximale disponible, laissant 4 Mo de mémoire libre. Il y a donc une sorte de limite supérieure pour la quantité de mémoire qui peut être mise en cache pour les E/S. Mais je n'arrive pas à la trouver. Je commence à désespérer. Si je ne peux pas la diviser par 2 quelque part dans les sources du noyau, je le ferai volontiers.

12-12-2016 Mise à jour : J'ai renoncé à résoudre ce problème, mais quelque chose a attiré mon attention et m'a rappelé ce problème. J'ai un vieux disque dur défaillant à la maison et il gaspille des ressources comme un fou quand j'essaie de faire quelque chose avec.

Est-il possible qu'il s'agisse d'un disque dur défaillant ? Le disque dur en question est mort moins d'un mois après l'apparition de mon problème. Si c'est le cas, j'ai ma réponse.

2voto

Alexei Martianov Points 161

Comme vous le demandez programme vous pouvez utiliser cgroupes :

Créez un cgroup nommé comme group1 avec une limite de mémoire (de 50GB, par exemple, d'autres limites comme le CPU sont supportées, dans l'exemple le CPU est aussi 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, intégrez-la dans ce cgroup :

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

Ou exécutez votre application dans ce cgroup :

cgexec -g memory,cpu:group1 your_app_name

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