المقدمة
يصف هذا وثيقة مختلف طريق أن يستطيع نحن كشفت مشكلة شاملة على النسيج.
المتطلبات الأساسية
المتطلبات
- توصي Cisco بمعرفة ACI
- معرفة أساسية بالباش
المكونات المستخدمة
لا يقتصر هذا المستند على إصدارات برامج ومكونات مادية معينة.
الأجهزة المستخدمة:
- Cisco ACI الذي يشغل الإصدار 4.2(3)
تم إنشاء المعلومات الواردة في هذا المستند من الأجهزة الموجودة في بيئة معملية خاصة. بدأت جميع الأجهزة المُستخدمة في هذا المستند بتكوين ممسوح (افتراضي). إذا كانت شبكتك قيد التشغيل، فتأكد من فهمك للتأثير المحتمل لأي أمر.
معلومات أساسية
الأدوات المستخدمة لالتقاط المعلومات
- ليعوض عن ذلك: يعرف SED "s/<oldword >/<wordk>/g" g أنه يتم أكثر من مرة.
- تم الاستحواذ على الخطوط من البداية إلى النهاية: "/<start/،/end/p>". قم بتجميع الخيار -n (noprint) مع علامة طباعة /p لتكرارات وظائف GREP.
- يمكن إستخدام SED أكثر من مرة باستخدام ‘؛’ على سبيل المثال: سيقوم : تم وضع "s/<oldword >/<New wordk>/g؛ s/<oldword2 >/<new wordk2>/g
- AWK -F '<field_separator>'{print$2}' في هذا المثال المحدد، تقوم بتقسيم السطر بواسطة FIELD_SEPARATOR المحدد وطباعة المجموعة الثانية المحددة. كل من الصياغة تفعل نفس الشيء بالضبط.
- يقوم AWK '{ طباعة $1، $2 }' بطباعة أول حقلين لكل سجل إدخال، مع وجود مسافة بينهما.
- فرز | UNIQ يبلغ عن الخطوط المتكررة. إستخدام خطوط بادئة C بعدد التكرارات.
- فرز - يقوم <column> <nrk بفرز الأسطر لأعلى. -n للفرز الرقمي، -k لمفتاح حتى نتمكن من تعديل العمود وإذا كنت تريد تعريف الأقل يمكنك إزالة -r
- بايثون -m json.tool يعرض JSON بتنسيق جميل.
قائمة كل أمر السطر المفرد
احصل فقط على معرفات العقد لنقاط الوصول ضمن البنية:
- في قائمة:
APIC#acidiag fnvread | grep leaf | awk '{print $1}'
- في سطر به فواصل:
APIC#acidiag fnvread | grep leaf | awk '{print $1}' | sed -z 's/\n/,/g;s/,$/\n/'
التحقق من وجود عمليات إعادة ضبط للواجهة:
يتم فرز المعلومات على الواجهات التي تحتوي على أعلى عدد من عمليات إعادة الضبط.
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
خيار أبطأ
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;
البحث عن أعلى واجهة تصنيفية:
in order to وجدت حيث أكثر حركة مرور يكون إستلمت:
قم بالاستعلام عن البنية الخاصة بجميع الواجهات التي لها سعة معالجة مخرجات أعلى من قيمة محددة (ب). تحدد قيمة m ما إذا كانت b هي gb أو mb أو kb.
للتصفية على gb مجموعة m إلى 12500000. للتصفية على ميغابايت مجموعة m إلى 125000. للتصفية على kb مجموعة 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;
البحث عن جميع تغييرات مخطط STP:
- يدخل الأمر إلى كل ورقة ويتحقق مما إذا كان هناك أي تغييرات حديثة في المخطط وفي أي واجهات:
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;
- يدخل الأمر إلى كل ورقة ويتحقق من أعلى عد لتغييرات PVRSTP والواجهات التي يتم رؤيتها:
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;
التأكد من وجود عمليات إسقاط إعادة توجيه المسار العكسي (RPF) للبث المتعدد:
يلزم أن يكون هذا الإجراء للورقة الفردية في ذلك الوقت، كما أنه يتحقق من جميع عمليات إسقاط إعادة توجيه المسار العكسي (PIM VRF) الممكنة لأي عمليات إسقاط إعادة توجيه المسار العكسي (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;
دققت إن هناك كثير ربط يحصل Glean:
- سرعة ميل ARP للقناة الليفية :
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. مجموعة ARP المستلمة الحزم:
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;
حالات إسقاط جودة الخدمة:
التحقق من تلقي جودة الخدمة لعمليات السقوط للبنية بأكملها :
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}'
تحقق من عمليات إسقاط إرسال جودة الخدمة للنسيج بالكامل :
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}'
عمليات إسقاط الواجهة:
أخطاء FCS (أخطاء CRC غير المجدولة)
APIC#moquery -c rmonDot3Stats -f 'rmon.Dot3Stats.fCSErrors>="1"' | egrep "dn|fCSErrors"
أخطاء FCS + CRC المجدولة
APIC#moquery -c rmonEtherStats -f 'rmon.EtherStats.cRCAlignErrors>="1"' | egrep "dn|cRCAlignErrors"
عمليات إسقاط المخزن المؤقت للإخراج
APIC#moquery -c rmonEgrCounters -f 'rmon.EgrCounters.bufferdroppkts>="1"' | egrep "dn|bufferdroppkts"
أخطاء الإخراج
APIC#moquery -c rmonIfOut -f 'rmon.IfOut.errors>="1"' | egrep "dn|errors"
مسح جميع عدادات الواجهة
أمر للحصول على قائمة بعقد البنية
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
أمر مسح العدادات للقائمة السابقة
APIC# fabric 101,102,103,204,205,206,301,1001,1002,2001,2002 clear counters interface all
مشاكل جلسة BGP:
للتحقق من وجود أي جلسات BGP بها مشاكل على البنية الأساسية
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"
للتحقق من أي جلسة 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"
مشاكل جلسة OSPF:
حدد الجلسات غير الموجودة في الحالة الكاملة.
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"
تعريف الجلسات التي ترفرف بشكل مستمر وفرز المعلومات على أعلى عدد:
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
الحزم الأساسية التي يتم ضربها إلى وحدة المعالجة المركزية
ضع في الحسبان ما يلي: يضبط هذا أمر 500 ربط. بالنسبة للمبلغ الأقل، قم بتعديل الرقم بعد -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
مباشر بدون إنشاء ملف جديد تماما:
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
تحقق على نطاق البنية من APIC حيث يتم نشر كل علاقة عقد محددة
APIC#moquery -c actrlRule -f 'actrl.Rule.sPcTag=="32783" and actrl.Rule.dPcTag=="46" and actrl.Rule.scopeId=="2818048"'
تحقق من موقع نشر encap بالفعل واحصل على EPG المتوافق
APIC#moquery -c l2CktEp -f 'l2.CktEp.encap=="vlan-3018"'
إستخدام الذاكرة لجميع العقد في البنية:
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"'
التحقق من عمليات الإسقاط على الموقع (يتم توجيه ضربات على حزم الاستثناء)
مراجعة عمليات إسقاط TX. أستخدم الأمر بالفرز -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
التحقق من صحة العقد
راجع جميع العلاقات للحصول على عقد معين. إستخدام البرنامج النصي الذي يستبدل اسم العقد والمستأجر:
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