Aracılığıyla paylaş


Azure Cosmos DB .NET SDK istek zaman aşımı özel durumlarını tanılama ve sorun giderme

UYGULANANLAR: NoSQL

HTTP 408 hatası, zaman aşımı sınırına ulaşılana kadar SDK'nın isteği tamamlayamaması durumunda oluşur.

Uygulama tasarımının, farklı ağ koşullarına doğru şekilde tepki vermek için Azure Cosmos DB SDK'ları ile dayanıklı uygulamalar tasarlama kılavuzumuzu izlediğinden emin olmak önemlidir. Uygulamanızda, normal olarak dağıtılmış bir sistemde bekleneceği gibi zaman aşımı hataları için yeniden denemeler ayarlanmış olmalıdır.

Zaman aşımı hataları için büyük/küçük harf değerlendirmesi yaparken:

  • Başarılı olan işlemlerle karşılaştırıldığında etkilenen işlemlerin hacmi cinsinden ölçülen etki nedir? Hizmet SLA'ları içinde mi?
  • P99 gecikme süresi / kullanılabilirlik etkileniyor mu?
  • Hatalar tüm uygulama örneklerinizi mi yoksa bunların yalnızca bir alt kümesini mi etkiliyor? Sorun örneklerin bir alt kümesine indiriliyorsa, genellikle söz konusu örneklerle ilgili bir sorun söz konusudur.

Azure Cosmos DB .NET SDK'sında zaman aşımını özelleştirme

SDK,zaman aşımlarını denetlemek için her birinin farklı bir kapsama sahip olduğu iki farklı alternatife sahiptir.

İstek düzeyi zaman aşımları

CosmosClientOptions.RequestTimeout (veya ConnectionPolicy.RequestTimeout SDK v2 için) yapılandırması, istek SDK'dan ayrıldıktan ve yanıt alınana kadar ağ üzerinde olduktan sonra ağ isteği için bir zaman aşımı ayarlamanıza olanak tanır.

CosmosClientOptions.OpenTcpConnectionTimeout (veya ConnectionPolicy.OpenTcpConnectionTimeout SDK v2 için) yapılandırması, ilk bağlantıyı açmak için harcanan süre için zaman aşımı ayarlamanıza olanak tanır. Bir bağlantı açıldıktan sonra, sonraki istekler bağlantıyı kullanır.

Kullanıcı tarafından başlatılan bir işlem, yeniden denemeler gibi birden çok ağ isteğine yayılabilir. Bu iki yapılandırma, bir işlem için uçtan uca değil istek başınadır.

CancellationToken

SDK'daki tüm zaman uyumsuz işlemler isteğe bağlı bir CancellationToken parametresine sahiptir. Bu CancellationToken parametresi tüm işlem boyunca, tüm ağ isteklerinde ve yeniden denemelerde kullanılır. Ağ istekleri arasında iptal belirteci denetlenebilir ve ilgili belirtecin süresi dolduysa işlem iptal edilebilir. İptal belirteci, işlem kapsamında beklenen yaklaşık zaman aşımını tanımlamak için kullanılmalıdır.

Not

CancellationToken parametresi, kitaplığın geçersiz bir duruma neden olmayacağı durumlarda iptali denetlediği bir mekanizmadır. İşlem, tam olarak iptalde tanımlanan zaman dolduğunda iptal edilmeyebilir. Bunun yerine, zaman dolduktan sonra güvenli olduğunda iptal edilir.

Sorun giderme adımları

Aşağıdaki liste istek zaman aşımı istisnaları için bilinen nedenleri ve çözümleri içerir.

CosmosOperationCanceledException

Uygulamanız SDK işlemlerine CancellationTokens geçirirken bu tür bir özel durum yaygındır. SDK, aradaki CancellationToken yeniden denemelerin durumunu denetler ve iptal edilirse CancellationToken geçerli işlemi bu özel durumla durdurur.

Özel durumMessage / ToString(), aracılığıyla Cancellation Token has expired: true durumunuzu CancellationToken da gösterir ve ilgili istekler için iptal bağlamını içeren Tanılamaları da içerir.

Bu özel durumlar yeniden denenebilir ve yeniden deneme perspektifinden zaman aşımları olarak ele alınabilir.

Çözüm

içinde CancellationTokenyapılandırılan zamanı doğrulayın, bunun RequestTimeout ve CosmosClientOptions.OpenTcpConnectionTimeout değerinden (Direct modu kullanıyorsanız) büyük olduğundan emin olun. içindeki CancellationToken kullanılabilir süre yapılandırılan zaman aşımlarından azsa ve SDK geçici bağlantı sorunlarıyla karşılaşıyorsa, SDK yeniden deneyemez ve oluştururCosmosOperationCanceledException.

Yüksek CPU kullanımı

Yüksek CPU kullanımı en yaygın durumdur. En uygun gecikme süresi için CPU kullanımı kabaca yüzde 40 olmalıdır. Maksimum (ortalama değil) CPU kullanımını izlemek için 10 saniyelik bir zaman aralığı kullanın. Ani CPU artışları, tek bir sorgu için birden çok bağlantı kurulabilen bölümler arası sorgularda daha yaygındır.

Zaman aşımları şunları içeren Tanılamaları içerir:

"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 Değerler %70'in üzerindeyse zaman aşımına CPU tükenmesi neden olabilir. Bu durumda çözüm, yüksek CPU kullanımının kaynağını araştırmak ve kullanımı azaltmak veya makineyi daha büyük bir kaynak boyutuna ölçeklendirmektir.
  • Düğümlerin threadInfo/isThreadStarving True değerleri varsa, bunun nedeni iş parçacığı açlığıdır. Bu durumda çözüm, iş parçacığı gereksiniminin kaynaklarını (bir olasılıkla kilitlenmiş iş parçacıkları) araştırmak veya makineleri daha büyük bir kaynak boyutuna ölçeklendirmektir.
  • Ölçümler dateUtc arasındaki süre yaklaşık 10 saniye değilse, iş parçacığı havuzunda çekişme olduğunu da gösterir. CPU, iş parçacığı havuzunda her 10 saniyede bir kuyruğa alınan bağımsız bir Görev olarak ölçüldüğünden, ölçümler arasındaki süre daha uzunsa zaman uyumsuz Görevler zamanında işlenemiyor demektir. En yaygın senaryolar, uygulama havuzunda zaman uyumsuz kod üzerinde engellemeli çağrılar yapılan durumlardır.

Çözüm

SDK'yı kullanan istemci uygulamasının ölçeği artırılmalı veya genişletilmelidir.

Yuva veya bağlantı noktasının kullanılabilirliği düşük olabilir

.NET SDK kullanan istemciler Azure'da çalıştırılırken Azure SNAT (PAT) bağlantı noktası tükenmesiyle karşılaşabilir.

1\. Çözüm

Azure VM'lerinde çalışıyorsanız SNAT bağlantı noktası tükenme kılavuzunu izleyin.

Çözüm 2

Azure Uygulaması Hizmeti'ni çalıştırıyorsanız bağlantı hataları sorun giderme kılavuzunu izleyin ve App Service tanılamasını kullanın.

3\. Çözüm

Azure İşlevleri çalıştırıyorsanız, tüm ilgili hizmetler (Azure Cosmos DB dahil) için tekil veya statik istemcilerin bakımının Azure İşlevleri önerisini izlediğinizi doğrulayın. İşlev Uygulaması barındırmanızın türüne ve boyutuna göre hizmet sınırlarını denetleyin.

Çözüm 4

HTTP ara sunucusu kullanıyorsanız, SDK'da ConnectionPolicyyapılandırılan bağlantı sayısını destekleyebilendiğinden emin olun. Aksi takdirde bağlantı sorunlarıyla karşılaşırsınız.

Birden çok istemci örneği oluşturma

Birden çok istemci örneği oluşturmak bağlantı çekişmesi ve zaman aşımı sorunlarına yol açabilir. Tanılama iki ilgili özellik içerir:

{
    "NumberOfClientsCreated":X,
    "NumberOfActiveClients":Y,
}

NumberOfClientsCreated , bir öğesinin aynı AppDomain içinde oluşturulma sayısını CosmosClient izler ve NumberOfActiveClients etkin istemcileri izler (atılmaz). Tekil desene uyulursa, X uygulamanın çalıştığı ve X değerine eşit olan hesap sayısıyla eşleşmesi beklenir Y.

değerinden YbüyükseX, uygulamanın istemci örnekleri oluşturup yok ediyor olduğu anlamına gelir. Bu, bağlantı çekişmesine ve/veya CPU çekişmesine yol açabilir.

Çözüm

Performans ipuçlarını izleyin ve işlemin tamamında hesap başına tek bir CosmosClient örneği kullanın. İstemcileri oluşturmaktan ve yok etmekten kaçının.

Sık erişimli bölüm anahtarı

Azure Cosmos DB genel olarak sağlanan aktarım hızını fiziksel bölümler arasında eşit dağıtır. Sık erişimli bir bölüm söz konusu olduğunda, fiziksel bölümdeki bir veya birden fazla mantıksal bölüm anahtarı fiziksel bölümün saniye başına İstek Birimlerinin (RU/sn) tümünü tüketir. Bu sırada, diğer fiziksel bölümlerdeki RU/sn kullanılmamış olarak kalır. Belirti olarak, tüketilen toplam RU/sn, veritabanı veya kapsayıcıda sağlanan genel RU/sn değerinden daha az olacaktır, ancak sık erişimli mantıksal bölüm anahtarına yönelik isteklerde azaltmayı (429s) görmeye devam edersiniz. İş yükünün sık erişimli bir bölümle karşılaşıp karşılaşmadiğini görmek için Normalleştirilmiş RU Tüketimi ölçümünü kullanın.

Çözüm

İstek hacmini ve depolama alanını eşit olarak dağıtan iyi bir bölüm anahtarı seçin. Bölüm anahtarınızı değiştirmeyi öğrenin.

Yüksek eşzamanlılık derecesi

Uygulama, kanalda çekişmeye neden olabilecek yüksek düzeyde eşzamanlılık yapıyor.

Çözüm

SDK'yı kullanan istemci uygulamasının ölçeği artırılmalı veya genişletilmelidir.

Büyük istekler veya yanıtlar

Büyük istekler veya yanıtlar kanalda satır başı engellemeye yol açabilir ve nispeten düşük eşzamanlılık derecesiyle bile çekişmeye neden olabilir.

Çözüm

SDK'yı kullanan istemci uygulamasının ölçeği artırılmalı veya genişletilmelidir.

Hata oranı Azure Cosmos DB SLA'sı içinde

Uygulamanın geçici hataları işleyebilmesi ve gerektiğinde yeniden deneme yapabilmesi gerekir. 408 özel durumları yeniden denenmiyor çünkü oluşturma yollarında hizmetin öğeyi oluşturup oluşturmadığını bilmek mümkün değildir. Aynı öğeyi oluşturma için yeniden göndermek çakışma özel durumu oluşmasına neden olur. Kullanıcı uygulamaları iş mantığı, çakışmaları işlemek için özel bir mantığa sahip olabilir ve bu da var olan bir öğenin belirsizliğinden ve oluşturma yeniden denemesinden kaynaklanan çakışmalardan kaynaklanabilir.

Hata oranı Azure Cosmos DB SLA'sını ihlal ediyor

Azure Desteği'ne başvurun.

Sonraki adımlar