Použitím StackExchange.Redis na manipuláciu s redis cache je chyba nasledovná:
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é riešenie, upraviť súbor redis.windows.conf,Službu Redis je potrebné reštartovať, množina nasledovne:
Ak nechcete reštartovať službu Redis, môžete použiť príkaz redis-cli na nastavenie nasledovne:
Vysvetlenie je nasledovné:
# Predvolene Redis prestane prijímať zápisy, ak sú povolené snímky RDB # (aspoň jeden uložený bod) a posledné uloženie na pozadí zlyhalo. # To používateľovi (ťažkým spôsobom) uvedomí, že údaje nepretrvávajú # Na disku správne, inak je pravdepodobné, že si to nikto nevšimne a niektorí # Katastrofa sa stane.
# # Ak proces ukladania pozadia opäť začne fungovať, Redis bude fungovať # automaticky povoľte zápisy znova.
# # Ak ste však nastavili správne monitorovanie servera Redis # a perzistencia, možno by ste túto funkciu mali vypnúť, aby Redis mohol # pokračujte v práci ako obvykle, aj keď sú problémy s diskom, # povolenia a podobne. Jednoducho povedané: Redis musí forknúť hlavný proces, aby zabránil tomu, že hlavný proces predstiera smrť pri ukladaní dát na pevný disk, a potom dokončiť operáciu ukladania dát na pevný disk v procese forku. Ak hlavný proces spotrebuje 4GB pamäte, je potrebných ďalších 4GB, keď je potrebný fork podproces, v tomto momente pamäť nestačí, fork zlyhá a potom zlyhá aj ukladací disk na ukladanie dát. Na zobrazenie redis logov je potrebné nastaviť redis.windows.conf nasledovne:
# Zadajte názov log súboru. Tiež sa dá použiť 'stdout' na vynútenie # Redis na prihlásenie na štandardný výstup. logfile "E:/Redis-x64-3.2.100/redis.txt" Výnimky z logológie sú nasledovné:
[8984] 14. máj 14:05:09.060 * Uloženie pozadia začaté pid 8672 [8672] 14. máj 14:05:09.169 # Windows verzia Redisu si rezervuje pamäť haldy zo súboru systémového stránkovania na zdieľanie s rozdeleným procesom používaným na perzistentné operácie. V súčasnosti nie je k dispozícii dostatok súvislého voľného priestoru v súbor systémového stránkovania. Môžete zväčšiť veľkosť súboru stránkovania systému. Niekedy reštart defragmentuje systémový stránkovací súbor natoľko, že táto operácia úspešne dokončená.
Redis nemôže pokračovať. Odchádzajú. [8984] 14. máj 14:05:09.278 # operácia forku zlyhala
Po analýze sa ukázalo, že problém s maximálnou veľkosťou haldy "maxheap" bol spôsobený nedostatočnou dostupnou pamäťou.
Riešenie
Otvorte konfiguračný súbor Redisu "redis.windows.conf" a nájdite nasledujúcu sekciu kódu:
# Redis halda musí byť väčšia ako hodnota špecifikovaná maxpamäťou # flag, keďže alokátor haldy má vlastné požiadavky na pamäť a # Fragmentácia haldy je nevyhnutná. Ak je len príznak maxmemory # Špecifikovaný, maxheap bude nastavený na 1,5*maxmemory. Ak je príznak maxheap # Špecifikované spolu s maxmemory, príznak maxheap bude automaticky # zvýšené, ak je menšie ako 1,5*maxmemory. # # Maxheap <bytes> Pridanie tohto nastavenia je dobré,Služba Redis sa nespustí!!!!!!!
Predvolená hodnota je: maxheap 1024000000≈976,56M
Tento komentár som v conf súbore nenašiel, našiel som niečo takéto:
# Nepoužívajte viac pamäte ako je určený počet bajtov. # Keď sa dosiahne pamäťový limit, Redis sa pokúsi odstrániť kľúče # podľa zvolenej politiky vysťahovania (pozri maxmemory-policy).
# # Ak Redis nemôže odstrániť kľúče podľa politiky, alebo ak je politika # nastavené na 'noeviction', Redis začne odpovedať chybami na príkazy # ktorý by spotreboval viac pamäte, ako SET, LPUSH a podobne, a bude pokračovať # na odpoveď na príkazy len na čítanie ako GET.
# # Táto možnosť je zvyčajne užitočná pri používaní Redis ako LRU cache alebo na nastavenie # pevný limit pamäte pre inštanciu (pomocou politiky 'noeviction').
# # UPOZORNENIE: Ak máte slave pripojené k inštancii s zapnutou maxmemory, # Veľkosť výstupných bufferov potrebných na napájanie slave sa odpočíta # z počtu použitej pamäte, aby sieťové problémy / resynchronizácie # nespúšťa slučku, kde sú klávesy vyhodené, a tým aj výstup # buffer slave je plný DEL-ov vyhodených kľúčov, čo spúšťa vymazanie # ďalších kľúčov a tak ďalej, až kým sa databáza úplne nevyprázdni.
# # Stručne povedané... Ak máte pripojených otrokov, odporúča sa nastaviť spodnú časť # limit pre maxmemory, aby v systéme bola voľná RAM pre slave # výstupné buffery (ale to nie je potrebné, ak je politika 'noeviction').
# # UPOZORNENIE: ak nenastavíte maxmemory, Redis skončí s # výnimka mimo pamäte, ak je limit haldy dosiahnutý.
# # POZNÁMKA: keďže Redis používa systémový stránkovací súbor na alokáciu pamäte haldy, # využitie pamäte pracovnej sady zobrazené Správcom úloh Windows alebo inými # nástroje ako ProcessExplorer nebudú vždy presné. Napríklad, vright # po uložení súborov RDB alebo AOF na pozadí, hodnota pracovnej množiny # môže výrazne klesnúť. Na kontrolu správneho množstva použitej pamäte # pri redis-serveri na uloženie dát použite príkaz klienta INFO. The INFO # ukazuje iba pamäť použitú na uloženie redis dát, nie extra # pamäť používaná procesom Windows pre vlastné požiadavky. Th3 extra množstvo # pamäte, ktorá nie je hlásená príkazom INFO, sa dá vypočítať odpočítaním # Peak Working Set hlásený Správcom úloh Windows a used_memory_peak # hlásené príkazom INFO.
# # maxmemory <bytes> Upozornenie: Ak sa dosiahne limit haldy, nenastavenie maxmemory spôsobí, že Redis skončí s výnimkou mimo pamäte.
Poznámka: KvôliRedis používa systémové stránkovacie súbory na alokáciu pamäte haldy,
Windows Task Manager alebo iné nástroje ako ProcessExplorer neukazujú vždy presné využitie pamäte pracovnej sady. Jednoducho povedané,Využitie pamäte zobrazené Správcom úloh nie je presné!!!
Použite príkaz info na dotazovanie nasledovne:
# Spomienka 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: Nevysťahovanie mem_fragmentation_ratio:1.00 mem_allocator:jemalloc-3.6.0
Nastavenia sú nasledovné:
1073741824 bajtov = 1G Po nastavení klient redis .net pridá chybu cache nasledovne:
Príkaz OOM nie je povolený pri použití pamäte > 'maxmemory'. # MAXMEMORY POLICY: ako Redis vyberie, čo odstrániť, keď maxmemory # je dosiahnuté. Môžete si vybrať z piatich správaní:
# # Volatile-LRU -> odstrániť kľúč so sadou expire pomocou algoritmu LRU # allkeys-lru -> odstrániť akýkoľvek kľúč podľa algoritmu LRU # volatile-random -> odstrániť náhodný kľúč so sadou expire # allkeys-random -> odstrániť náhodný kľúč, akýkoľvek kľúč # Volatile-TTL -> odstrániť kľúč s najbližším časom vypršania (menší TTL) # Noeviction -> vôbec nevyprší, stačí vrátiť chybu pri zápise
# # Poznámka: pri ktorejkoľvek z vyššie uvedených politík Redis vráti chybu pri zápise # operácií, keď nie sú vhodné kľúče na vysťahovanie.
# # V čase písania sú tieto prí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
# # Predvolené nastavenie je:
# # maxmemory-policy noeviction #MAXMEMORY策略: Keď MAXMEMORY
#到达. Môžete si vybrať z piatich správaní:
#
#volatile LRU-> používa algoritmus LRU na odstránenie kľúčov s expire setmi
#allkeys LRU-> vymažú akýkoľvek kľúč podľa algoritmu LRU
#volatile náhodné – > odstrániť náhodné kľúče s expirovanými sadami
#allkeys náhodné > vymažú náhodné kľúče, ľubovoľné kľúče
#volatile TTL-> Vymažte kľúč s najbližším časom vypršania (Minor TTL)
#noeviction-> vôbec nevyprší, iba vráti chyby zápisovej operácie
#
#注意: Pri ktorejkoľvek z vyššie uvedených stratégií Redis pri zápise vráti chybu
#操作, keď neexistuje vhodný kľúč na vysťahovanie.
#
#在编写之日 tieto príkazy sú: set 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 triedenie
#
#默认值为:
#
#maxmemory策略无效 Musíte tiež nastaviť nasledujúce konfigurácie:
Predvolené nastavenie redis je veľmi konzervatívne, teda nie je uložené po prekročení limitu pamäte a politika sa môže zmeniť na algoritmus LRU (najmenej používaný algoritmus v poslednej dobe) – novo uložené informácie nahradia staré informácie.
Revízia:
(Koniec)
|