Dayanıklı İşlevler Sorun Giderme Kılavuzu
Dayanıklı İşlevler, sıradan kod kullanarak sunucusuz düzenleme oluşturmanızı sağlayan bir Azure İşlevleri uzantısıdır. Dayanıklı İşlevler hakkında daha fazla bilgi için bkz. Dayanıklı İşlevler genel bakış.
Bu makalede, Dayanıklı İşlevler uygulamalarındaki yaygın senaryolarda sorun gidermeye yönelik bir kılavuz sağlanır.
Not
Microsoft destek mühendisleri, uygulamanızla ilgili sorunları tanılamaya yardımcı olabilir. Bu kılavuzu kullanarak sorununuzu tanılayamıyorsanız, Azure portal işlev uygulamanızın Destek + sorun giderme bölümündeki Yeni Destek isteği dikey penceresine erişerek destek bileti oluşturabilirsiniz.
İpucu
Hata ayıklarken ve sorunları tanılarken, uygulamanızın en son Dayanıklı İşlevler uzantı sürümünü kullandığından emin olarak başlamanız önerilir. Çoğu zaman en son sürümün kullanılması, diğer kullanıcılar tarafından önceden bildirilen bilinen sorunları azaltır. Uzantı sürümünüzü yükseltme yönergeleri için lütfen Uzantı sürümünü yükseltme Dayanıklı İşlevler makalesini okuyun.
Azure portal sorunları tanılama ve çözme sekmesi, uygulamanızla ilgili olası sorunları izlemek ve tanılamak için yararlı bir kaynaktır. Ayrıca tanıya dayalı olarak sorunlarınıza olası çözümler sunar. Diğer ayrıntılar için bkz. Azure İşlevi uygulaması tanılama .
Yukarıdaki kaynaklar sorununuzu çözmediyse, aşağıdaki bölümlerde belirli uygulama belirtileri için öneriler sağlanır:
Düzenleme durumunda takıldı Pending
Düzenleme başlattığınızda Dayanıklı uzantı tarafından yönetilen bir iç kuyruğa "başlat" iletisi yazılır ve düzenlemenin durumu "Beklemede" olarak ayarlanır. Düzenleme iletisi alındıktan ve kullanılabilir bir uygulama örneği tarafından başarıyla işlendikten sonra, durum "Çalışıyor" (veya "Beklemede" olmayan başka bir duruma geçer).
"Beklemede" durumunda süresiz olarak takılan düzenleme örneklerinin sorunlarını gidermek için aşağıdaki adımları kullanın.
Etkilenen düzenleme örneği kimliğine yönelik uyarılar veya hatalar için Dayanıklı Görev Çerçevesi izlemelerini denetleyin. Hata İzleme/Uyarılar bölümünde örnek bir sorgu bulunabilir.
Takılan düzenleyiciye atanan Azure Depolama denetim kuyruklarını gözden geçirin ve "başlangıç iletisinin" hala orada olup olmadığını denetleyin Denetim kuyrukları hakkında daha fazla bilgi için Bkz. Azure Depolama sağlayıcısı denetim kuyruğu belgeleri.
Uygulamanızın platform yapılandırma sürümünü "64 Bit" olarak değiştirin. Bazen uygulamada bellek yetersiz olduğundan düzenleme işlemleri başlatılmaz. 64 bit işleme geçmek, uygulamanın toplam belleği daha fazla ayırmasını sağlar. Bu yalnızca App Service Temel, Standart, Premium ve Elastik Premium planları için geçerlidir. Ücretsiz veya Tüketim planları 64 bit işlemleri desteklemez .
Düzenleme uzun bir gecikmeden sonra başlar
Normalde, düzenleme işlemleri zamanlandıktan sonra birkaç saniye içinde başlar. Ancak, düzenlemelerin başlatılmasının daha uzun sürebileceği bazı durumlar vardır. Düzenlemelerin yürütülmesinin birkaç saniyeden uzun sürmesi sorunlarını gidermek için aşağıdaki adımları kullanın.
Gecikmenin bilinen sınırlamalardan kaynaklanıp kaynaklanmadığını denetlemek için Azure Depolama'daki gecikmeli düzenlemelerle ilgili belgelere bakın.
Etkilenen düzenleme örneği kimliğiyle ilgili uyarılar veya hatalar için Dayanıklı Görev Çerçevesi izlemelerini denetleyin. Hata İzleme/Uyarılar bölümünde örnek bir sorgu bulunabilir.
Düzenleme tamamlanamadı / durumunda takıldı Running
Düzenleme uzun bir süre "Çalışıyor" durumunda kalırsa, bu genellikle tamamlanması zamanlanmış uzun süre çalışan bir görevi beklediği anlamına gelir. Örneğin, dayanıklı bir zamanlayıcı görevi, bir etkinlik görevi veya bir dış olay görevinin tamamlanması beklenebilir. Ancak, zamanlanmış görevlerin başarıyla tamamlandığını ancak düzenlemenin hala ilerlemediğini gözlemlerseniz, düzenlemenin bir sonraki görevine geçmesini engelleyen bir sorun olabilir. Bu durumdaki düzenlemelerden genellikle "takılmış düzenleme" olarak söz ediyoruz.
Takılan düzenleme sorunlarını gidermek için aşağıdaki adımları kullanın:
İşlev uygulamasını yeniden başlatmayı deneyin. Bu adım, düzenlemenin uygulama veya uzantı kodundaki geçici bir hata veya kilitlenme nedeniyle takılmasına yardımcı olabilir.
Sürekli büyüyen kuyruklar olup olmadığını görmek için Azure Depolama hesabı denetim kuyruklarını denetleyin. Bu Azure Depolama mesajlaşma KQL sorgusu , düzenleme iletilerini sıralamayla ilgili sorunları belirlemenize yardımcı olabilir. Sorun yalnızca tek bir denetim kuyruğuna etki ediyorsa, yalnızca belirli bir uygulama örneğinde var olan bir sorunu gösterebilir ve bu durumda iyi durumda olmayan VM örneğinden çıkmak için ölçeği artırma veya azaltma yararlı olabilir.
Bu kuyruk adını Bölüm Kimliği olarak filtrelemek ve bu denetim kuyruğu bölümüyle ilgili sorunları aramak için Azure Depolama Mesajlaşması bölümündeki Application Insights sorgusunu kullanın.
Dayanıklı İşlevler En İyi Yöntem ve Tanılama Araçları'ndaki yönergeleri gözden geçirin. Bazı sorunlara bilinen Dayanıklı İşlevler anti-desenler neden olabilir.
Dayanıklı İşlevler Sürüm Oluşturma belgelerini gözden geçirin. Bazı sorunlar, uçuş içi düzenleme örneklerinde hataya neden olan değişikliklerden kaynaklanabilir.
Düzenleme yavaş çalışıyor
Ağır veri işleme, iç hatalar ve yetersiz işlem kaynakları düzenleme işlemlerinin normalden daha yavaş yürütülmesine neden olabilir. Yürütülmesi beklenenden uzun süren düzenleme sorunlarını gidermek için aşağıdaki adımları kullanın:
Etkilenen düzenleme örneği kimliğine yönelik uyarılar veya hatalar için Dayanıklı Görev Çerçevesi izlemelerini denetleyin. Hata İzleme/Uyarılar bölümünde örnek bir sorgu bulunabilir.
Uygulamanız .NET işlem içi modelini kullanıyorsa genişletilmiş oturumları etkinleştirmeyi göz önünde bulundurun. Genişletilmiş oturumlar geçmiş yüklemelerini en aza indirerek işlemeyi yavaşlatabilir.
Performans ve ölçeklenebilirlik sorunlarını denetleyin. Uygulama performansı birçok faktöre bağlıdır. Örneğin, yüksek CPU kullanımı veya büyük bellek tüketimi gecikmelere neden olabilir. Ayrıntılı yönergeler için performans ve Dayanıklı İşlevler ölçeğini okuyun.
Örnek Sorgular
Bu bölümde, Azure İşlevleri uygulamanız için yapılandırılmış Azure Uygulaması Insights örneğine özel KQL sorguları yazarak sorunları giderme adımları gösterilmektedir.
Azure Depolama mesajlaşması
Varsayılan Azure Depolama sağlayıcısı kullanılırken, tüm Dayanıklı İşlevler davranışı Azure Depolama kuyruk iletileri tarafından yönlendirilir ve düzenlemeyle ilgili tüm durum tablo depolama ve blob depolama alanında depolanır. Dayanıklı Görev Çerçevesi izleme etkinleştirildiğinde, tüm Azure Depolama etkileşimleri Application Insights'a kaydedilir ve bu veriler, hata ayıklama yürütme ve performans sorunları için kritik önem taşır.
Dayanıklı İşlevler uzantısının v2.3.0'ında başlayarak, host.json dosyasındaki günlük yapılandırmanızı güncelleştirerek bu Dayanıklı Görev Çerçevesi günlüklerinin Application Insights örneğinde yayımlanmasını sağlayabilirsiniz. Bunun nasıl yapılacağını öğrenmek ve yönergeler için Dayanıklı Görev Çerçevesi günlüğe kaydetme makalesine bakın.
Aşağıdaki sorgu, belirli bir düzenleme örneği için uçtan uca Azure Depolama etkileşimlerini incelemeye yöneliktir. zaman aralığına ve örnek kimliğine göre filtrelemek için ve orchestrationInstanceID
öğesini düzenleyinstart
.
let start = datetime(XXXX-XX-XXTXX:XX:XX); // edit this
let orchestrationInstanceID = "XXXXXXX"; //edit this
traces
| where timestamp > start and timestamp < start + 1h
| where customDimensions.Category == "DurableTask.AzureStorage"
| extend taskName = customDimensions["EventName"]
| extend eventType = customDimensions["prop__EventType"]
| extend extendedSession = customDimensions["prop__IsExtendedSession"]
| extend account = customDimensions["prop__Account"]
| extend details = customDimensions["prop__Details"]
| extend instanceId = customDimensions["prop__InstanceId"]
| extend messageId = customDimensions["prop__MessageId"]
| extend executionId = customDimensions["prop__ExecutionId"]
| extend age = customDimensions["prop__Age"]
| extend latencyMs = customDimensions["prop__LatencyMs"]
| extend dequeueCount = customDimensions["prop__DequeueCount"]
| extend partitionId = customDimensions["prop__PartitionId"]
| extend eventCount = customDimensions["prop__TotalEventCount"]
| extend taskHub = customDimensions["prop__TaskHub"]
| extend pid = customDimensions["ProcessId"]
| extend appName = cloud_RoleName
| extend newEvents = customDimensions["prop__NewEvents"]
| where instanceId == orchestrationInstanceID
| sort by timestamp asc
| project timestamp, appName, severityLevel, pid, taskName, eventType, message, details, messageId, partitionId, instanceId, executionId, age, latencyMs, dequeueCount, eventCount, newEvents, taskHub, account, extendedSession, sdkVersion
İzleme Hataları/Uyarılar
Aşağıdaki sorgu, belirli bir düzenleme örneği için hataları ve uyarıları arar. için orchestrationInstanceID
bir değer sağlamanız gerekir.
let orchestrationInstanceID = "XXXXXX"; // edit this
let start = datetime(XXXX-XX-XXTXX:XX:XX);
traces
| where timestamp > start and timestamp < start + 1h
| extend instanceId = iif(isnull(customDimensions["prop__InstanceId"] ) , customDimensions["prop__instanceId"], customDimensions["prop__InstanceId"] )
| extend logLevel = customDimensions["LogLevel"]
| extend functionName = customDimensions["prop__functionName"]
| extend status = customDimensions["prop__status"]
| extend details = customDimensions["prop__Details"]
| extend reason = customDimensions["prop__reason"]
| where severityLevel > 1 // to see all logs of severity level "Information" or greater.
| where instanceId == orchestrationInstanceID
| sort by timestamp asc
Denetim kuyruğu / Bölüm Kimliği günlükleri
Aşağıdaki sorgu bir instanceId'nin denetim kuyruğuyla ilişkili tüm etkinlikleri arar. içinde instanceID orchestrationInstanceID
değerini ve içinde sorgunun başlangıç zamanını start
sağlamanız gerekir.
let orchestrationInstanceID = "XXXXXX"; // edit this
let start = datetime(XXXX-XX-XXTXX:XX:XX); // edit this
traces // determine control queue for this orchestrator
| where timestamp > start and timestamp < start + 1h
| extend instanceId = customDimensions["prop__TargetInstanceId"]
| extend partitionId = tostring(customDimensions["prop__PartitionId"])
| where partitionId contains "control"
| where instanceId == orchestrationInstanceID
| join kind = rightsemi(
traces
| where timestamp > start and timestamp < start + 1h
| where customDimensions.Category == "DurableTask.AzureStorage"
| extend taskName = customDimensions["EventName"]
| extend eventType = customDimensions["prop__EventType"]
| extend extendedSession = customDimensions["prop__IsExtendedSession"]
| extend account = customDimensions["prop__Account"]
| extend details = customDimensions["prop__Details"]
| extend instanceId = customDimensions["prop__InstanceId"]
| extend messageId = customDimensions["prop__MessageId"]
| extend executionId = customDimensions["prop__ExecutionId"]
| extend age = customDimensions["prop__Age"]
| extend latencyMs = customDimensions["prop__LatencyMs"]
| extend dequeueCount = customDimensions["prop__DequeueCount"]
| extend partitionId = tostring(customDimensions["prop__PartitionId"])
| extend eventCount = customDimensions["prop__TotalEventCount"]
| extend taskHub = customDimensions["prop__TaskHub"]
| extend pid = customDimensions["ProcessId"]
| extend appName = cloud_RoleName
| extend newEvents = customDimensions["prop__NewEvents"]
) on partitionId
| sort by timestamp asc
| project timestamp, appName, severityLevel, pid, taskName, eventType, message, details, messageId, partitionId, instanceId, executionId, age, latencyMs, dequeueCount, eventCount, newEvents, taskHub, account, extendedSession, sdkVersion
Application Insights sütun başvurusu
Yukarıdaki sorgular tarafından öngörülen sütunların ve ilgili açıklamalarının listesi aşağıdadır.
Sütun | Açıklama |
---|---|
Pıd | İşlev uygulaması örneğinin işlem kimliği. Bu, düzenleme yürütülürken işlemin geri dönüştürülip geri dönüştürülmediğini belirlemek için yararlıdır. |
Görevadı | Günlüğe kaydedilen olayın adı. |
eventType | Genellikle bir düzenleyici tarafından yapılan işi temsil eden ileti türü. Olası değerlerinin ve açıklamalarının tam listesi buradadır |
extendedSession | Genişletilmiş oturumların etkinleştirilip etkinleştirilmediğini gösteren Boole değeri. |
account | Uygulama tarafından kullanılan depolama hesabı. |
ayrıntılar | Varsa, belirli bir olay hakkında ek bilgiler. |
instanceId | Belirli bir düzenleme veya varlık örneğinin kimliği. |
Messageıd | Belirli bir kuyruk iletisi için benzersiz Azure Depolama Kimliği. Bu değer en yaygın olarak ReceivedMessage, ProcessingMessage ve DeletingMessage izleme olaylarında görünür. İleti kimliği, biz iletiyi gönderdikten sonra Azure Depolama tarafından oluşturulduğundan SendMessage olaylarında BULUNMADIĞINI unutmayın. |
Executionıd | Her çağrıldığında değişen continue-as-new düzenleyici yürütme kimliği. |
yaş | İleti sıraya alındıktan sonra milisaniye sayısı. Büyük sayılar genellikle performans sorunlarını gösterir. Süreölçerin süresine bağlı olarak büyük bir Yaş değerine sahip olabilecek TimerFired ileti türü özel durumdur. |
gecikme süresiM'ler | Bir depolama işlemi tarafından alınan milisaniye sayısı. |
dequeueCount | İletinin kaç kez sıralandığı. Normal koşullarda bu değer her zaman 1'dir. Birden fazlaysa bir sorun olabilir. |
Partitionıd | Bu günlükle ilişkili kuyruğun adı. |
totalEventCount | Geçerli eylemde yer alan geçmiş olaylarının sayısı. |
taskHub | Görev hub'ınızın adı. |
newEvents | Depolamadaki Geçmiş tablosuna yazılan geçmiş olaylarının virgülle ayrılmış listesi. |