{"id":1431,"date":"2020-08-17T17:32:46","date_gmt":"2020-08-17T15:32:46","guid":{"rendered":"http:\/\/blogperso.union31.fr\/?p=1431"},"modified":"2020-08-19T08:48:50","modified_gmt":"2020-08-19T06:48:50","slug":"node-js-module-pm2-et-artillery","status":"publish","type":"post","link":"https:\/\/blogperso.union31.fr\/?p=1431","title":{"rendered":"Node.js : Module PM2 et Artillery"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Sommaire<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/blogperso.union31.fr\/?p=1431\/#Module_PM2_gestionnaire_dapplications_javascript\" >Module PM2 : gestionnaire d&rsquo;applications javascript<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/blogperso.union31.fr\/?p=1431\/#Module_Artillery_outil_pour_faire_un_test_de_charge\" >Module Artillery : outil pour faire un test de charge<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Module_PM2_gestionnaire_dapplications_javascript\"><\/span>Module PM2 : gestionnaire d&rsquo;applications javascript<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Ce module global est un gestionnaire d&rsquo;applications js. Il permet principalement de relancer l&rsquo;application :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li> d\u00e8s qu&rsquo;un fichier est modifi\u00e9 ;<\/li><li>d\u00e8s qu&rsquo;une erreur survient et qui fait planter l&rsquo;application web (par defaut l&rsquo;application ne marche plus et il faut la relancer manuellement)<\/li><\/ul>\n\n\n\n<p>Doc  officielle : <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/Unitech\/pm2\" target=\"_blank\">https:\/\/github.com\/Unitech\/pm2<\/a> et <a rel=\"noreferrer noopener\" href=\"https:\/\/pm2.keymetrics.io\/\" target=\"_blank\">https:\/\/pm2.keymetrics.io\/<\/a><\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\">Installation : <\/span><\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<pre class=\"wp-block-code\"><code>npm install pm2 -g<\/code><\/pre>\n\n\n\n<p><span style=\"text-decoration: underline;\">Lancement d&rsquo;une application avec PM2 :<\/span><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pm2 start index.js<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"72\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_listprocess-1024x72.png\" alt=\"\" class=\"wp-image-1410\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_listprocess-1024x72.png 1024w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_listprocess-300x21.png 300w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_listprocess-768x54.png 768w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_listprocess.png 1351w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Exemple de sortie de la commande PM2 start xxx.js<\/figcaption><\/figure>\n\n\n\n<p><span style=\"text-decoration: underline;\">Arr\u00eat d&rsquo;une application :<\/span><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pm2 stop index<\/code><\/pre>\n\n\n\n<p><span style=\"text-decoration: underline;\">Restart d&rsquo;une appli :<\/span><\/p>\n<\/div><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>pm2 restart index<\/code><\/pre>\n\n\n\n<p>Lister les applications prises en charge :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pm2 ls<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"785\" height=\"115\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_ls.png\" alt=\"\" class=\"wp-image-1437\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_ls.png 785w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_ls-300x44.png 300w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_ls-768x113.png 768w\" sizes=\"auto, (max-width: 785px) 100vw, 785px\" \/><\/figure>\n\n\n\n<p><span style=\"text-decoration: underline;\">D\u00e9senregistrement d&rsquo;une application :<\/span><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pm2 delete index<\/code><\/pre>\n\n\n\n<p><span style=\"text-decoration: underline;\">Visualiser les logs :<\/span><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pm2 logs<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"383\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_logs-1024x383.png\" alt=\"\" class=\"wp-image-1415\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_logs-1024x383.png 1024w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_logs-300x112.png 300w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_logs-768x287.png 768w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_logs.png 1251w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Exemple de sortie pour la commande PM2 logs<\/figcaption><\/figure>\n\n\n\n<p><span style=\"text-decoration: underline;\">Autres commandes pour les logs :<\/span><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ pm2 logs APP-NAME       # Display APP-NAME logs\n$ pm2 logs --json         # JSON output\n$ pm2 logs --format       # Formated output\n\n$ pm2 flush               # Flush all logs\n$ pm2 reloadLogs          # Reload all logs<\/pre>\n\n\n\n<p><span style=\"text-decoration: underline;\">Monitorer ses applications :<\/span><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pm2 monit<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"397\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_monit-1024x397.png\" alt=\"\" class=\"wp-image-1420\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_monit-1024x397.png 1024w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_monit-300x116.png 300w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_monit-768x297.png 768w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_monit.png 1407w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Le mode clusteur (de processeur)<\/p>\n\n\n\n<p>Une application tourne sur un processeur par d\u00e9faut. Il est possible de cr\u00e9er une instance par processeur.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>>pm2 start index.js -i 4<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"152\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_cluster-1024x152.png\" alt=\"\" class=\"wp-image-1423\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_cluster-1024x152.png 1024w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_cluster-300x45.png 300w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_cluster-768x114.png 768w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_cluster.png 1353w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>R\u00e9sultat pour la mise en cluster d&rsquo;une application sur 4 processeurs<\/figcaption><\/figure>\n\n\n\n<p>Pour changer dynamiquement le nombre de CPU \u00e0 utiliser :<\/p>\n\n\n\n<p>pm2 scale index 2<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"148\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_cluster2-1024x148.png\" alt=\"\" class=\"wp-image-1428\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_cluster2-1024x148.png 1024w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_cluster2-300x43.png 300w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_cluster2-768x111.png 768w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_cluster2.png 1356w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Pour visualiser en temps r\u00e9\u00e9l la charge :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pm2 imonit<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"850\" height=\"159\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_imonit.png\" alt=\"\" class=\"wp-image-1433\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_imonit.png 850w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_imonit-300x56.png 300w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2020\/08\/PM2_imonit-768x144.png 768w\" sizes=\"auto, (max-width: 850px) 100vw, 850px\" \/><figcaption>Visualisation des ressources m\u00e9moire et CPU de chaque instance<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Module_Artillery_outil_pour_faire_un_test_de_charge\"><\/span>Module Artillery : outil pour faire un test de charge <span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Installation :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install artillery -g<\/code><\/pre>\n\n\n\n<p><span style=\"text-decoration: underline;\">Utilisation :<\/span><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>artillery quick -d 10 -r 100 -n 20 http:\/\/127.0.0.1:8080<\/code><\/pre>\n\n\n\n<p>Sur 10s, 100 nouveaux utilisateurs par secondes qui vont faire 20 requ\u00eates, soit 20 000 requ\u00eates au total sur 10s.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Module PM2 : gestionnaire d&rsquo;applications javascript Ce module global est un gestionnaire d&rsquo;applications js. Il permet principalement de relancer l&rsquo;application : d\u00e8s qu&rsquo;un fichier est modifi\u00e9 ; d\u00e8s qu&rsquo;une erreur survient et qui fait planter l&rsquo;application web (par defaut l&rsquo;application<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1431","post","type-post","status-publish","format-standard","hentry","category-_dev"],"_links":{"self":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/1431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1431"}],"version-history":[{"count":4,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/1431\/revisions"}],"predecessor-version":[{"id":1438,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/1431\/revisions\/1438"}],"wp:attachment":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}