2 votes

Utilisation excessive de la mémoire par le DNSCache Windows Server 2008 R2

Nous avons un problème avec le service dnscache dont l'utilisation de la mémoire devient excessive (~6GB) après une semaine ou deux.

Le redémarrage du service libère cette mémoire mais l'exécution de ipconfig /flushdns ne le fait pas, un ipconfig /displaydns montre environ 15-20 entrées dans le cache.

Nous avons vérifié et il semble qu'il y ait environ 150 requêtes DNS par seconde, mais je ne m'attends pas à ce que cela ait pour effet de causer ce problème de mémoire.

J'ai essayé de rechercher des correctifs ou des rapports de bogue sur MSDN, mais je n'ai pu trouver qu'une référence à une fuite de mémoire dans Windows 2003. Quelqu'un peut-il me suggérer la marche à suivre ?

0 votes

Qu'est-ce que le "service dnscache" ? Je n'en ai jamais entendu parler et je ne trouve aucun service de ce nom sur aucun de mes serveurs DNS W2K8R2.

0 votes

Dans le service client DNS, le processus est appelé DNSCache.

0 votes

Il s'agit donc d'un client DNS et non d'un serveur DNS ? Qu'est-ce que ce client cherche 150 fois par seconde ?

2voto

Matthew Johnson Points 360

Étant donné que vous avez déjà recherché les correctifs, je suppose que votre serveur est déjà à jour avec le dernier Service Pack Windows et qu'il dispose de toutes les mises à jour ? C'est toujours le meilleur point de départ.

Avec une taille de cache de 6 Go, nous parlons de dizaines de millions de résultats de DNS uniques (ce qui est absurde). Il est peu probable que vos clients fassent autant de requêtes DNS uniques. Dans les commentaires de votre question, vous indiquez que l'application effectue des recherches chaque fois qu'un client envoie des données au serveur. Je ne sais pas comment fonctionne l'application (je suppose qu'il s'agit d'une application web) sur votre serveur, mais je me demande si un événement ne crée pas des requêtes DNS uniques à chaque demande du client, requêtes qui sont retournées comme des domaines inexistants. Je suppose que si la requête DNS atteint un domaine avec un joker, elle peut renvoyer des réponses valides. Dans tous les cas, cela pourrait expliquer la taille énorme du cache.

Ipconfig /displaydns ne renvoie pas toujours la totalité du cache, ce qui expliquerait pourquoi vous ne voyez que 15-20 entrées.

Vous pouvez (du moins je peux) le confirmer en effectuant ce qui suit

Depuis une invite Powershell :

> ipconfig /flushdns
> [System.Net.Dns]::GetHostAddresses(“google.com”)

Vérifiez le cache DNS

> ipconfig /displaydns

Vous verrez probablement l'entrée Google.com. Notez la taille du cache à l'aide du gestionnaire de tâches (dans le gestionnaire de tâches, trouvez le service dnscache, cliquez dessus avec le bouton droit de la souris et sélectionnez aller au processus).

Exécutez maintenant la commande suivante, où ### est un grand nombre (j'ai utilisé 10 000). Notez que j'ai configuré mon serveur DNS local pour qu'il réponde à tous les sous-domaines .test avec un joker afin de ne pas toucher le serveur DNS de mon FAI 10 000 fois en peu de temps.

> $i = 0
> do {[System.Net.Dns]::GetHostAddresses(“blahblahfakedomain” + $i++ + “.test”)} while ($i –lt ###)

Pendant l'exécution de la commande, observez l'utilisation de la mémoire du processus de cache dans le Gestionnaire des tâches. Une fois la commande terminée, vérifiez le cache. Vous ne verrez probablement pas les ### quires que nous venons de générer, mais le processus de cache DNS n'a pas libéré la mémoire.

Dans mes expériences, j'ai pu récupérer la mémoire en vidant le cache DNS (10 000 requêtes représentent environ 2 mégas). Je ne sais pas pourquoi cela ne fonctionne pas pour vous. Peut-être parce que le cache est si gros ?

Quoi qu'il en soit, je propose la solution de rechange suivante :

Modifiez le MaxCacheTtl y MaxNegativeCacheTtl sous l'onglet HKEY_LOCAL_MACHINE \SYSTEM\CurrentControlSet\Services\Dnscache\Parameters touche par ( http://support.microsoft.com/kb/318803 ) :

Modifier ou créer la valeur DWord MaxCacheTtl Pour cela, réglez-le sur une valeur faible, comme 3600 secondes (0xE10 en hexadécimal). Toutes les valeurs sont indiquées en secondes. La valeur par défaut est 1 jour (86 400 secondes).

Modifier ou créer la valeur DWord MaxNegativeCacheTtl en le mettant à 0.

Ainsi, tous les enregistrements seront effacés du cache au maximum une heure après leur ajout. Les résultats négatifs (domaines inexistants) ne seront pas du tout stockés dans le cache (je l'ai confirmé sur mon bureau Windows 7).

J'appelle cela une solution de contournement car je dirais que le problème réside dans le processus qui crée la quantité absurde de demandes. Si vous le pouvez, essayez d'étouffer le torrent de demandes à la source.

0 votes

Merci pour votre aide, mais nous avons trouvé une solution de contournement, voir la réponse que j'ai postée. Pourriez-vous jeter un coup d'œil à la trace Wireshark pour voir s'il y a quelque chose qui pourrait causer ce problème ?

0 votes

@MikeT, je suis heureux que vous ayez pu trouver une solution de contournement. Malheureusement, les informations fournies dans votre nouveau message ne sont pas suffisantes (du moins pour moi) pour déterminer la cause du problème. Pouvez-vous fournir d'autres informations ? Par exemple, les 150 demandes DNS par seconde étaient-elles toutes identiques à celle que vous avez listée ? Votre capture a-t-elle été exécutée sur toutes les interfaces ? Désolé, je ne pouvais pas commenter sous votre nouveau post. Pas encore assez de points...

0 votes

Toutes les requêtes DNS étaient identiques à celle-ci d'après ce que j'ai pu voir, je n'étais pas sûr que le TTL du cname étant plus long que celui de l'enregistrement A causerait des problèmes de cache. incidemment, l'utilisation de la mémoire du cache reste stable à 6 Mo, ce sont donc ces requêtes qui ont causé le problème.

1voto

Tim Points 11

Il y a beaucoup de discussions sur l'utilisation élevée de la mémoire de DNS sur Windows 2008 R2. Beaucoup d'entre elles pointent vers la désactivation d'EDNS, ce qui ne diminue pas l'utilisation de la mémoire. Le vrai problème est en fait dû aux ports que DNS ouvre : 2500 UDP IPv4 et 2500 UDP IPv6. C'est un chiffre raisonnable pour un serveur DNS de production très actif, mais pour un DNS interne dans un petit bureau, c'est beaucoup trop.

Pour diminuer le nombre de ports ouverts, exécutez la commande suivante. Pour un DNS interne, avec environ 20 personnes dans le bureau, 100 ports sont plus que suffisants :

Dnscmd /Config /SocketPoolSize 100

Une fois la commande exécutée, redémarrez le service DNS ; la consommation de mémoire devrait diminuer.

Vous pouvez également voir combien de ports sont ouverts :

Dnscmd /Info /SocketPoolSize

0 votes

Intéressant, j'y jetterai un œil la prochaine fois que je parlerai au client qu'il a affecté.

1voto

Mike Taylor Points 253

Nous avons effectué une capture Wireshark pour voir quelles requêtes DNS étaient exécutées, et il s'avère que lorsque chaque client envoie des données au serveur, il se connecte à un serveur MSSQL sur une autre machine et effectue une requête DNS pour obtenir l'adresse IP de ce serveur SQL.

Comme solution de rechange, nous avons configuré le serveur d'application avec l'adresse IP des serveurs SQL, de sorte que le serveur d'application n'a pas besoin d'interroger le cache DNS.

Cependant, la question demeure de savoir pourquoi des requêtes DNS apparemment normales entraînent une telle utilisation de la mémoire dans le cache DNS.

J'ai inclus la trace du fil de requin ici afin que les gens puissent être en mesure d'aider à diagnostiquer le problème.

DNS Query

0voto

Bolli Points 422

Je ne sais pas si c'est trop tard, mais je suis tombé sur cette question en enquêtant sur un problème totalement différent. Je pense que c'est le domaine .uk qui est à l'origine du problème.

Ils décrivent ensuite qu'une simple correction de la clé de registre résoudra le problème.

http://support.microsoft.com/kb/968372

Lorsque la résolution de noms est assurée par des indices de racine, les serveurs DNS de Windows Server 2008 et Windows Server 2008 R2 peuvent ne pas résoudre les requêtes pour les noms de certains domaines de premier niveau. Dans ce cas, le problème persiste jusqu'à ce que le cache du serveur DNS soit vidé ou que le service du serveur DNS soit redémarré. Le problème peut se poser pour des domaines tels que .co.uk, .cn et .br, mais il n'est pas limité à ces domaines.

Lorsque le problème se produit, une commande nslookup émise pour un nom affecté renvoie l'erreur "server failed". Un suivi du réseau montrera que le serveur DNS n'envoie aucun trafic vers Internet pour une telle requête. Aucun événement lié à un problème n'est signalé dans le journal des événements DNS.

Ce problème ne se produit pas si le serveur DNS est configuré pour utiliser les forwarders pour la résolution des noms Internet au lieu des root hints.

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