Řešení potíží s časovými limity služby Azure Cache for Redis
Tato část popisuje řešení potíží s časovým limitem, ke kterým dochází při připojování k Azure Cache for Redis.
Poznámka
Součástí několika kroků pro řešení potíží v tomto průvodci jsou pokyny ke spuštění příkazů Redis a monitorování různých metrik výkonu. Další informace a pokyny najdete v článcích v části Další informace.
Opravy serveru Redis
Azure Cache for Redis serverový software pravidelně aktualizuje v rámci funkcí spravované služby, které poskytuje. Tato aktivita oprav probíhá z velké části za scénou. Během převzetí služeb při selhání při opravách uzlů serveru Redis mohou klienti Redis připojení k těmto uzlům zaznamenat dočasné časové limity při přepnutí připojení mezi těmito uzly. Další informace o opravách vedlejších účinků aplikace a o tom, jak zlepšit zpracování událostí oprav, najdete v tématu Jak převzetí služeb při selhání ovlivňuje klientskou aplikaci.
Výjimky časového limitu StackExchange.Redis
StackExchange.Redis používá nastavení konfigurace s názvem synctimeout pro synchronní operace s výchozí hodnotou 5 000 ms. Pokud synchronní volání v této době není dokončeno, klient StackExchange.Redis vyvolá chybu časového limitu podobnou následujícímu příkladu:
System.TimeoutException: Timeout performing MGET 2728cc84-58ae-406b-8ec8-3f962419f641, inst: 1,mgr: Inactive, queue: 73, qu=6, qs=67, qc=0, wr=1/1, in=0/0 IOCP: (Busy=6, Free=999, Min=2,Max=1000), WORKER (Busy=7,Free=8184,Min=2,Max=8191)
Tato chybová zpráva obsahuje metriky, které vám můžou pomoct s příčinou a možným vyřešením problému. Následující tabulka obsahuje podrobnosti o metrikách chybových zpráv.
| Metrika chybové zprávy | Podrobnosti |
|---|---|
inst |
V posledním časovém řezu: Bylo vydáno 0 příkazů. |
mgr |
Správce soketů dělá , což znamená, že žádá operační systém, aby socket.select indikuje soket, který má něco dělat. Čtenář aktivně nečítá ze sítě, protože si myslí, že je co dělat. |
queue |
Celkem probíhá 73 operací |
qu |
6 probíhajících operací je ve frontě, která neodeslaná není, ale zatím nebyla zapsána do odchozí sítě. |
qs |
Na server se odeslalo 67 probíhajících operací, ale odpověď ještě není k dispozici. Odpověď může být Not yet sent by the server nebo sent by the server but not yet processed by the client. |
qc |
Žádná z probíhajících operací nenašla odpovědi, ale zatím nebyla označena jako dokončená, protože čekají na smyčku dokončení. |
wr |
Existuje aktivní zapisovač (což znamená, že šest neodeslaných požadavků se neignoruje) bajtů/aktivních autorů. |
in |
Nejsou k dispozici žádné aktivní čtečky a k dispozici jsou žádné bajty ke čtení bajtů síťových adaptérů nebo aktivních čtecích karet. |
V předchozím příkladu výjimky obsahují oddíly IOCP WORKER a hodnotu, která je větší než Busy Min hodnota . Rozdíl znamená, že byste měli upravit ThreadPool nastavení. Můžete nakonfigurovat nastavení fondu vláken, abyste zajistili, že se fond vláken ve scénářích shlukování rychle škáluje.
Následující kroky můžete použít k eliminaci možných hlavních příčin.
Osvědčeným postupem je detekovat a nahrazovat pozastavená připojení pomocí modelu ForceReconnect, jak je popsáno v článku Odolnost připojení.
Další informace o používání StackExchange.Redis najdete v tématu Připojení mezipaměti pomocí StackExchange.Redis.
Ujistěte se, že váš server a klientská aplikace jsou ve stejné oblasti v Azure. Například může do dochází k časovým limitům, když je mezipaměť v USA – východ ale klient je v USA – západ a požadavek se v tomto intervalu neskoní nebo při ladění z místního vývojového počítače může do dochází k časovým
synctimeoutlimitům.Důrazně doporučujeme mít mezipaměť a klienta ve stejné oblasti Azure. Pokud máte scénář, který zahrnuje volání mezi oblastmi, měli byste interval nastavit na vyšší hodnotu, než je výchozí
synctimeoutinterval 5 000 ms, zahrnutím vlastnosti dosynctimeoutpřipojovacího řetězce. Následující příklad ukazuje fragment připojovacího řetězce pro StackExchange.Redis poskytovaný Azure Cache for Redis ssynctimeout8 000 ms.synctimeout=8000,cachename.redis.cache.windows.net,abortConnect=false,ssl=true,password=...Ujistěte se, že používáte nejnovější verzi balíčku StackExchange.Redis NuGet . V kódu se neustále opravují chyby, aby byly robustnější pro časové limity, takže je důležité mít nejnovější verzi.
Pokud jsou vaše požadavky vázány omezením šířky pásma na serveru nebo klientovi, jejich dokončení trvá déle a může způsobit časové limity. Informace o tom, jestli je časový limit kvůli šířce pásma sítě na serveru, najdete v tématu Omezení šířky pásma na straně serveru. Informace o tom, jestli je časový limit kvůli šířce pásma klientské sítě, najdete v tématu Omezení šířky pásma na straně klienta.
Vázané procesory jsou na serveru nebo na klientovi?
- Zkontrolujte, jestli vás na klientovi neváže procesor. Vysoké využití procesoru může způsobit, že se požadavek v intervalu nezpracuje a časový
synctimeoutlimit požadavku. Tento problém můžete vyřešit přesunutím na větší velikost klienta nebo distribucí zatížení. - Monitorováním metriky výkonu mezipaměti procesoru zkontrolujte, jestli se na serveru neváže procesor. Požadavky přicházející v době, kdy je Redis vázaná na procesor, mohou způsobit, že u těchto požadavků časový limit napadne. Pokud chcete tento stav řeší, můžete zatížení distribuovat napříč několika horizontálními oddíly v mezipaměti Premium nebo upgradovat na větší velikost nebo cenovou úroveň. Další informace najdete v tématu Omezení šířky pásma na straně serveru.
- Zkontrolujte, jestli vás na klientovi neváže procesor. Vysoké využití procesoru může způsobit, že se požadavek v intervalu nezpracuje a časový
Zpracování příkazů na serveru trvá dlouho? Dlouhotrvá zpracování příkazů na serveru Redis může způsobit časové limity. Další informace o dlouhotr spuštěných příkazech najdete v tématu Dlouho běžící příkazy. Ke své instanci Azure Cache for Redis se můžete připojit pomocí klienta redis-cli nebo konzoly RedisConsole . Potom spusťte příkaz SLOWLOG a podívejte se, jestli jsou požadavky pomalejší, než se čekalo. Redis Server a StackExchange.Redis jsou optimalizované pro mnoho malých požadavků, nikoli pro méně velkých požadavků. Rozdělení dat do menších bloků v této oblasti může věci vylepšit.
Informace o připojení ke koncovému bodu TLS/SSL vaší mezipaměti pomocí rozhraní příkazového řádku Redis a stunnel najdete v blogovém příspěvku Oznamující zprostředkovatele stavu relace ASP.NET pro Redis Preview.
Vysoké zatížení serveru Redis může způsobit časové limity. Zatížení serveru můžete monitorovat monitorováním
Redis Server Loadmetriky výkonu mezipaměti. Zatížení serveru 100 (maximální hodnota) znamená, že server Redis je zaneprázdněný a bez doby nečinnosti zpracovává požadavky. Pokud chcete zobrazit, jestli některé požadavky zachytují všechny možnosti serveru, spusťte příkaz SlowLog, jak je popsáno v předchozím odstavci. Další informace najdete v tématu Vysoké využití procesoru / Zatížení serveru.Byla na straně klienta nějaká jiná událost, která mohla způsobit tři tečky v síti? Mezi běžné události patří škálování počtu instancí klienta nahoru nebo dolů, nasazení nové verze klienta nebo povolení automatického škálování. V našem testování jsme zjistili, že automatické škálování nebo škálování nahoru nebo dolů může způsobit několik sekund ztráta odchozího síťového připojení. Kód StackExchange.Redis je vůči takovým událostem odolný a znovu se připojí. Při opětovném připojování může časový limit všech požadavků ve frontě trvat.
Došlo k velkému požadavku před několika malými požadavky na mezipaměť, u které došlo k časového limitu? Parametr v chybové zprávě udává, kolik požadavků bylo odesláno z klienta na server, ale nezpracuje
qsodpověď. Tato hodnota může dál růst, protože StackExchange.Redis používá jedno připojení TCP a může číst pouze jednu odpověď najednou. I když u první operace časový limit vyprchá, nezastaví se tím odeslání dalších dat na server nebo ze serveru. Ostatní požadavky budou blokovány, dokud se velký požadavek nedokončí a může dojít k časovém limitu. Jedním z řešení je minimalizace pravděpodobnosti časových limitů tím, že zajistíte, aby vaše mezipaměť byla dostatečně velká pro vaši úlohu, a rozdělením velkých hodnot do menších bloků. Dalším možným řešením je použít v klientovi fond objektů a zvolit nejméně načtený fond přiConnectionMultiplexerConnectionMultiplexerodesílání nového požadavku. Načítání napříč více objekty připojení by mělo zabránit jedinému časovému limitu, který by způsobil také časový limit jiných požadavků.Pokud používáte , ujistěte se, že jste správně nastavili
RedisSessionStateProviderčasový limit opakování.retryTimeoutInMillisecondshodnota by měla býtoperationTimeoutInMillisecondsvyšší než , jinak nedojde k opakování. V následujícím příkladuretryTimeoutInMillisecondsje nastavená na hodnotu 3000. Další informace najdete v tématu ASP.NET Zprostředkovatel stavu relace pro Azure Cache for Redis a Použití konfiguračních parametrů zprostředkovatele stavu relace a zprostředkovatele výstupní mezipaměti.<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" />Zkontrolujte využití paměti na Azure Cache for Redis pomocí monitorování a
Used Memory RSSUsed Memory. Pokud jsou zásady vyřazení na místě, Redis začne vyřazení klíčů, jakmile dosáhneUsed_Memoryvelikosti mezipaměti. V ideálním případěUsed Memory RSSby měl být pouze mírně vyšší nežUsed memory. Velký rozdíl znamená fragmentaci paměti (interní nebo externí). Pokud je menší než , znamená to, že část pamětiUsed Memory RSSUsed Memorymezipaměti byla prohoděna operačním systémem. Pokud k tomuto prohození dojde, můžete očekávat významné latence. Vzhledem k tomu, že Redis nemá kontrolu nad tím, jak se jeho přidělení mapují na paměťové stránky, je vysoká často výsledkem špičkyUsed Memory RSSvyužití paměti. Když server Redis volné paměti, alokátor vezme paměť, ale může nebo nemusí dát paměť zpět do systému. Může dojít k nesrovnalostem mezi hodnotou aUsed Memoryspotřebou paměti hlášenou operačním systémem. Redis mohl paměť použít a uvolnit, ale nevracet ji zpět do systému. Pokud chcete zmírnit problémy s pamětí, můžete provést následující kroky:- Upgradujte mezipaměť na větší velikost, abyste nesní pomocí omezení paměti v systému.
- Nastavte časy vypršení platnosti klíčů tak, aby se starší hodnoty proaktivně vyřazeny.
- Monitorujte
used_memory_rssmetriku mezipaměti. Když tato hodnota přiblíží velikosti jejich mezipaměti, pravděpodobně začnete mít problémy s výkonem. Distribuujte data napříč několika horizontálními oddíly, pokud používáte mezipaměť úrovně Premium nebo upgradujte na větší velikost mezipaměti.
Další informace najdete v tématu Tlak na paměť na serveru Redis.