Redis için Azure Cache gecikme süresi ve zaman aşımı sorunlarını giderme
Zamanında yanıt almayan bir istemci işlemi, yüksek gecikme süresi veya zaman aşımı özel durumuyla sonuçlanabilir. Bir işlem çeşitli aşamalarda zaman aşımına uğrayabilir. Zaman aşımının nereden geldiği, nedenini ve çözümünü belirlemeye yardımcı olur.
Bu bölümde, Redis için Azure Cache bağlanırken oluşan gecikme süresi ve zaman aşımı sorunlarının giderilmesi ele alınmaktadır.
Dekont
Bu kılavuzdaki sorun giderme adımlarından bazıları Redis komutlarını çalıştırma ve çeşitli performans ölçümlerini izleme yönergelerini içerir. Daha fazla bilgi ve yönergeler için Ek bilgiler bölümündeki makalelere bakın.
İstemci tarafı sorun giderme
burada istemci tarafı sorun giderme adımları yer alır.
Ani trafik artışı ve iş parçacığı havuzu yapılandırması
Kötü ThreadPool
ayarlarla birleştirilen trafik artışları, Redis sunucusu tarafından önceden gönderilen ancak istemci tarafında henüz tüketilmeyen verilerin işlenmesinde gecikmelere neden olabilir. İstemci konaklarınızın ani trafik artışına ayak uydurabileceğini doğrulamak için "Hatalar" ölçümünü (Tür: UnresponsiveClients) denetleyin.
ÖrneğiniThreadPoolLogger
kullanarak istatistiklerinizin ThreadPool
zaman içinde nasıl değiştiğini izleyin. StackExchange.Redis'ten gelen iletileri daha fazla araştırmak için kullanabilirsiniz TimeoutException
:
System.TimeoutException: Timeout performing EVAL, inst: 8, mgr: Inactive, queue: 0, qu: 0, qs: 0, qc: 0, wr: 0, wq: 0, in: 64221, ar: 0,
IOCP: (Busy=6,Free=999,Min=2,Max=1000), WORKER: (Busy=7,Free=8184,Min=2,Max=8191)
Yukarıdaki özel durumda, ilginç olan birkaç sorun vardır:
IOCP
bölümünde ve bölümünde değerindenWORKER
daha büyükMin
birBusy
değere sahip olduğunu görebilirsiniz. Bu fark, ayarlarınızınThreadPool
ayarlanması gerektiği anlamına gelir.- öğesini de görebilirsiniz
in: 64221
. Bu değer, istemcinin çekirdek yuva katmanında 64.221 bayt alındığını ancak uygulama tarafından okunmadığını gösterir. Bu fark genellikle uygulamanızın (örneğin, StackExchange.Redis) ağdan verileri sunucu size gönderdiği kadar hızlı okumadığını gösterir.
Ayarlar yapılandırarak ThreadPool
iş parçacığı havuzunuzun hızlı bir şekilde genişlemesini sağlayabilirsiniz.
Büyük anahtar değeri
Birden çok anahtar ve daha küçük değerler kullanma hakkında bilgi için bkz . Daha fazla anahtar ve daha küçük değerler göz önünde bulundurun.
Önbelleğinizde büyük anahtarları denetlemek için komutunu kullanabilirsiniz redis-cli --bigkeys
. Daha fazla bilgi için bkz . redis-cli, Redis komut satırı arabirimi--Redis.
- Daha yüksek bant genişliği özellikleri elde etmek için VM'nizin boyutunu artırın
- İstemci veya sunucu VM'nizde daha fazla bant genişliği, daha büyük yanıtlar için veri aktarım sürelerini azaltabilir.
- Her iki makinedeki geçerli ağ kullanımınızı geçerli VM boyutunuzun sınırlarıyla karşılaştırın. Yalnızca sunucuda veya yalnızca istemcide daha fazla bant genişliği yeterli olmayabilir.
- Uygulamanızın kullandığı bağlantı nesnelerinin sayısını artırın.
- Farklı bağlantı nesneleri üzerinden istekte bulunmak için hepsini bir kez deneme yaklaşımı kullanma
İstemci konaklarında yüksek CPU
Yüksek istemci CPU kullanımı, sistemin kendisine atanan çalışmaya ayak uyduramazsınız. Önbellek yanıtı hızlı bir şekilde gönderse de, istemci yanıtı zamanında işleyemeyebilir. Önerimiz, istemci CPU'sunun %80'in altında tutulmasıdır. İstemci konaklarınızın Redis sunucusundan gelen yanıtları zamanında işleyebilir olup olmadığını belirlemek için "Hatalar" (Tür: UnresponsiveClients
) ölçümünü denetleyin.
Azure portalında veya makinedeki performans sayaçları aracılığıyla sağlanan ölçümleri kullanarak istemcinin sistem genelindeKI CPU kullanımını izleyin. Tek bir işlem düşük CPU kullanımına sahip olabileceğinden ancak sistem genelinde CPU yüksek olabileceğinden işlem CPU'sunu izlememeye dikkat edin. CPU kullanımında zaman aşımlarına karşılık gelen ani artışları izleyin. Yüksek CPU, [Trafik artışı] bölümünde açıklandığı gibi hata iletilerinde TimeoutException
de yüksek in: XXX
değerlere neden olabilir.
Dekont
StackExchange.Redis 1.1.603 ve üzeri, hata iletilerinde TimeoutException
ölçümü içerirlocal-cpu
. StackExchange.Redis NuGet paketinin en son sürümünü kullandığınızdan emin olun. Hatalar, zaman aşımlarına karşı daha sağlam hale getirmek için kodda düzenli olarak düzeltilir. En son sürüme sahip olmak önemlidir.
İstemcinin yüksek CPU kullanımını azaltmak için:
- CPU ani artışlarına neyin neden olduğunu araştırın.
- İstemcinizi daha fazla CPU kapasitesiyle daha büyük bir VM boyutuna yükseltin.
İstemci konaklarında ağ bant genişliği sınırlaması
İstemci makinelerinin mimarisine bağlı olarak, kullanılabilir ağ bant genişliği miktarıyla ilgili sınırlamaları olabilir. İstemci ağ kapasitesini aşırı yükleyerek kullanılabilir bant genişliğini aşarsa, veriler sunucunun gönderdiği hızda istemci tarafında işlenemeyebilir. Bu durum zaman aşımlarına neden olabilir.
Bir örnek BandwidthLogger
kullanarak Bant genişliği kullanımınızın zaman içinde nasıl değiştiğini izleyin. Bu kod, kısıtlı izinlere sahip bazı ortamlarda (Azure web siteleri gibi) başarıyla çalışmayabilir.
Azaltmak için ağ bant genişliği tüketimini azaltın veya istemci VM boyutunu daha fazla ağ kapasitesine sahip bir vm'ye artırın. Daha fazla bilgi için bkz . Büyük istek veya yanıt boyutu.
Linux tabanlı istemci uygulamaları için TCP ayarları
Linux'taki iyimser TCP ayarları nedeniyle Linux'ta barındırılan istemci uygulamaları bağlantı sorunlarıyla karşılaşabilir. Daha fazla bilgi için bkz. Linux tarafından barındırılan istemci uygulamaları için TCP ayarları
RedisSessionStateProvider yeniden deneme zaman aşımı
kullanıyorsanız RedisSessionStateProvider
, yeniden deneme zaman aşımını doğru ayarladığınızdan emin olun. Değer değerinden retryTimeoutInMilliseconds
operationTimeoutInMilliseconds
yüksek olmalıdır. Aksi takdirde, yeniden deneme gerçekleşmez. Aşağıdaki örnekte retryTimeoutInMilliseconds
3000 olarak ayarlanmıştır. Daha fazla bilgi için bkz. Redis için Azure Cache için oturum durumu sağlayıcısı ASP.NET ve Oturum Durumu Sağlayıcısı ve Çıkış Önbelleği Sağlayıcısı yapılandırma parametrelerini kullanma.
<add
name="AFRedisCacheSessionStateProvider"
type="Microsoft.Web.Redis.RedisSessionStateProvider"
host="enbwcache.redis.cache.windows.net"
port="6380"
accessKey="..."
ssl="true"
databaseId="0"
applicationName="AFRedisCacheSessionState"
connectionTimeoutInMilliseconds = "5000"
operationTimeoutInMilliseconds = "1000"
retryTimeoutInMilliseconds="3000"
>
Sunucu tarafı sorun giderme
Sunucu tarafı sorun giderme adımları aşağıdadır.
Hizmet bakımı
Planlı veya plansız bakım istemci bağlantılarında kesintilere neden olabilir. Özel durumların sayısı ve türü isteğin kod yolundaki konumuna ve önbelleğin bağlantılarını ne zaman kapattığına bağlıdır. Örneğin, bir istek gönderen ancak yük devretme gerçekleştiğinde yanıt almayan bir işlem zaman aşımı özel durumuyla karşılanabilir. Kapatılan bağlantı nesnesinde yeni istekler, yeniden bağlantı başarıyla gerçekleşene kadar bağlantı özel durumları alır.
Daha fazla bilgi için şu diğer bölümlere bakın:
- Kanalı güncelleştirme ve Güncelleştirmeleri zamanlama
- Bağlantı dayanıklılığı
AzureRedisEvents
Bildirim
Zaman aşımları oluştuğu sırada Redis için Azure Cache yük devretmesi olup olmadığını denetlemek için Hatalar ölçümünü denetleyin. Azure portalının Kaynak menüsünde Ölçümler'i seçin. Ardından ölçümü ölçen ve ölçütüne Errors
göre bölünmüş ErrorType
yeni bir grafik oluşturun. Bu grafiği oluşturduktan sonra Yük Devretme için bir sayı görürsünüz.
Yük devretmeler hakkında daha fazla bilgi için bkz. Redis için Azure Cache için yük devretme ve düzeltme eki uygulama.
Yüksek sunucu yükü
Yüksek sunucu yükü, Redis sunucusunun isteklere ayak uyduramadığı ve zaman aşımlarına neden olduğu anlamına gelir. Sunucu yavaş yanıt veriyor ve isteklerin hızına yetişemiyor olabilir.
Sunucu yükü gibi ölçümleri izleyin. Kullanımda Server Load
zaman aşımlarına karşılık gelen ani artışları izleyin. Olası etkiler hakkında erken bildirim almak için sunucu yükündeki ölçümler üzerinde uyarılar oluşturun.
Yüksek sunucu yükü sorunlarını gidermek için yapabileceğiniz birkaç değişiklik vardır:
- Yüksek bellek baskısı nedeniyle bu makalede belirtilen uzun süre çalışan komutlar gibi yüksek sunucu yüküne neyin neden olduğunu araştırın.
- Birden çok Redis işlemine yük dağıtmak için ölçeği genişleterek daha fazla parçaya veya daha fazla CPU çekirdeğiyle daha büyük bir önbellek boyutuna ölçeklendirin. Daha fazla bilgi için bkz. Redis için Azure Cache planlama hakkında SSS.
- C1 önbelleğindeki üretim iş yükünüz virüs taramasından kaynaklanan ek gecikme süresinden olumsuz etkileniyorsa, C2 gibi birden çok CPU çekirdeğine sahip daha yüksek katman teklifi için ödeme yaparak etkisini azaltabilirsiniz.
Sunucu yükündeki ani artışlar
C0 ve C1 önbelleklerinde, vm'lerde virüs taraması çalışırken isteklerde birkaç kez artışa neden olmayan sunucu yükünde kısa ani artışlar görebilirsiniz. Bu katmanlarda virüs taraması yapılırken istekler için daha yüksek gecikme süresi görürsünüz. C0 ve C1 katmanlarında önbellekler, virüs tarama ve Redis istekleri sunma işini bölerek çoklu görev için yalnızca tek bir çekirdeğe sahiptir.
Yüksek bellek kullanımı
Bu bölüm taşındı. Daha fazla bilgi için bkz . Yüksek bellek kullanımı.
Uzun süre çalışan komutlar
Bazı Redis komutlarının yürütülmesi diğerlerinden daha uzun sürer. Redis komutları belgelerinde her komutun zaman karmaşıklığı gösterilir. Redis komut işlemesi tek iş parçacıklı bir işlemedir. Çalıştırılması uzun süren tüm komutlar, ondan sonra gelen diğer tüm komutları engelleyebilir.
Performans etkilerini anlamak için Redis sunucunuza vermekte olduğunuz komutları gözden geçirin. Örneğin, KEYS komutu genellikle bunun bir O(N) işlemi olduğunu bilmeden kullanılır. CPU ani artışlarını azaltmak için SCAN kullanarak ANAHTARLARDAN kaçınabilirsiniz.
SLOWLOG GET komutunu kullanarak sunucuda yürütülen pahalı komutları ölçebilirsiniz.
Müşteriler, uzun süre çalışan ve pahalı komutları araştırmak üzere bu Redis komutlarını çalıştırmak için bir konsol kullanabilir.
- SLOWLOG , Redis yavaş sorgu günlüğünü okumak ve sıfırlamak için kullanılır. İstemci tarafında uzun süre çalışan komutları araştırmak için kullanılabilir.
Redis Yavaş Günlüğü, belirtilen yürütme süresini aşan sorguları günlüğe kaydeden bir sistemdir. Yürütme süresi istemciyle konuşma, yanıt gönderme vb. G/Ç işlemlerini içermez, ancak yalnızca komutu gerçekten yürütmek için gereken süreyi içerir. Müşteriler, komutunu kullanarak Redis sunucularında yürütülen pahalı komutları ölçebilir/günlüğe
SLOWLOG
kaydedebilir. - MONITOR , Redis sunucusu tarafından işlenen her komutun akışını geri alan bir hata ayıklama komutudur. Bu, veritabanında neler olduğunu anlamanıza yardımcı olabilir. Bu komut zorludur ve performansı olumsuz etkileyebilir. Performansı düşürebilir.
- BİlGİ - komut, sunucu hakkındaki bilgileri ve istatistikleri bilgisayarlara göre ayrıştırmaya ve insanlar tarafından okunmaya kolay bir biçimde döndürür. Bu durumda CPU bölümü CPU kullanımını araştırmak için yararlı olabilir. 100 sunucu yükü (en yüksek değer) Redis sunucusunun sürekli meşgul olduğunu ve istekleri işlerken hiçbir zaman boşta olmadığını gösterir.
Çıkış örneği:
# CPU
used_cpu_sys:530.70
used_cpu_user:445.09
used_cpu_avg_ms_per_sec:0
server_load:0.01
event_wait:1
event_no_wait:1
event_wait_count:10
event_no_wait_count:1
- İsteMCİ LİSTESİ - çoğunlukla okunabilir bir biçimde istemci bağlantıları sunucusu hakkındaki bilgileri ve istatistikleri döndürür.
Ağ bant genişliği sınırlaması
Farklı önbellek boyutlarının farklı ağ bant genişliği kapasiteleri vardır. Sunucu kullanılabilir bant genişliğini aşarsa veriler istemciye hemen gönderilmez. Sunucu verileri istemciye yeterince hızlı gönderemediğinden istemci istekleri zaman aşımına uğrayabilir.
Kullanılan sunucu tarafı bant genişliğinin miktarını görmek için "Önbellek Okuması" ve "Önbellek Yazması" ölçümleri kullanılabilir. Bu ölçümleri portalda görüntüleyebilirsiniz. Olası etkileri hakkında önceden bilgi sahibi olmak için bellek okuma veya bellek yazma gibi ölçümlerle ilgili uyarılar oluşturun.
Ağ bant genişliği kullanımının maksimum kapasiteye yakın olduğu durumları azaltmak için:
- Ağ talebini azaltmak için istemci çağrısı davranışını değiştirin.
- Daha fazla ağ bant genişliği kapasitesiyle daha büyük bir önbellek boyutuna ölçeklendirin . Daha fazla bilgi için bkz. Redis için Azure Cache planlama hakkında SSS.
StackExchange.Redis zaman aşımı özel durumları
StackExchange.Redis kullanırken zaman aşımlarıyla ilgili daha ayrıntılı bilgi için bkz . StackExchange.Redis'te zaman aşımı özel durumlarını araştırma.