Diagnostisera och felsöka tidsgränsundantag för Azure Cosmos DB .NET SDK-begäran
GÄLLER FÖR: NoSQL
HTTP-fel 408 uppstår om SDK inte kunde slutföra begäran innan tidsgränsen nåddes.
Det är viktigt att se till att programdesignen följer vår guide för att utforma motståndskraftiga program med Azure Cosmos DB SDK:er för att se till att den reagerar korrekt på olika nätverksförhållanden. Programmet bör ha återförsök för timeout-fel eftersom dessa normalt är förväntade i ett distribuerat system.
När du utvärderar ärendet för timeout-fel:
- Hur är påverkan mätt i volymen av åtgärder jämfört med de åtgärder som lyckas? Finns det i serviceavtalen?
- Påverkas P99-svarstiden/tillgängligheten?
- Påverkar felen alla programinstanser eller bara en delmängd? När problemet reduceras till en delmängd av instanser är det ofta ett problem som är relaterat till dessa instanser.
Ändra tidsgränsen i Azure Cosmos DB .NET SDK
SDK:et har två olika alternativ för att kontrollera tidsgränser, var och en med olika omfång.
Tidsgränser för begärandenivå
Med konfigurationen CosmosClientOptions.RequestTimeout
(eller ConnectionPolicy.RequestTimeout
för SDK v2) kan du ange en tidsgräns för nätverksbegäran efter att begäran lämnade SDK:n och finns i nätverket tills ett svar tas emot.
Med konfigurationen CosmosClientOptions.OpenTcpConnectionTimeout
(eller ConnectionPolicy.OpenTcpConnectionTimeout
för SDK v2) kan du ange en tidsgräns för den tid som ägnas åt att öppna en inledande anslutning. När en anslutning har öppnats använder efterföljande begäranden anslutningen.
En åtgärd som startas av en användare kan omfatta flera nätverksbegäranden, till exempel återförsök. Dessa två konfigurationer är per begäran, inte från slutpunkt till slutpunkt för en åtgärd.
CancellationToken
Alla asynkrona åtgärder i SDK har en valfri CancellationToken-parameter. Parametern CancellationToken används under hela åtgärden, för alla nätverksbegäranden och återförsök. Annulleringstoken kan kontrolleras mellan nätverksbegäranden, och en åtgärd avbryts om den relaterade token har upphört att gälla. Annulleringstoken ska användas för att definiera en ungefärlig förväntad tidsgräns för åtgärdsomfånget.
Kommentar
Parametern CancellationToken
är en mekanism där biblioteket kontrollerar annulleringen när den inte orsakar ett ogiltigt tillstånd. Åtgärden kanske inte avbryts exakt den tid som definierats för annulleringen. När tiden har gått ut sker annulleringen i stället när det är säkert att utföra den.
Felsökningsanvisningar
Följande lista innehåller kända orsaker och lösningar för tidsgränsundantag vid begäranden.
CosmosOperationCanceledException
Den här typen av undantag är vanliga när programmet skickar CancellationTokens till SDK-åtgärderna. SDK:et kontrollerar tillståndet för mellanförsöken CancellationToken
och om den CancellationToken
avbryts avbryts den aktuella åtgärden med det här undantaget.
Message
/ ToString()
Undantaget anger också tillståndet för din CancellationToken
genom Cancellation Token has expired: true
och innehåller även diagnostik som innehåller kontexten för annulleringen för de berörda begärandena.
Dessa undantag är säkra att försöka igen på och kan behandlas som tidsgränser från återförsöksperspektivet.
Lösning
Kontrollera den konfigurerade tiden i , CancellationToken
kontrollera att den är större än din RequestTimeout och CosmosClientOptions.OpenTcpConnectionTimeout (om du använder direktläge).
Om den tillgängliga tiden i CancellationToken
är mindre än de konfigurerade tidsgränserna och SDK:t har tillfälliga anslutningsproblem kommer SDK:t inte att kunna försöka igen och genererar CosmosOperationCanceledException
.
Hög CPU-belastning
Hög processoranvändning är det vanligaste fallet. För att få en optimal svarstid bör processoranvändningen vara ungefär 40 procent. Använd 10 sekunder som intervall för att övervaka den maximala (inte genomsnittliga) processoranvändningen. CPU-användningstoppar är vanligare för frågor mellan partitioner där det kan göras flera anslutningar för en enskild fråga.
Tidsgränserna innehåller diagnostik som innehåller:
"systemHistory": [
{
"dateUtc": "2021-11-17T23:38:28.3115496Z",
"cpu": 16.731,
"memory": 9024120.000,
"threadInfo": {
"isThreadStarving": "False",
....
}
},
{
"dateUtc": "2021-11-17T23:38:28.3115496Z",
"cpu": 16.731,
"memory": 9024120.000,
"threadInfo": {
"isThreadStarving": "False",
....
}
},
...
]
cpu
Om värdena är över 70 %, orsakas tidsgränsen troligen av CPU-överbelastning. I det här fallet är lösningen att undersöka källan till hög processoranvändning och minska den, eller skala datorn till en större resursstorlek.threadInfo/isThreadStarving
Om noderna harTrue
värden är orsaken trådsvältning. I det här fallet är lösningen att undersöka orsaken till trådsvälten (potentiellt låsta trådar) eller skala datorn/datorerna till en större resursstorlek.dateUtc
Om tiden mellan mätningarna inte är cirka 10 sekunder skulle det också indikera konkurrens i trådpoolen. CPU mäts som en oberoende aktivitet som sätts i kö i trådpoolen var 10:e sekund, om tiden mellan mätningen är längre, tyder det på att asynkrona aktiviteter inte kan bearbetas inom rimlig tid. De vanligaste scenarierna är vid anropsblockering via asynkron kod i programkoden.
Lösning
Klientprogrammet som använder SDK:t ska skalas upp eller ut.
Socket- eller porttillgängligheten kan vara låg
När du kör i Azure kan klienter som använder .NET SDK drabbas av överbelastning av Azure SNAT-portar (PAT).
Lösning 1
Om du kör på virtuella Azure-datorer följer du SNAT-portöverbelastningsguiden.
Lösning 2
Om du kör i Azure App Service följer du felsökningsguiden för anslutningsfel och använder App Service-diagnostik.
Lösning 3
Om du kör azure functions kontrollerar du att du följer Azure Functions-rekommendationen att underhålla singleton- eller statiska klienter för alla berörda tjänster (inklusive Azure Cosmos DB). Kontrollera tjänstbegränsningarna baserat på typen och storleken på funktionsappens värd.
Lösning 4
Om du använder en HTTP-proxy kontrollerar du att den har stöd för antalet anslutningar som konfigurerats i SDK ConnectionPolicy
. Annars kommer du att stöta på anslutningsproblem.
Skapa flera klientinstanser
Att skapa flera klientinstanser kan leda till problem med anslutningskonkurration och tidsgränser. Diagnostiken innehåller två relevanta egenskaper:
{
"NumberOfClientsCreated":X,
"NumberOfActiveClients":Y,
}
NumberOfClientsCreated
spårar antalet gånger som en CosmosClient
skapades inom samma AppDomain och NumberOfActiveClients
spårar de aktiva klienterna (tas inte bort). Förväntningen är att om singleton-mönstret följs skulle X
det matcha antalet konton som programmet fungerar med och som X
är lika Y
med .
Om X
är större än Y
innebär det att programmet skapar och tar bort klientinstanser. Detta kan leda till anslutningskonkurration och/eller CPU-konkurrens.
Lösning
Följ prestandatipsen och använd en enda CosmosClient-instans per konto i en hel process. Undvik att skapa och disponera klienter.
Nyckel för frekvent partition
Azure Cosmos DB fördelar det övergripande etablerade dataflödet jämnt över fysiska partitioner. När det finns en frekvent partition förbrukar en eller flera logiska partitionsnycklar på en fysisk partition den fysiska partitionens samtliga enheter för programbegäran per sekund (RU/s). Samtidigt används inte RU/s på andra fysiska partitioner. Som ett symptom är den totala förbrukade RU/s mindre än den totala etablerade RU/s i databasen eller containern, men du ser fortfarande begränsning (429:or) på begäranden mot den frekventa logiska partitionsnyckeln. Använd måttet Normaliserad RU-förbrukning för att se om arbetsbelastningen påträffar en frekvent partition.
Lösning
Välj en bra partitionsnyckel som jämnt distribuerar begärandevolym och lagring. Lär dig hur du ändrar partitionsnyckeln.
Hög grad av samtidighet
Programmet utför en hög samtidighetsnivå, vilket kan leda till konkurrens på kanalen.
Lösning
Klientprogrammet som använder SDK:t ska skalas upp eller ut.
Stora begäranden eller svar
Stora begäranden eller svar kan leda till blockering på kanalen och förvärra konkurrensen, även med en relativt låg grad av samtidighet.
Lösning
Klientprogrammet som använder SDK:t ska skalas upp eller ut.
Felfrekvensen ligger inom Azure Cosmos DB SLA
Programmet ska kunna hantera tillfälliga fel och försöka igen vid behov. Eventuella 408 undantag görs inte igen eftersom det vid skapa sökvägar är omöjligt att veta om tjänsten skapade objektet eller inte. Att skicka samma objekt igen för att skapa orsakar ett konfliktfel. Affärslogik för användarprogram kan ha anpassad logik för att hantera konflikter, vilket skulle bryta mot tvetydigheten i ett befintligt objekt jämfört med konflikt från ett nytt försök att skapa.
Felfrekvensen bryter mot serviceavtalet för Azure Cosmos DB
Kontakta Azure Support.
Nästa steg
- Diagnostisera och felsöka problem när du använder Azure Cosmos DB .NET SDK.
- Lär dig mer om prestandariktlinjer för .NET v3 och .NET v2.