<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mémoire on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/m%C3%A9moire/</link><description>Recent content in Mémoire on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Mon, 10 Feb 2020 07:30:00 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/m%C3%A9moire/index.xml" rel="self" type="application/rss+xml"/><item><title>Redis, MongoDB, RabbitMQ, désactiver les Transparent Huge Pages</title><link>https://blog.zwindler.fr/2020/02/10/redis-mongodb-rabbitmq-desactiver-les-transparent-huge-pages/</link><pubDate>Mon, 10 Feb 2020 07:30:00 +0000</pubDate><guid>https://blog.zwindler.fr/2020/02/10/redis-mongodb-rabbitmq-desactiver-les-transparent-huge-pages/</guid><description>&lt;img src="https://blog.zwindler.fr/2020/01/mememe_1aa1a73fcaf242fa2e2642bfd90ccb42-1.webp" alt="Featured image of post Redis, MongoDB, RabbitMQ, désactiver les Transparent Huge Pages" /&gt;&lt;h2 id="transparents-huge-pages"&gt;Transparents Huge Pages
&lt;/h2&gt;&lt;p&gt;Les THP et moi, ça remonte à quelques années (i.e.n un brouillon qui traîne depuis longtemps); Mais j’ai de nouveau eu besoin de toucher aux Transparent Huge Pages il y a peu donc c’est une bonne occasion de m’y remettre.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://redis.io/topics/admin" target="_blank" rel="noopener"
&gt;Redis&lt;/a&gt;, &lt;a class="link" href="https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/" target="_blank" rel="noopener"
&gt;MongoDB&lt;/a&gt;, RabbitMQ, Kafka&amp;hellip; Tout ces logiciels vous demandent, à l’installation ou dans la documentation, de désactiver ce paramètre système de vos serveurs Linux.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;01-07-2020 03:46:32.730 +0000 WARN ulimit - ulimits: This instance is running on a machine that has kernel transparent huge pages enabled. This can significantly reduce performance and is against best practices. Turn off kernel transparent huge pages using the method that is most appropriate for your Linux distribution.
Même dmesg me dit de le désactiver :'(&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dans cet article, je vais vous montrer à quoi ça sert, mais surtout comment on va faire pour le désactiver (le plus proprement possible).&lt;/p&gt;
&lt;h2 id="mais-au-fait-cest-quoi-"&gt;Mais au fait, c’est quoi ?
&lt;/h2&gt;&lt;p&gt;Avant de lui couper la chique, le mieux c’est quand même peut-être de savoir de quoi il s’agit avant de respecter les précos des éditeurs.&lt;/p&gt;
&lt;p&gt;Note : Ca me fait penser à &lt;a class="link" href="https://blog.zwindler.fr/2016/10/26/comprendre-configurer-selinux-rhel-7/" &gt;SELinux, la première chose qu’on nous demande de désactiver quand on installe un progiciel sur RHEL et qu’on connaît au final assez mal&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pour faire bref, la gestion de la mémoire par le CPU passe par une couche d’abstraction : la mémoire est découpée en pages de taille fixe (par défaut 4ko) et le CPU garde une table de correspondance de ces pages dans la MMU.&lt;/p&gt;
&lt;p&gt;Pour des raisons de performance, il peut être intéressant, sur nos systèmes récents ayant beaucoup de RAM, d’avoir des pages plus grosses pour faciliter le travail du CPU (aka des &amp;ldquo;huge pages&amp;rdquo;). Cependant, il est nécessaire de modifier le code de l’application pour tirer parti des HugePages. Arrive alors une autre couche d’abstraction, les Transparent Huge Pages. Vous avez deviné, pour faire ça de manière transparente !&lt;/p&gt;
&lt;p&gt;Je vous met en bas de l’article quelques liens pour comprendre en détail de quoi on parle.&lt;/p&gt;
&lt;h2 id="oneshot"&gt;Oneshot
&lt;/h2&gt;&lt;p&gt;Maintenant qu’on sait ce que c’est, on peut le désactiver en tout quiétude.&lt;/p&gt;
&lt;p&gt;Déjà, on va commencer par vérifier l’état de notre OS, pour savoir un peu où on en est au niveau des THP. Pour ça, un simple cat de &lt;em&gt;/sys/kernel/mm/transparent_hugepage/enabled&lt;/em&gt; nous donnera l’info :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Il existe 3 valeurs possibles pour ce paramètre : &lt;em&gt;always&lt;/em&gt;, &lt;em&gt;madvise&lt;/em&gt; et &lt;em&gt;never&lt;/em&gt;. always et never sont simples à comprendre, et pour ce qui est de madvise, il s’agit d’un paramètre intermédiaire qui dit que par défaut, les THP sont désactivées, mais que les applications peuvent utiliser un appel &amp;ldquo;madvise&amp;rdquo; pour allouer des THP dans la zone mémoire réservée pour ça.&lt;/p&gt;
&lt;p&gt;Ici, on va donc vouloir désactiver les THP totalement (donc &lt;em&gt;never&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Pour se faire, on peut simplement utiliser la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo never &amp;gt; /sys/kernel/mm/transparent_hugepage/enabled
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Attention cependant, le paramètre ne sera pris en compte que jusqu’au prochain reboot.&lt;/p&gt;
&lt;h2 id="les-méthodes-classiques-pour-désactiver-durablement-les-thp"&gt;Les méthodes classiques pour désactiver durablement les THP
&lt;/h2&gt;&lt;p&gt;A partir de là, on va vouloir le désactiver pour les prochains boots. On va donc devoir indiquer d’une manière ou d’une autre à l’OS qu’il faut désactiver ce paramètre, activé par défaut.&lt;/p&gt;
&lt;p&gt;La plupart des logiciels vous conseillent de faire un service qui ne fait que ça et qui sera lancé au démarrage de votre machine (ex. &lt;a class="link" href="https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/InstallationGuide/BeforeYouInstall/transparenthugepages.htm" target="_blank" rel="noopener"
&gt;vertica&lt;/a&gt;, &lt;a class="link" href="https://docs.couchbase.com/server/current/install/thp-disable.html" target="_blank" rel="noopener"
&gt;couchbase&lt;/a&gt;, &amp;hellip;).&lt;/p&gt;
&lt;p&gt;Je suis pas fan, je trouve que modifier un paramètre au démarrage ne devrait pas se faire comme ça.&lt;/p&gt;
&lt;p&gt;La façon la plus &amp;ldquo;propre&amp;rdquo; de le faire est probablement de modifier la configuration du bootloader (souvent GRUB). Si vous avez GRUB, c’est assez facile de le faire puisque c’est une option à ajouter dans le grub :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/default/grub
[...]
GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;console=tty1 console=ttyS0 earlyprintk=ttyS0 rootdelay=300&amp;#34;
GRUB_CMDLINE_LINUX=&amp;#34;&amp;#34;
[...]
## APRES
cat /etc/default/grub
[...]
GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;console=tty1 console=ttyS0 earlyprintk=ttyS0 rootdelay=300 transparent_hugepage=never&amp;#34;
GRUB_CMDLINE_LINUX=&amp;#34;&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cependant, cette méthode nécessite de reconstruire votre fichier grub (avec grub2-mkconfig) donc j’imagine que c’est pour cela que cette méthode n’est pas mise en avant.&lt;/p&gt;
&lt;h2 id="une-méthode-alternative-pour-désactiver-les-transparent-huge-pages"&gt;Une méthode alternative pour désactiver les transparent Huge Pages
&lt;/h2&gt;&lt;p&gt;Si vous ne vous sentez pas de modifier votre bootloader et que vous n’aimez pas, comme moi, l’idée de faire un service pour faire un echo au boot, il reste une dernière possibilité.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;apt install sysfsutils
echo &amp;#34;kernel/mm/transparent_hugepage/enabled = never&amp;#34; &amp;gt;&amp;gt; /etc/sysfs.conf
echo &amp;#34;never&amp;#34; &amp;gt;&amp;gt; /sys/kernel/mm/transparent_hugepage/enabled
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;L’avantage, c’est que, contrairement à la modif du GRUB, ça va être ultra simple du coup d’automatiser ça avec Ansible. Je vais pouvoir intégrer la modification dans mes playbooks d’installation des logiciels cités en début d’article !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;---
- hosts: all
become: yes
tasks:
- name: &amp;#34;Install sysfsutils&amp;#34;
apt:
name: &amp;#34;{{item}}&amp;#34;
state: present
loop:
- sysfsutils
- name: &amp;#34;Disable permanently Transparent Huge Pages&amp;#34;
lineinfile:
path: /etc/sysfs.conf
line: kernel/mm/transparent_hugepage/enabled = never
- name: &amp;#34;Disable THP for this boot&amp;#34;
shell: &amp;#34;echo &amp;#39;never&amp;#39; &amp;gt;&amp;gt; /sys/kernel/mm/transparent_hugepage/enabled&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et voilà :D&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.percona.com/blog/2019/03/06/settling-the-myth-of-transparent-hugepages-for-databases/" target="_blank" rel="noopener"
&gt;Settling the Myth of Transparent HugePages for Databases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://access.redhat.com/solutions/46111" target="_blank" rel="noopener"
&gt;How to use, monitor, and disable transparent hugepages in Red Hat Enterprise Linux 6 and 7?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/51246128/disabling-thp-transparent-hugepages-with-ansible-role" target="_blank" rel="noopener"
&gt;Disabling THP with Ansible&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[En bref] Agrandissement de swap sous Linux</title><link>https://blog.zwindler.fr/2016/02/06/reminder-agrandissement-de-swap-linux/</link><pubDate>Sat, 06 Feb 2016 11:30:44 +0000</pubDate><guid>https://blog.zwindler.fr/2016/02/06/reminder-agrandissement-de-swap-linux/</guid><description>&lt;img src="https://blog.zwindler.fr/2016/02/RedHatLogo.webp" alt="Featured image of post [En bref] Agrandissement de swap sous Linux" /&gt;&lt;h2 id="agrandir-la-swap-pourquoi-faire-"&gt;Agrandir la swap, pourquoi faire ?
&lt;/h2&gt;&lt;p&gt;Avec la montée en puissance de l’extension à chaud de RAM sur les machines virtuelles et l’explosion des tailles de JVM délirantes (20 Go pour un outil de gestion de projet pour 100 personnes. Allo&amp;hellip;) il est de plus en plus simple de se dire :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tiens, le vent souffle aujourd’hui, j’vais rajouter un peu de RAM à mes VMs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sauf qu’il arrive d’oublier les bonnes pratiques en vigueur dans votre propre contexte professionnel : 1 fois la RAM, 1,5 fois la RAM, 2 fois la RAM, 0,5 fois la RAM si on a plus de 8Go, 2Go quoiqu’il arrive (rayez les mentions inutiles).&lt;/p&gt;
&lt;p&gt;Ça et les templates, pour qui on ne différencie pas toujours les gros des petits serveurs, par flemme.&lt;/p&gt;
&lt;p&gt;Du coup, je me retrouve régulièrement à nettoyer des serveurs pour qui on a oublié d’agrandir la RAM après une extension. Et du coup, j’aime bien avoir sous la main la procédure pour le faire rapidement.&lt;/p&gt;
&lt;h2 id="les-commandes-pour-le-faire-sous-linux-rhel-6-en-loccurrence"&gt;Les commandes pour le faire sous Linux (RHEL 6 en l’occurrence)
&lt;/h2&gt;&lt;p&gt;Afficher des informations sur la swap&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;swapon -s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Récupérer/retrouver le device qui porte la swap dans la fstab&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;grep swap /etc/fstab
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vérifier que la swap n’est pas utilisée, ou à défaut, &lt;strong&gt;que toutes les pages swapées peuvent être stockées en mémoire&lt;/strong&gt; sinon &amp;hellip;!&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;free -m
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Désactivation de la swap&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;swapoff -a
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Agrandir le LV (si on a fait du LVM, sinon il faut agrandir ou créer une nouvelle partition ce qui peut être un peu plus casse pied) puis recréer le volume de swap à la nouvelle taille :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;lvextend -L +4G /dev/VolGroup00/LogVol01
mkswap /dev/VolGroup00/LogVol01
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Réactiver la swap&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;swapon -a
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vérifier la prise en compte&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;swapon -s
cat /proc/swaps #affiche la même chose mais j&amp;#39;aime bien
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="bonus--techniques-barbares-pour-faire-le-ménage"&gt;Bonus : techniques barbares pour faire le ménage
&lt;/h2&gt;&lt;p&gt;Je me rend le plus souvent compte que les serveurs n’ont pas les bonnes tailles de swap lorsque j’ai une alerte dans ma supervision.&lt;/p&gt;
&lt;h3 id="cycle-en-v--recherche-des-coupables"&gt;Cycle en V : recherche des coupables
&lt;/h3&gt;&lt;p&gt;Souvent, les gros systèmes taillés au plus juste swappent un peu, quelques centaines de Mo de temps en temps, lorsqu’un gros traitement se déclenche et qu’on dépasse la quantité de mémoire totale prévue. Mais parfois cela peut assi être un processus qui perd la boule et qui se met à consommer un max de mémoire (avec la réduction drastique des performances qui vont avec en cas de swap).&lt;/p&gt;
&lt;p&gt;Pour déterminer quel processus consomme le plus de swap sous Linux, on peut utiliser les commandes suivantes :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;free -m
------total        used        free        shared        buffers        cached
Mem:           3948      3186         761                 0                 17             1593
-/+ buffers/cache:      1575      2372
Swap:           4000              0      4000
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;3948 la quantité totale de RAM du système&lt;/li&gt;
&lt;li&gt;3186 et 761 représentent respectivement les quantités de RAM utilisée et disponible, sans tenir compte de ce qui est utilisable en cache/buffer&lt;/li&gt;
&lt;li&gt;2372 représente la quantité réelle de mémoire disponible (soit pas du tout utilisée, soit dans un cache qui pourra être libéré si nécessaire)&lt;/li&gt;
&lt;li&gt;1575 représente la quantité réellement utilisée par les processus&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si votre système est récent (procps-ng) l’affichage sera un peu différent car les buffers et le cache ont été regroupés dans une même colonne, sur la même ligne que la mémoire. Et c’est tant mieux car c’est plus clair comme ça, je trouve :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;free -m
------total        used        free      shared  buff/cache   available
Mem:               993         353       329              37              309           447
Swap:            2079             0       2079
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;993 la quantité totale de RAM du système&lt;/li&gt;
&lt;li&gt;353 représente la quantité réellement utilisée par les processus&lt;/li&gt;
&lt;li&gt;329 représente la quantité de mémoire pas du tout utilisée (ni par des processus, ni par des caches)&lt;/li&gt;
&lt;li&gt;447 représente une estimation de la quantité réelle de mémoire disponible pour d’autres processus avant que le système ne se mette à swaper (soit pas du tout utilisée, soit dans un cache qui pourra être libéré si nécessaire)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dans certaines versions de top, il est possible d’obtenir un tri par processus de l’utilisation de la swap, notamment avec RHEL/CentOS, jusqu’à version 6 qui utilise &lt;strong&gt;procps&lt;/strong&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;top
O #o majuscule
p #p minucule
[touche entrée]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La commande top devrait alors lister les processus en fonction de leur utilisation de SWAP&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;PID USER PR VIRT NI SHR SWAP S %CPU %MEM TIME+ RES COMMAND
4390 root 18 2449m 0 2276 2.0g S 0 9.3 185:11.98 367m mrmonitord
4316 root 34 1566m 19 1976 1.1g S 0 10.7 4:15.62 423m yum-updatesd
4385 root 18 1141m 0 1476 1.1g S 0 0.6 423:19.03 23m java
22009 apache 15 385m 0 4708 360m S 0 0.6 0:20.40 25m httpd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cependant, cet affichage n’est pas totalement exact et c’est pour cela que cette fonction n’existe pas toujours dans top. C’est notamment vrai pour les dernières versions de Debian/Ubuntu et de RHEL 7 qui utilisent procps**-ng**.&lt;br&gt;
Personnellement je trouve que ça donne un bon aperçu des processus qui sont en train de swapper en cas de recherche d’un coupable. Si vous voulez plus d’information là dessus, je vous conseille de lire la partie « A note about top command » de &lt;a class="link" href="https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/" target="_blank" rel="noopener"
&gt;cet article&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="faire-un-peu-de-ménage"&gt;Faire un peu de ménage
&lt;/h3&gt;&lt;p&gt;Certains d’entre vous trouveront peut être plus simple de le relancer (quand cela est possible). Ceci pourrait rendre de la mémoire au serveur qui se mettra à arrêter de swapper. Pour autant, la mémoire swappée ne sera pas forcément rendue, et l’alerte en supervision restera présente même si l’incident est terminé&amp;hellip;&lt;/p&gt;
&lt;p&gt;Du coup, voici quelques tips supplémentaires pour faire du ménage dans les caches pour libérer la mémoire réservée mais pas forcément nécessaire :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Libération du pagecache&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo 1 &amp;gt; /proc/sys/vm/drop_caches
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Libération des dentries et des inodes&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo 2 &amp;gt; /proc/sys/vm/drop_caches
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Tout libérer d’un coup&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo 3 &amp;gt; /proc/sys/vm/drop_caches
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="tout-péter"&gt;Tout péter
&lt;/h3&gt;&lt;p&gt;Si vous vous sentez d’humeur guerrière et que vous pensez que tout ce qui est dans la swap peut re-rentrer en RAM, vous pouvez toujours désactiver la swap. Ceci aura pour effet de vider complètement la swap et donc de tout rappatrier en RAM. Il va sans dire que si vous vous êtes trompé, le système se bloquera et vous pourrez appuyer longuement sur le bouton « Power ».&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;swapoff -a #extinction de la swap
swapon -a #relance de la swap
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vous voilà prévenus ;)&lt;/p&gt;</description></item></channel></rss>