{"id":1563,"date":"2014-04-25T08:00:47","date_gmt":"2014-04-25T06:00:47","guid":{"rendered":"http:\/\/www.unicoda.com\/?p=1563"},"modified":"2014-04-16T14:47:19","modified_gmt":"2014-04-16T12:47:19","slug":"limiter-la-ram-disponible-pour-mongo","status":"publish","type":"post","link":"https:\/\/www.unicoda.com\/?p=1563","title":{"rendered":"Limiter la RAM disponible pour Mongo"},"content":{"rendered":"<p>Pour des besoins de test, et notamment dans le but de mesurer les performances et d&rsquo;analyser le comportement de Mongo avec diff\u00e9rentes quantit\u00e9s de m\u00e9moire vive, je me suis pench\u00e9 sur la fa\u00e7on de restreindre les ressources pour un processus donn\u00e9 sous GNU\/Linux.<\/p>\n<p>Je me suis d&rsquo;abord tourn\u00e9 vers <em>ulimit <\/em>qui semblait permettre de restreindre explicitement la ram, avec en particulier la commande suivante:<\/p>\n<pre>ulimit -Hm 30000<\/pre>\n<p>Pour la m\u00e9moire virtuel, on remplace le m par un v, par exemple:<\/p>\n<pre>ulimit -Sv 200000<\/pre>\n<p>Cette fa\u00e7on de faire n&rsquo;\u00e9tait malheureusement pas satisfaisante. En surveillant mon mongo avec mongostat, je constate que celui-ci d\u00e9passe largement les limites impos\u00e9es. Je me tourne donc vers une autre solution: les <a href=\"http:\/\/en.wikipedia.org\/wiki\/Cgroups\" target=\"_blank\">cgroups<\/a>.<\/p>\n<p>Reprenons la d\u00e9finition de Wikip\u00e9dia, les cgroups sont une fonctionnalit\u00e9 du noyau Linux permettant de \u00ab limiter, compter et isoler l&rsquo;utilisation des ressources \u00bb. \u00c7a tombe bien, c&rsquo;est exactement ce que je cherche \u00e0 faire. En bonus, les cgroups sont utilis\u00e9s par les <em><b>LinuX Containers<\/b><\/em> (LXC), proc\u00e9d\u00e9 de \u00ab virtualisation l\u00e9g\u00e8re \u00bb, une raison de plus de s&rsquo;y int\u00e9resser.<\/p>\n<p>Revenons \u00e0 notre probl\u00e9matique de limitation de la ram de mongo. Dans un premier temps, il est n\u00e9cessaire de pr\u00e9parer l&rsquo;environnement:<\/p>\n<pre>aptitude install libcgroup1<\/pre>\n<p>Si le paquet n&rsquo;est pas disponible sous ce nom l\u00e0, une simple recherche de cgroup devrait permettre de le trouver. Nous allons tout d&rsquo;abord cr\u00e9er un nouveau cgroup qui nous permettra d&rsquo;appliquer les limitations:<\/p>\n<pre>sudo cgcreate -t &lt;<b>user<\/b>&gt; -a &lt;<b>user<\/b>&gt; -g memory,cpu:&lt;<b>groupname<\/b>&gt;<\/pre>\n<p>Ici, notre cgroup pourra imposer des limites sur la m\u00e9moire (<em>memory<\/em>) et le processeur (<em>cpu<\/em>).\u00a0 Nous pouvons maintenant d\u00e9finir les param\u00e8tres de notre groupe, en terme de m\u00e9moire notamment:<\/p>\n<pre>echo 33000000 &gt; \/sys\/fs\/cgroup\/memory\/&lt;<b>groupname<\/b>&gt;\/memory.limit_in_bytes<\/pre>\n<p>Ici, nous limitons la m\u00e9moire vive \u00e0 33 Mo pour notre cgroup. Des raccourcis existent pour l&rsquo;\u00e9criture des quantit\u00e9s d&rsquo;octets, on pourrait par exemple remplacer <em>33000000<\/em> par <em>33M<\/em>. Il ne nous reste plus qu&rsquo;\u00e0 d\u00e9marrer notre processus mongo avec ces restrictions:<\/p>\n<pre>cgexec -g memory:&lt;<b>groupname<\/b>&gt; mongod<\/pre>\n<p>En surveillant notre mongo avec mongostat, nous pouvons ainsi constater une augmentation du nombre de \u00ab\u00a0page faults\u00a0\u00bb lorsque nous r\u00e9duisons la m\u00e9moire disponible de mani\u00e8re significative et constater que mongo prend bien en compte la limite.<\/p>\n<p>Voil\u00e0 donc un court exemple qui permet d&rsquo;\u00e9viter de saturer sa ram en totalit\u00e9 avant de pouvoir commencer des tests sur mongo, notamment en ce qui concerne l&rsquo;\u00e9tude du nombre de \u00ab\u00a0page faults\u00a0\u00bb en fonction du working set et de la ram disponible. Ce proc\u00e9d\u00e9 peut bien s\u00fbr \u00eatre appliquer \u00e0 d&rsquo;autres processus pour \u00e9viter qu&rsquo;ils ne consomment toutes les ressources de la machine. Pour de plus amples d&rsquo;informations sur le sujet, on se tournera vers le <a href=\"https:\/\/wiki.archlinux.org\/index.php\/Cgroups\" target=\"_blank\">wiki Arch Linux<\/a> ou encore ce <a href=\"https:\/\/access.redhat.com\/site\/documentation\/en-US\/Red_Hat_Enterprise_Linux\/6\/html\/Resource_Management_Guide\/ch01.html\" target=\"_blank\">guide Red Hat<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pour des besoins de test, et notamment dans le but de mesurer les performances et d&rsquo;analyser le comportement de Mongo avec diff\u00e9rentes quantit\u00e9s de m\u00e9moire vive, je me suis pench\u00e9 sur la fa\u00e7on de restreindre les ressources pour un processus donn\u00e9 sous GNU\/Linux. Je me suis d&rsquo;abord tourn\u00e9 vers ulimit qui semblait permettre de restreindre &hellip; <a href=\"https:\/\/www.unicoda.com\/?p=1563\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;Limiter la RAM disponible pour Mongo&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[39,40,5],"tags":[172,174,156,173],"class_list":["post-1563","post","type-post","status-publish","format-standard","hentry","category-decouvertes","category-info","category-terminal","tag-cgroups","tag-limit","tag-mongodb","tag-ram"],"_links":{"self":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/1563","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1563"}],"version-history":[{"count":3,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/1563\/revisions"}],"predecessor-version":[{"id":1569,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/1563\/revisions\/1569"}],"wp:attachment":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1563"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1563"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1563"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}