DDM-polling via I2C scripten: welke A2h-bytes bevatten de live waarden en welke de drempels
Ik schrijf een kleine poller die temperatuur, spanning, bias en optisch vermogen rechtstreeks van de modules op onze whitebox-boxen haalt, zodat we een trendlijn krijgen in plaats van dat iemand een link met het blote oog controleert nadat die al fouten begint te geven. Het NOS print mooie waarden, maar ik wil de ruwe cijfers met de vendordrempels ernaast, zodat alarmniveaus consistent zijn over gemengde optiek heen in plaats van met de hand geschreven per model.
Opstelling:
- Linux-host, modulecages achter een gewone I2C-mux, bus 1
- gemengde SFP-, SFP+- en SFP28-optiek van drie vendors
- uitlezen met alleen i2c-tools, geen vendor-SDK
Ik lees de diagnostiekpagina zo uit:
# i2cdump -y 1 0x51
en dit is mijn conceptparser, en daar zit mijn twijfel:
temp = s16(a2[96:98]) / 256.0
vcc = u16(a2[98:100]) * 100e-6
bias = u16(a2[100:102]) * 2e-6
Wat ik al gedaan heb:
- mijn berekende waarden vergeleken met wat het NOS print: dicht bij elkaar op sommige modules, duidelijk mis op andere
- SFF-8472 doorgelezen, maar ik kan nog steeds niet met zekerheid zeggen waar het drempelblok eindigt en waar het kalibratiegebied begint
- de mux uitgesloten door dezelfde module op een directe bus te dumpen, dezelfde cijfers
Dus: wat is de daadwerkelijke kaart van A2h, waar wonen de drempels, waar beginnen de real-time waarden, en is er ergens een vlag die me vertelt of de module verwacht dat ik iets met die ruwe woorden doe voordat ik ze vertrouw?
Comments 7
Welke waarden zijn duidelijk mis, alle vier of alleen bias en de vermogens? Dat bepaalt meestal het hele antwoord. Dump ook meteen A0h en kijk naar byte 92: die vertelt je of de module überhaupt diagnostiek rapporteert, en of hij intern of extern gekalibreerd is. Als een deel van je vloot extern gekalibreerd is en je parser iedereen op dezelfde manier behandelt, dan is de mismatch verwacht gedrag en geen bug in je rekenwerk.
A0h byte 92 over de hele tray uitgelezen en het is niet uniform. Sommige modules vlaggen externe kalibratie, andere niet, en degene die niet overeenkomen met de NOS-output zijn precies de externe. Temperatuur en spanning zitten bij alles binnen de ruis; bias en de twee vermogens zijn wat afwijkt. Het lijkt er dus op dat ik een stap mis in plaats van de verkeerde offsets te lezen. Wat moet ik nou eigenlijk met de ruwe woorden op die subset doen?
A2h op 0x51 valt uiteen in vier stukken die voor jou van belang zijn:
Eenheden in het live blok: temperatuur signed, 1/256 C per LSB; spanning 100 uV per LSB; bias 2 uA; TX- en RX-vermogen 0,1 uW. Jouw snippet schaalt die al correct, dus offsets zijn niet je probleem.
Het ontbrekende stuk is de vlag die je net vond. Op een extern gekalibreerde module zijn de woorden op 96-105 ruwe ADC-output, en moeten de constanten op 56-95 toegepast worden voordat ze iets betekenen; een intern gekalibreerde module heeft dat al voor je gedaan. Die vertakking is het verschil tussen je twee groepen.
Als je een indeling wilt om tegen te controleren in plaats van mij op mijn woord te geloven: de FreeBSD sff8472.h-header en py-sfp-eeprom spellen de offsets allebei veld voor veld uit. Ik zou nog steeds één module per vendor verifiëren tegen een waarde die je vertrouwt, voordat je er alarmen aan ophangt.
De moeite waard om toe te voegen waarom het drempelblok de interessante helft is. De waarden in 0-55 staan in dezelfde eenheden als het live blok, dus zodra je schaling klopt, krijg je de eigen alarm- en waarschuwingspunten van de vendor er gratis bij en hoef je nooit limieten per model te verzinnen. Dat alleen al rechtvaardigt A2h rechtstreeks lezen in plaats van iemands mooie printer te parsen.
Één praktische opmerking van het draaien hiervan op een gemengde tray: houd het poll-interval bescheiden. Die pagina is een gewone I2C-lezing en de modulecontroller is niet snel. Elke module elke seconde bestoken op een bus die ook nog achter een mux zit, is een prima manier om korte reads te verzamelen die er in je grafieken precies uitzien als flapperende optiek.
Pas op hoe je dat verwoordt, want mensen lezen het als "altijd de constanten toepassen" en vragen zich dan af waarom hun cijfers erger werden. De constanten op 56-95 gelden alleen wanneer byte 92 in A0h zegt dat de module extern gekalibreerd is. Draai ze over een intern gekalibreerde module en je verandert prima goede metingen in onzin, omdat de module dat werk al gedaan heeft. Lees eerst de vlag, vertak erop, houd beide paden in de parser en log welk pad een gegeven module nam, zodat je de twee faalmodi later uit elkaar kunt houden.
Zelfde soort valstrik met temperatuur: die is signed. Parse hem unsigned en alles onder nul komt terug als een absurd hoog getal, wat vermakelijk is op de eerste koude ochtend dat het je een pager-melding oplevert.
Update van mijn kant. Ik vertak nu op A0h byte 92 en pas de constanten alleen toe waar de module extern aangeeft. Bias en beide vermogens volgen nu wat het NOS print, op elke module waartegen ik kon vergelijken, en temperatuur en spanning waren om te beginnen nooit een probleem. Twee modules melden nog steeds diagnostiek als aanwezig, maar geven drempels terug die ik niet zou vertrouwen, dus voor die twee val ik terug op mijn eigen limieten en vlag ik de module in de inventaris in plaats van te doen alsof. Ik noem het geheel nog niet afgesloten, maar de kaart hierboven was precies wat ik miste.
Nog iets voordat dit naar productie gaat. Byte 110 zit op dezelfde pagina en is status plus control, en de control-helft omvat TX disable. Een poller heeft niets te zoeken bij schrijven naar A2h, maar als je library ergens een read-modify-write doet, of je een tikfout maakt bij i2cset terwijl je op een live box test, kun je een klantlink vanuit userspace laten vallen. Open de bus read-only in de poller en houd elk schrijfpad in een apart gereedschap dat je bewust moet draaien.
Diezelfde byte geeft je TX fault en RX LOS, en beide zijn het waard om naast de analoge waarden te exporteren. Een module die op een redelijk RX-vermogen zit met LOS asserted, vertelt je een heel ander verhaal dan een die gewoon laag uitleest.