Table des matières

Introduction

Conditions préalables

Exigences

Composants utilisés

Informations générales

Outils utilisés pour récupérer les informations

Liste de toutes les commandes à une seule ligne

Obtenez uniquement les ID de noeud des LEAF au sein du fabric :

Vérifiez s'il existe des réinitialisations d'interface :

Recherchez l'interface la mieux notée :

Rechercher toutes les modifications de topologie STP :

Vérifiez s'il y a des abandons RPF de multidiffusion :

Vérifiez si Glean reçoit trop de paquets :

Statistiques d'abandon QoS :

abandons d'interface:

Erreurs FCS (erreurs CRC non estompées)

FCS + erreurs CRC bloquées

Abandons de tampon de sortie

output errors

Effacer tous les compteurs d'interface

Problèmes de session BGP :

Problèmes de session OSPF :

Paquets principaux acheminés vers le processeur

Vérifiez à l'échelle du fabric à partir du point où toute une relation contractuelle spécifique est déployée

Vérifiez où un boîtier est déjà déployé et obtenez l'epg correspondant

Utilisation de la mémoire de tous les noeuds du fabric :

Vérifier les abandons sur la pile (les paquets d'exception sont pointés)

Validation du contrat

Introduction

Ce document décrit différentes façons de détecter un problème global sur le fabric.

Conditions préalables

Exigences

- Cisco recommande une connaissance de l'ACI

- Connaissances de base de bash

Composants utilisés

Ce document n'est pas limité à des versions de matériel et de logiciel spécifiques.

Périphériques utilisés :

- Cisco ACI version 4.2(3)

The information in this document was created from the devices in a specific lab environment. All of the devices used in this document started with a cleared (default) configuration. Si votre réseau est en ligne, assurez-vous de bien comprendre l’incidence possible des commandes.

Informations générales

Outils utilisés pour récupérer les informations

- Envoyer à la place : sed « s/<oldword >/<new word>/g » g définit qu'il est fait plusieurs fois.

- Sed pour saisir les lignes du début à la fin : «/<début/,/fin/p> ». Combinez l'option -n (noprint) avec l'indicateur d'impression /p pour dupliquer la fonctionnalité de grep.

- Sed peut être utilisé plusieurs fois en utilisant « ; » par exemple : serait : sed «s/<ancien mot >/<nouveau mot>/g ; s/<oldword2 >/<new word2>/g »

- awk -F '<field_separator>' '{print $2}' Dans cet exemple spécifique, vous fractionnez la ligne par le FIELD_SEPARATOR défini et imprimez le 2ème bloc délimité. Les deux syntaxes font exactement la même chose.

- awk '{ print $1, $2 }' imprime les deux premiers champs de chaque enregistrement d'entrée, avec un espace entre eux.

- tri | uniq Signale les lignes répétées. Utilisation de lignes de préfixe -c par le nombre d'occurrences.

- sort -nrk <column> trie les lignes les plus élevées. -n pour un tri numérique, -k pour une clé afin de pouvoir modifier la colonne et si vous voulez définir le plus bas, vous pouvez supprimer -r

- python -m json.tool Affiche JSON dans un joli format.

Liste de toutes les commandes à une seule ligne

Obtenez uniquement les ID de noeud des LEAF au sein du fabric :

1. Dans une liste :

APIC#acidiag fnvread | grep leaf | awk '{print $1}'

2. Dans une ligne avec des virgules comme séparateurs :

APIC#acidiag fnvread | grep leaf | awk '{print $1}' | sed -z 's/\n/,/g;s/,$/\n/'

Vérifiez s'il existe des réinitialisations d'interface :

Les informations sont triées sur les interfaces présentant le plus grand nombre de réinitialisations.

APIC#moquery -c ethpm.PhysIf | egrep "dn|lastLinkStChg|resetCtr" | tr -d "\n" | sed "s/dn/\ndn/g;s/lastLinkStChg/\tlastLinkStChg/g;s/resetCtr/\tresetCtr/g" | sort -nrk 9 | more

option plus lente

APIC#for leaf in `acidiag fnvread | grep leaf | awk '{print $1}'`; do echo; echo " -> leaf ID: $leaf  "; fabric $leaf  show interface  | sed -n '/net[0-9]\/[0-9]\+ is up/,/Tx pause/p'  | egrep "is up|Last link flapped|interface resets" | grep -v Dedicated | tr -d "\n" | sed "s/resets/rests\n/g" | sort -nrk 9   ; done;

Recherchez l'interface la plus cotée :

Afin de trouver où le plus de trafic est reçu :

Interrogez le fabric pour toutes les interfaces avec un débit de sortie supérieur à une valeur spécifique (b). La valeur de m définit si b est gb, mb ou kb.

Pour filtrer sur gb définissez m à 125000000. Pour filtrer sur mb définissez m à 125000. Pour filtrer sur kb définissez m à 125.

APIC#bash

APIC#b=1; m=125000;b=$((b*m)); printf "%-65s %25s\n", "Node/Interface" "Bits/Second"; icurl 'http://localhost:7777/api/class/eqptEgrTotal5min.json?query-target-filter=gt(eqptEgrTotal5min.bytesRateLast,"'$b'")&order-by=eqptEgrTotal5min.bytesRateLast|desc' 2>/dev/null | python -m json.tool | egrep "dn|bytesRateLast" | sed -e 's/\s\+//g' | tr -d '\n' | sed -e 's/\"bytesRateLast\"/\n\"bytesRateLast\"/g' | sed -r '/^\s*$/d' | awk -F "\"" '{ printf "%-65s %25.2f\n", $8,$4*8}'

APIC#for leaf in `acidiag fnvread | grep leaf | awk '{print $1}'`; do echo; echo " -> leaf ID: $leaf  "; fabric $leaf  show int | sed -n '/net[0-9]\/[0-9]\+ is up/,/Tx pause/p' | egrep -i '[0-9]+ is up|30 seconds input' | tr -d '\n' | sed 's/packets\/sec/\n/g' | sort -n -r -k 10 ; done;

Rechercher toutes les modifications de topologie STP :

1. La commande va dans chaque leaf et vérifie s'il y a des modifications récentes de la topologie et dans quelles interfaces :

APIC#for node in `acidiag fnvread | grep leaf | awk '{print $1}'`; do echo; echo "node ID: $node "; fabric $node  show mcp internal info vlan all |  grep -A 2 -B 4 "Last TC flush at"  | sed -z 's/\n/ /g' | sed 's/--/\n/g;s/  $/\n/' | sort -n -r -k 22  ; done;

2. La commande va dans chaque leaf et vérifie le nombre le plus élevé de modifications PVRSTP et quelles interfaces sont vues :

APIC#for node in `acidiag fnvread | grep leaf | awk '{print $1}'`; do echo; echo "node ID: $node "; fabric $node  show mcp internal info vlan all |  grep -A 2 -B 4 "Last TC flush at"  | sed -z 's/\n/ /g' | sed 's/--/\n/g;s/  $/\n/' | sort -n -r -k 11 ; done;

Vérifiez s'il y a des abandons RPF de multidiffusion :

Cela doit être pour le leaf individuel à la fois et il vérifie tous les VRF pim activés pour toutes les chutes RPF :

APIC#for vrf in `show ip mroute summary vrf all | grep 'IP Multicast Routing Table for VR' | awk '{print $7}' | sed 's/"//g' `  ; do echo; echo -e "VRF  id: $vrf: \n" ; show ip mroute summary rpf-failed vrf $vrf | egrep "Source count: [1-9][0-9]*|[1-9]\.[0-9]{3}|LEAF|leaf" | sed -n '/Group.*count: [1-9][0-9]*/,/bps  [0-9]*/p' | awk '{print $1, $2}' | sed 's/,/ - SRC \/ pckt:\n/g' ; done;

Vérifiez si Glean reçoit trop de paquets :

1. Le fabric ARP glane :

APIC#for leaf in `acidiag fnvread | grep leaf | awk '{print $1}'`; do echo; echo " -> leaf ID: $leaf  "; fabric $leaf show ip arp internal event-history event | grep glean | grep "Received pkt Fabric-Glean" | awk -F 'log_collect_arp_glean;' '{print $2}' | awk -F 'info =' '{print $1}' | sort | uniq -c ; done;

2. Glean ARP Paquets reçus :

APIC#for leaf in `acidiag fnvread | grep leaf | awk '{print $1}'`; do echo; echo " -> leaf ID: $leaf  "; fabric $leaf show ip arp internal event-history event | grep "Received glean packet" | awk -F 'log_collect_arp_glean;' '{print $2}' | awk -F 'info =' '{print $1}' | sort | uniq -c ; done;

Statistiques d'abandon QoS :

Vérifiez les pertes QoS reçues pour l'ensemble du fabric :

APIC#moquery -c qosmIfClass -f 'qosm.IfClass.RxDropPacketsCount!="0"' | egrep "RxDropPacketsCount|dn" | awk '{print $3}' | tr -d "\n" | sed 's/level[0-9]/level\t\n/g'| sed 's/plane/plane\n/g' | awk -F 'topology/' '{print $2}'

Vérifiez les pertes de transmission QoS pour l'ensemble du fabric :

APIC#moquery -c qosmIfClass -f 'qosm.IfClass.TxDropPacketsCount!="0"' | egrep "TxDropPacketsCount|dn" | awk '{print $3}' | tr -d "\n" | sed 's/level[0-9]/level\t\n/g'| sed 's/plane/plane\n/g' | awk -F 'topology/' '{print $2}'

abandons d'interface:

Erreurs FCS (erreurs CRC non estompées)

APIC#moquery -c rmonDot3Stats -f 'rmon.Dot3Stats.fCSErrors>="1"' | egrep "dn|fCSErrors"

FCS + erreurs CRC bloquées

APIC#moquery -c rmonEtherStats -f 'rmon.EtherStats.cRCAlignErrors>="1"' | egrep "dn|cRCAlignErrors"

Abandons de tampon de sortie

APIC#moquery -c rmonEgrCounters -f 'rmon.EgrCounters.bufferdroppkts>="1"' | egrep "dn|bufferdroppkts"

output errors

APIC#moquery -c rmonIfOut -f 'rmon.IfOut.errors>="1"' | egrep "dn|errors"

Effacer tous les compteurs d'interface

Commande permettant d'obtenir la liste des noeuds de fabric

APIC# acidiag fnvread | egrep " active" | egrep "leaf|spine" | awk '{print $1}' | sed -e 'H;${x;s/\n/,/g;s/^,//;p;};d'

101,102,103,204,205,206,301,1001,1002,2001,2002

Commande permettant d'effacer les compteurs de la liste précédente

APIC# fabric 101,102,103,204,205,206,301,1001,1002,2001,2002 clear counters interface all

Problèmes de session BGP :

Afin de vérifier s'il y a des sessions BGP ayant des problèmes sur le fabric sous-jacent

APIC#moquery -c bgpPeerEntry -f 'bgp.PeerEntry.operSt!="established" and  bgp.PeerEntry.dn*"overlay-1"' | egrep "dn|operSt" | tr -d "\n" | sed "s/dn/\ndn/g;s/operSt/\t-\toperSt/g"

Afin de vérifier n'importe quelle session BGP

APIC#moquery -c bgpPeerEntry -f 'bgp.PeerEntry.operSt!="established" | egrep "dn|operSt" | tr -d "\n" | sed "s/dn/\ndn/g;s/operSt/\t-\toperSt/g"

Problèmes de session OSPF :

Identifiez les sessions qui ne sont pas à l'état complet.

APIC#moquery -c ospfAdjEp -f 'ospf.AdjEp.operSt!="full"' | egrep "dn|peerIp" | tr -d '\n' | sed "s/dn           : topology\//\nNode : /g;s/peerIp/\tpeerIp/g;s/       //g" | sed "s/\/sys.*dom-/ VRF: /g;s/\/if-\[/ Interface : /g;s/\]\/adj-/ Adj: /g"

Identifiez les sessions qui oscillent constamment et triez les informations sur le nombre le plus élevé :

APIC#moquery -c ospfAdjStats -f 'ospf.AdjStats.stChgCnt!="0"' | egrep "dn|stChgCnt" | tr -d "\n" | tr -d " " | sed "s/dn:topology\//\nNode: /g;s/\/adjstatsstChgCnt:/\tADJ changes: /g;s/\/if-\[/ Interface: /g;s/\]\/adj-/ Adj /g" | sed "s/\/sys.*dom-/ VRF: /g" | sort -nrk 11

Paquets principaux acheminés vers le processeur

Tenez compte des éléments suivants : cette commande débogue 500 paquets. Pour un montant inférieur, modifiez le nombre après -c.

lEAF#tcpdump -i kpm_inb -c 500 > /tmp/cpu-dp.txt

LEAF#cat /tmp/cpu-dp.txt | grep IP | awk '{print $3 , $4 , $5}' | grep -v $HOSTNAME | awk -F ':' '{print $1}' | sort | uniq -c | sort -nrk 1

Direct sans créer de fichier flambant neuf :

LEAF#tcpdump -i kpm_inb -c 500 | grep IP | awk '{print $3 , $4 , $5}' | grep -v $HOSTNAME | awk -F ':' '{print $1}' | sort | uniq -c | sort -nrk 1

Vérifiez à l'échelle du fabric à partir du point où toute une relation contractuelle spécifique est déployée

APIC#moquery -c actrlRule -f 'actrl.Rule.sPcTag=="32783" and actrl.Rule.dPcTag=="46" and actrl.Rule.scopeId=="2818048"'

Vérifiez où un boîtier est déjà déployé et obtenez l'epg correspondant

APIC#moquery -c l2CktEp -f 'l2.CktEp.encap=="vlan-3018"'

Utilisation de la mémoire de tous les noeuds du fabric :

APIC#bash

APIC# clear ; echo -e "Node ID\t\tFree Memory\tUsed Memory" ; moquery -c procSysMemHist15min -f 'proc.SysMemHist15min.index=="1"' | grep dn | awk -F " " '{print $3}' | xargs -n 1 -I {} sh -c 'freeAvg=`moquery -d {} | grep freeAvg | sed -E -e "s/[[:blank:]]+/ /g" | cut -d " " -f3` ; usedAvg=`moquery -d {} | grep usedAvg | sed -E -e "s/[[:blank:]]+/ /g" | cut -d " " -f3` ; totalAvg=`moquery -d {} | grep totalAvg | sed -E -e "s/[[:blank:]]+/ /g" | cut -d " " -f3` ; node=`echo {} | cut -d "/" -f3` ; freeAdj=$(( freeAvg * 100 )) ; usedAdj=$(( usedAvg * 100 )) ; percFree=$(( freeAdj / totalAvg )) ; percUtil=$(( usedAdj / totalAvg )) ; echo -e "$node\tFree% : $percFree\tUsed% : $percUtil"'

Vérifier les abandons sur la pile (les paquets d'exception sont pointés)

Vérifiez les pertes TX. Utilisez la commande avec sort -nk 6 -r :

APIC# cat istack_debug | egrep "Protocol:|x_pkts_dropped" | tr -d "\n" | sed "s/Protocol/\nProtocol/g" | sort -nk 6 -r | more

Validation du contrat

Examiner toutes les relations d'un contrat spécifique. Utilisez le script qui remplace le nom du contrat et du locataire :

APIC# CONTRACT='brc-<contract-name>'

APIC# TN='<tenant>'

#CHECK CONSUMERS

#To get the count of epgs consuming a contract (excluding vzany consumer):

APIC#icurl -g 'http://localhost:7777/api/node/mo/uni/tn-'$TN'/'$CONTRACT'.json?query-target=subtree&target-subtree-class=vzRtCons,vzConsDef&rsp-subtree-include=count&query-target-filter=or(eq(vzRtCons.tCl,"fvAEPg"),eq(vzRtCons.tCl,"l2extInstP"),eq(vzRtCons.tCl,"l3extInstP"),wcard(vzConsDef.dn,"uni/tn-'.*'/inherited-\[uni/tn-"))'

#To list all epg objects consuming a contract (excluding vzany consumers):

APIC#icurl -g 'http://localhost:7777/api/node/mo/uni/tn-'$TN'/'$CONTRACT'.json?query-target=subtree&target-subtree-class=vzRtCons,vzConsDef&query-target-filter=or(eq(vzRtCons.tCl,"fvAEPg"),eq(vzRtCons.tCl,"l2extInstP"),eq(vzRtCons.tCl,"l3extInstP"),wcard(vzConsDef.dn,"uni/tn-'.*'/inherited-\[uni/tn-"))' | python -m json.tool

#To get the count of vzanys consuming a contract:

APIC#icurl 'http://localhost:7777/api/node/mo/uni/tn-'$TN'/'$CONTRACT'.json?query-target=children&target-subtree-class=vzRtAnyToCons&rsp-subtree-include=count'

#To list all vzany objects consuming a contract:

APIC#icurl 'http://localhost:7777/api/node/mo/uni/tn-'$TN'/'$CONTRACT'.json?query-target=children&target-subtree-class=vzRtAnyToCons' | python -m json.tool

#CHECK PROVIDERS

#To get the count of epgs providing a contract (excluding vzany consumer):

APIC#icurl -g 'http://localhost:7777/api/node/mo/uni/tn-'$TN'/'$CONTRACT'.json?query-target=subtree&target-subtree-class=vzRtProv,vzProvDef&rsp-subtree-include=count&query-target-filter=or(eq(vzRtProv.tCl,"fvAEPg"),eq(vzRtProv.tCl,"l2extInstP"),eq(vzRtProv.tCl,"l3extInstP"),wcard(vzProvDef.dn,"uni/tn-'.*'/inherited-\[uni/tn-"))'

#To list all epg objects providing a contract (excluding vzany consumers):

APIC#icurl -g 'http://localhost:7777/api/node/mo/uni/tn-'$TN'/'$CONTRACT'.json?query-target=subtree&target-subtree-class=vzRtProv,vzProvDef&query-target-filter=or(eq(vzRtProv.tCl,"fvAEPg"),eq(vzRtProv.tCl,"l2extInstP"),eq(vzRtProv.tCl,"l3extInstP"),wcard(vzProvDef.dn,"uni/tn-'.*'/inherited-\[uni/tn-"))' | python -m json.tool

#To get the count of vzanys providing a contract:

APIC#icurl 'http://localhost:7777/api/node/mo/uni/tn-'$TN'/'$CONTRACT'.json?query-target=children&target-subtree-class=vzRtAnyToProv&rsp-subtree-include=count'

#To list all vzany objects providing a contract:

APIC#icurl 'http://localhost:7777/api/node/mo/uni/tn-'$TN'/'$CONTRACT'.json?query-target=children&target-subtree-class=vzRtAnyToProv' | python -m json.tool