Při použití StackExchange.Redis ke manipulaci s cache redis je chyba následující:
StackExchange.Redis.RedisServerException: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
Dočasné řešení, upravit soubor redis.windows.conf,Služba Redis je potřeba znovu spustit, nastaveno následovně:
Pokud nechcete službu Redis restartovat, můžete použít příkaz redis-cli k jejímu nastavení následovně:
Vysvětlení je následující:
# Ve výchozím nastavení Redis přestane přijímat zápisy, pokud jsou povoleny snímky RDB # (alespoň jeden uložený bod) a poslední uložení na pozadí selhalo. # To uživatele (těžkým způsobem) upozorní, že data nepřetrvávají # správně na disku, jinak je pravděpodobné, že si toho nikdo nevšimne a někteří # Katastrofa nastane.
# # Pokud proces ukládání pozadí začne znovu fungovat, Redis to udělá # automaticky povolit zápisy znovu.
# # Pokud jste však nastavili správné monitorování serveru Redis # a perzistence, možná budete chtít tuto funkci vypnout, aby Redis mohl # pokračujte v práci jako obvykle, i když jsou problémy s diskem, # povolení a tak dále. Jednoduše řečeno: Redis musí forknout hlavní proces, aby zabránil tomu, že hlavní proces při ukládání dat na pevný disk předstírá smrt, a poté dokončit ukládání dat na pevný disk v procesu forku; pokud hlavní proces spotřebuje 4GB paměti, je potřeba dalších 4GB, když je potřeba podproces forku, v tomto okamžiku paměť není dostatečná, fork selže a pak selže i ukládací pevný disk. Pro zobrazení redis logů je potřeba nastavit redis.windows.conf následovně:
# Zadejte název log souboru. Také lze použít 'stdout' k vynucení # Redis pro přihlášení na standardní výstup. logfile "E:/Redis-x64-3.2.100/redis.txt" Výjimky z logu jsou následující:
[8984] 14. května 14:05:09.060 * Ukládání na pozadí zahájeno pid 8672 [8672] 14. května 14:05:09.169 # Windows verze Redis si vychovává paměť haldy ze souboru systémového stránkování pro sdílení s rozděleným procesem používaným pro perzistenční operace. V tuto chvíli není k dispozici dostatek souvislého volného prostoru v souborem systémového stránkování. Můžete zvětšit velikost souboru stránkování systému. Někdy restart defragmentuje systémový stránkovací soubor natolik, že tato operace byla úspěšně dokončena.
Redis nemůže pokračovat. Odcházím. [8984] 14. května 14:05:09.278 # operace fork selhala
Po analýze se ukázalo, že problém s maximální velikostí haldy "maxheap" byl způsoben nedostatečnou dostupností paměti.
Řešení
Otevřete konfigurační soubor Reduis "redis.windows.conf" a najděte následující sekci kódu:
# Redis halda musí být větší než hodnota specifikovaná maxmemory # flag, protože haldový alokátor má své vlastní požadavky na paměť a # Fragmentace hromady je nevyhnutelná. Pokud je pouze příznak maxmemory # Specifikováno, maxheap bude nastaven na 1,5*maxmemory. Pokud je vlajka maxheap # Specifikováno spolu s maxmemory, bude příznak maxheap automaticky # zvýšeno, pokud je menší než 1,5*maxmemory. # # Maxheap <bytes> Přidání tohoto nastavení je dobré,Služba Redis se nespustí!!!!!!!
Výchozí hodnota je: maxheap 1024000000≈976,56M
Tento komentář jsem v conf souboru nenašel, našel jsem něco takového:
# Nepoužívejte více paměti než je stanovený počet bajtů. # Když je dosaženo paměťového limitu, Redis se pokusí odebrat klíče # podle zvolené politiky vyřazování (viz maxmemory-policy).
# # Pokud Redis nemůže odebrat klíče podle politiky, nebo pokud je politika # nastaveno na 'noeviction', Redis začne odpovídat chybami na příkazy # který by spotřeboval více paměti, jako SET, LPUSH a tak dále, a bude pokračovat # odpovídat na příkazy pouze pro čtení jako GET.
# # Tato možnost je obvykle užitečná při použití Redis jako LRU cache nebo při nastavení # pevný paměťový limit pro instanci (pomocí politiky 'noeviction').
# # VAROVÁNÍ: Pokud máte slave připojené k instanci s zapnutou maxmemory, # Velikost výstupních bufferů potřebných k napájení slave se odečítá # z počtu použitých pamětí, aby síťové problémy / resynchronizace # nespouštějí smyčku, kde jsou klávesy vyřazeny, a tím pádem výstup # buffer slave je plný DELů klíčů vyřazených, což spouští smazání # dalších klíčů a tak dále, dokud není databáze úplně vyprázdněna.
# # Stručně řečeno... Pokud máte připojené otroky, doporučuje se nastavit spodní část # limit pro maxmemory, aby byl na systému volný RAM pro slave # výstupní buffery (ale to není potřeba, pokud je politika 'noeviction').
# # UPOZORNĚNÍ: nenastavení maxmemory způsobí, že Redis skončí s # výjimka mimo paměť, pokud je dosažen limit haldy.
# # POZNÁMKA: protože Redis používá systémový stránkovací soubor k alokaci paměti haldy, # využití pracovní sady paměti zobrazené ve Windows Task Manageru nebo jiném # nástroje jako ProcessExplorer nemusí být vždy přesné. Například, správně # po uložení souborů RDB nebo AOF na pozadí, hodnota pracovní sady # může výrazně klesnout. Aby se zkontrolovalo správné množství použité paměti # od redis-serveru pro uložení dat použijte příkaz klienta INFO. The INFO # Příkaz ukazuje pouze paměť použitou k uložení dat Redis, nikoli extra # paměti využívané procesem Windows pro své vlastní požadavky. Th3 extra množství # paměti, která není hlášena příkazem INFO, lze vypočítat odečtením # Peak Working Set hlášený Správcem úloh Windows a used_memory_peak # hlášeno příkazem INFO.
# # maxmemory <bytes> Varování: Pokud je limit haldy dosažen, nenastavení maxmemory způsobí, že Redis skončí s výjimkou mimo paměť.
Poznámka: KvůliRedis používá systémové stránkovací soubory k alokaci haldové paměťi,
Windows Správce úloh nebo jiné nástroje jako ProcessExplorer ne vždy ukazují přesné využití paměti pracovních sad. Jednoduše řečeno,Využití paměti zobrazené Správcem úloh není přesné!!!
Použijte příkaz info k dotazování následovně:
# Paměť used_memory:2011338768 used_memory_human:1,87G used_memory_rss:2011279992 used_memory_rss_human:1,87G used_memory_peak:2011338768 used_memory_peak_human:1,87G total_system_memory:0 total_system_memory_human:0B used_memory_lua:37888 used_memory_lua_human:37.00K
maxmemory:0 maxmemory_human:0B maxmemory_policy: Nevyřazení mem_fragmentation_ratio:1:00 mem_allocator:jemalloc-3.6.0
Prostředí je následující:
1073741824 bajtů = 1G Po nastavení přidá klient redis .net chybu cache následovně:
Příkaz OOM není povolen při použití paměti > 'maxmemory'. # MAXMEMORY POLICY: jak Redis vybere, co odstranit, když maxmemory # je dosaženo. Můžete si vybrat z pěti vzorců chování:
# # Volatile-LRU -> odstraňte klíč s nastavením expire pomocí algoritmu LRU # allkeys-lru -> odstraní libovolný klíč podle algoritmu LRU # Volatile-random -> odstraňte náhodný klíč s nastavením expire # allkeys-random -> odstraňte náhodný klíč, libovolný klíč # volatile-ttl -> odstraňte klíč s nejbližším časem vypršení (menší TTL) # Noeviction -> vůbec nevyprší, stačí vrátit chybu při zápisových operacích
# # Poznámka: u kterékoli z výše uvedených politik Redis při zápisu vrátí chybu # operací, když nejsou vhodné klíče pro vystěhování.
# # V době zápisu jsou tyto příkazy: setnx setex append # incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd # sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby # zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby # getset mset msetnx exec sort
# # Výchozí nastavení je:
# # Maxmemory-policy nevyřazení #MAXMEMORY策略: Když MAXMEMORY
#到达. Můžete si vybrat z pěti chování:
#
#volatile LRU-> používá algoritmus LRU k odstranění klíčů s expirovanými sadami
#allkeys LRU-> smazat libovolný klíč podle algoritmu LRU
#volatile náhodné – > odstranit náhodné klíče s expirovanými sadami
#allkeys náhodné > mazat náhodné klíče, libovolné klíče
#volatile TTL-> Smažte klíč s nejbližším časem vypršení (Minor TTL)
#noeviction-> vůbec nevyprší, pouze vrací chyby při zápisu
#
#注意: Pro jakoukoli z výše uvedených strategií Redis vrací chybu při zápisu
#操作, když neexistuje vhodný klíč k vystěhování.
#
#在编写之日 jsou tyto příkazy: setnx setex append
#递增递减rpush lpushx lpushx linsert lset rpoplpush sadd
#烧结店sunion sunionstore sdiff sdiffstore zadd zincrby
#zunionstore Zinterstore Hset Hsetnx HMSET Hincrby Incrby Decrby
#getset MSet MSETNX Exec třídění
#
#默认值为:
#
#maxmemory策略无效 Musíte také nastavit následující konfigurace:
Výchozí nastavení redis je velmi konzervativní, to znamená, že se neukládá po překročení paměťového limitu a politika může být změněna na algoritmus LRU (nejméně používaný algoritmus v poslední době) – nově uložené informace nahradí staré informace.
Přezkoumání:
(Konec)
|