{"id":1821,"date":"2013-02-14T10:51:42","date_gmt":"2013-02-14T09:51:42","guid":{"rendered":"https:\/\/www.digdeo.fr\/?p=1821"},"modified":"2022-03-15T19:31:18","modified_gmt":"2022-03-15T18:31:18","slug":"queryperf-stress-test-dns-performances","status":"publish","type":"post","link":"https:\/\/www.digdeo.fr\/articles\/sys-admin\/queryperf-stress-test-dns-performances","title":{"rendered":"Queryperf DNS tir de performance et stress test"},"content":{"rendered":"\n<p>Afin de valider des changements d&rsquo;architecture DNS ou d&rsquo;\u00e9valuer un choix de logiciel ou encore la capacit\u00e9 d&rsquo;un serveur au travers de son architecture r\u00e9seau, il faut pouvoir tester pour conna\u00eetre les limites d&rsquo;exploitation des services.<\/p>\n\n\n\n\n\n\n\n<h2 class=\"wp-block-heading\">Bind Queryperf<\/h2>\n\n\n\n<p>En cherchant les outils susceptibles de pouvoir r\u00e9aliser des tirs de performances DNS, il n&rsquo;existe globalement que JMeter qui est capable d&rsquo;int\u00e9grer un tel test. N\u00e9anmoins nous l&rsquo;avons \u00e9cart\u00e9 car nous souhaitons pouvoir r\u00e9aliser les tests sur chaque serveur DNS, puis rejouer ces tests en s&rsquo;\u00e9loignant du serveur jusqu&rsquo;\u00e0 si possible une machine neutre quelconque sur Internet.<\/p>\n\n\n\n<p>Si le web est rempli de testeur de performance et d&rsquo;efficacit\u00e9 DNS, c&rsquo;est la plupart du temps pour tester le temps de r\u00e9ponse de divers resolvers DNS pour savoir si celui de son FAI est plus ou moins performant par rapport \u00e0 d&rsquo;autres. Cela sort donc du sujet initial.<\/p>\n\n\n\n<p>Nous avons trouv\u00e9 l&rsquo;outil simple et efficace dans les contributions de Bind. En effet un petit utilitaire nomm\u00e9 <strong>queryperf<\/strong> permet de remplir ces tests. Il prend en param\u00e8tre un fichier texte avec les requ\u00eates qu&rsquo;il doit effectuer. Ce fichier de sc\u00e9narios va \u00eatre utile pour rejouer exactement les m\u00eames tests depuis plusieurs endroits et ainsi d\u00e9tecter tout goulot d&rsquo;\u00e9tranglement ou anomalie. On va aussi pouvoir introduire plusieurs hypoth\u00e8se comme interroger des enregistrements des zones g\u00e9r\u00e9es par le serveur DNS comme interroger des zones ou des enregistrements qui n&rsquo;existent pas sur le serveur et voir comment il se comporte.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Installation Bind queryperf<\/h3>\n\n\n\n<p>Queryperf sur Debian \/ Ubuntu est tr\u00e8s simple \u00e0 compiler, on r\u00e9cup\u00e8re les sources de Bind et on compile l&rsquo;utilitaire.<\/p>\n\n\n\n<p>Sur la version 9.7.3 queryperf ne sait pas g\u00e9rer les enregistrements SPF et DS ce qui cause des erreurs du type : \u00ab\u00a0Query type not understood: SPF\u00a0\u00bb et \u00ab\u00a0Query type not understood: DS\u00a0\u00bb. Aussi voici un patch \u00e0 appliquer avant de lancer la compilation.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>--- queryperf.c.orig 2013-02-14 10:13:40.719397645 +0100\n +++ queryperf.c 2013-02-14 10:15:42.027403509 +0100\n @@ -85,13 +85,13 @@\n #define QTYPE_STRINGS { \n \"A\", \"NS\", \"MD\", \"MF\", \"CNAME\", \"SOA\", \"MB\", \"MG\", \n \"MR\", \"NULL\", \"WKS\", \"PTR\", \"HINFO\", \"MINFO\", \"MX\", \"TXT\", \n - \"AAAA\", \"SRV\", \"NAPTR\", \"A6\", \"AXFR\", \"MAILB\", \"MAILA\", \"*\", \"ANY\" \n + \"AAAA\", \"SRV\", \"NAPTR\", \"A6\", \"DS\", \"SPF\", \"AXFR\", \"MAILB\", \"MAILA\", \"*\", \"ANY\" \n }<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>#define QTYPE_CODES { \n 1, 2, 3, 4, 5, 6, 7, 8, \n 9, 10, 11, 12, 13, 14, 15, 16, \n - 28, 33, 35, 38, 252, 253, 254, 255, 255 \n + 28, 33, 35, 38, 43, 99, 252, 253, 254, 255, 255 \n }<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\n apt-get source bind9\n cd bind9-9.7.3.dfsg\/contrib\/queryperf\n .\/configure &amp;&amp; make\n <\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Rejouer du trafic DNS r\u00e9el<\/h2>\n\n\n\n<p>Lorsque l&rsquo;on fait des tirs de performances, rien de plus int\u00e9ressant que de rejouer du trafic r\u00e9el. Pour cela il faut capturer le trafic sur un laps de temps, ce qui nous donnera un fichier des requ\u00eates demand\u00e9es \u00e0 un serveur DNS, puis on pr\u00e9pare d&rsquo;apr\u00e8s ces requ\u00eates le fichier de test de sc\u00e9narios pour queryperf.<\/p>\n\n\n\n<p>Rien de plus simple avec un Bind suivi en m\u00e9trologie, puisque vous aurez sans doute d\u00e9j\u00e0 activ\u00e9 la journalisation des requ\u00eates sur une certaine p\u00e9riode afin d&rsquo;en tirer des statistiques. Pour rappel voil\u00e0 ce qu&rsquo;il faut d\u00e9clarer dans votre <strong>\/etc\/bind\/named.conf.options<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n logging {\n channel query {\n file \"\/var\/run\/named\/query.log\" versions 2 size 1m;\n print-time yes;\n severity info;\n };\n category queries { query; };\n };\n <\/code><\/pre>\n\n\n\n<p>Les lignes de log sont sous la forme :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> # pour de l'ipv4\n14-Feb-2013 09:54:30.266 client 192.93.X.X#31792: query: ns-02.digdeo.eu IN A -EDC (X.X.X.X)\n\n # pour de l'ipv6\n14-Feb-2013 09:54:26.971 client 2001:X:X:X:X:X:X:X#25495: query: ns-01.digdeo.com IN AAAA -EDC (2001:X:X:X::X)<\/code><\/pre>\n\n\n\n<p>On va donc extraire les informations qui nous int\u00e9resse. Pour avoir un maximum de requ\u00eates nous allons prendre tous les fichiers query.log.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n cat \/var\/run\/query.log* | awk '{ print $6, $8 }' &gt; liste\n <\/code><\/pre>\n\n\n\n<p>Le r\u00e9sultat nous donnera donc les enregistrements demand\u00e9s et leurs type DNS.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n ns-01.digdeo.com A\n ns-01.digdeo.com AAAA\n <\/code><\/pre>\n\n\n\n<p>Il ne reste plus qu&rsquo;\u00e0 lancer le tir de performance \u00e0 partir de ce fichier. Pour commencer nous faisons le test en local ou sur une machine proche sans \u00e9l\u00e9ment actif entre les deux afin d&rsquo;enlever toute contrainte r\u00e9seau \/ firewall \/ latence. Ainsi nous pourrons \u00e9valuer les performances brutes du serveur DNS.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> .\/queryperf -d list -s 127.0.0.1 -t 1Statistics:Parse input file: once\n Ended due to: reaching end of fileQueries sent: 425682 queries\n Queries completed: 424460 queries\n Queries lost: 1222 queries\n Queries delayed(?): 0 queries&gt;RTT max: 0.966948 sec\n RTT min: 0.000004 sec\n RTT average: 0.000207 sec\n RTT std deviation: 0.001559 sec\n RTT out of range: 0 queries\n Percentage completed: 99.71%\n Percentage lost: 0.29%\n Started at: Thu Feb 14 10:27:18 2013\n Finished at: Thu Feb 14 10:28:26 2013\n Ran for: 67.791860 seconds\n Queries per second: 6261.223693 qps<\/code><\/pre>\n\n\n\n<p>Ce premier tir de performance met en \u00e9vidence le souci des anciens domaines h\u00e9berg\u00e9s sur ce serveur dns qui ont \u00e9t\u00e9 d\u00e9plac\u00e9s et donc des requ\u00eates sont toujours effectu\u00e9es par certains clients DNS. Cela cause des erreurs du type : \u00ab\u00a0[Timeout] Query timed out: msg id 31235\u00a0\u00bb ou bien dans le syslog \u00ab\u00a0named[1519]: error (unexpected RCODE REFUSED) resolving\u00a0\u00bb et \u00ab\u00a0named[19503]: lame server resolving\u00a0\u00bb. Ces erreurs sont normales car nous sommes en pr\u00e9sence d&rsquo;un DNS autoritaire et non d&rsquo;un DNS r\u00e9cursif. En filtrant les quelques domaines posant des soucis, les r\u00e9sultats sont bien meilleurs puisque tous les threads de queryperf n&rsquo;ont pas rencontr\u00e9 d&rsquo;obstacle particulier.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nStatistics:\nParse input file: once\n Ended due to: reaching end of file\nQueries sent: 424458 queries\n Queries completed: 424458 queries\n Queries lost: 0 queries\n Queries delayed(?): 0 queries\nRTT max: 0.033989 sec\n RTT min: 0.000068 sec\n RTT average: 0.000524 sec\n RTT std deviation: 0.000271 sec\n RTT out of range: 0 queries\nPercentage completed: 100.00%\n Percentage lost: 0.00%\nStarted at: Thu Feb 14 10:34:20 2013\n Finished at: Thu Feb 14 10:34:31 2013\n Ran for: 11.430219 seconds\nQueries per second: 37134.721566 qps<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">37 mille requ\u00eates par secondes pour 424458 requ\u00eates DNS jou\u00e9es en 11,4 secondes c'est d\u00e9j\u00e0 beaucoup mieux.<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Test \u00e0 distance<\/h2>\n\n\n\n<p>A pr\u00e9sent vous pouvez vous \u00e9loigner au fur et \u00e0 mesure de votre serveur DNS et voir si les r\u00e9sultats changent. Il se pourrait notamment que vous mettiez en \u00e9vidence des limitations UDP sur certains \u00e9quipements et\/ou prestataires r\u00e9seaux. Il convient notamment de voir avec vos prestataires comment peuvent \u00eatre r\u00e9alis\u00e9 ce type de tests au travers de leurs architectures, car si ils n&rsquo;ont pas de protection sp\u00e9cifiques cela pourrait occasionn\u00e9 des effets de bord.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Queryperf pour la mesure de performance des serveurs DNS afin d&rsquo;\u00e9valuer la capacit\u00e9 de r\u00e9ponse des services de nom de domaine.<\/p>\n","protected":false},"author":2,"featured_media":3017,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[38,18,39,37,40,41],"class_list":["post-1821","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sys-admin","tag-bind","tag-debian","tag-dns","tag-ipv4-ipv6","tag-stress-test","tag-tir-de-performance"],"_links":{"self":[{"href":"https:\/\/www.digdeo.fr\/articles\/wp-json\/wp\/v2\/posts\/1821","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.digdeo.fr\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.digdeo.fr\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.digdeo.fr\/articles\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.digdeo.fr\/articles\/wp-json\/wp\/v2\/comments?post=1821"}],"version-history":[{"count":6,"href":"https:\/\/www.digdeo.fr\/articles\/wp-json\/wp\/v2\/posts\/1821\/revisions"}],"predecessor-version":[{"id":3024,"href":"https:\/\/www.digdeo.fr\/articles\/wp-json\/wp\/v2\/posts\/1821\/revisions\/3024"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.digdeo.fr\/articles\/wp-json\/wp\/v2\/media\/3017"}],"wp:attachment":[{"href":"https:\/\/www.digdeo.fr\/articles\/wp-json\/wp\/v2\/media?parent=1821"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.digdeo.fr\/articles\/wp-json\/wp\/v2\/categories?post=1821"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.digdeo.fr\/articles\/wp-json\/wp\/v2\/tags?post=1821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}