Z uporabo StackExchange.Redis za manipulacijo redis predpomnilnika je napaka naslednja:
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.
Začasna rešitev, spremeni datoteko redis.windows.conf,Storitev Redis je treba ponovno zagnati, nastavljeno takole:
Če ne želite ponovno zagnati storitve Redis, lahko uporabite ukaz redis-cli, da jo nastavite takole:
Razlaga je naslednja:
# Privzeto Redis preneha sprejemati zapise, če so omogočeni RDB posnetki # (vsaj ena shranjena točka) in najnovejša shranjena igra v ozadju ni uspela. # To bo uporabnika (na težji način) zavedlo, da podatki ne ostajajo # pravilno na disku, sicer verjetno nihče ne bo opazil in nekateri # Katastrofa se bo zgodila.
# # Če bo postopek shranjevanja ozadja spet začel delovati, bo Redis # samodejno dovoli ponovno zapise.
# # Če pa ste vzpostavili ustrezno spremljanje Redis strežnika # in vztrajnosti, morda boste želeli to funkcijo onemogočiti, da bo Redis # nadaljuj z delom kot običajno, tudi če pride do težav z diskom, # dovoljenj in podobno. Preprosto povedano: Redis mora razvejati glavni proces, da prepreči, da glavni proces simulira smrt pri shranjevanju podatkov na trdi disk, nato pa dokončati postopek shranjevanja podatkov na trdi disk v procesu razcepljenja; če glavni proces porabi 4 GB pomnilnika, je potrebnih dodatnih 4 GB, ko je potreben podproces razcepljenja, takrat pomnilnik ni dovolj, razcep odpove, nato pa tudi trdi disk za shranjevanje podatkov odpove. Za ogled redis dnevnikov morate nastaviti redis.windows.conf tako:
# Določite ime dnevnika. Tudi 'stdout' se lahko uporabi za prisilno uporabo # Redis za prijavo na standardni izhod. logfile "E:/Redis-x64-3.2.100/redis.txt" Izjeme v logu so naslednje:
[8984] 14. maj 14:05:09.060 * Shranjevanje v ozadju se je začelo s pid 8672 [8672] 14. maj 14:05:09.169 # Windows različica Redisa shranjuje pomnilnik za kup iz sistemske datoteke za stranjenje za deljenje z razcepljenim procesom, ki se uporablja za operacije trajnosti. Trenutno ni dovolj neprekinjenega prostega prostora v sistemsko datoteko za stranišče. Lahko povečate velikost datoteke za sistemsko stranovanje. Včasih ponovni zagon dovolj defragmentira sistemsko datoteko za paginiranje ta operacija je bila uspešno zaključena.
Redis ne more nadaljevati. Izstop. [8984] 14. maj 14:05:09.278 # delovanje forka ni uspelo
Po analizi se je izkazalo, da je težava z največjo velikostjo kopice "maxheap" konfiguracije posledica nezadostnega razpoložljivega pomnilnika.
Rešitev
Odprite konfiguracijsko datoteko Redisa "redis.windows.conf" in poiščite naslednji razdelek kode:
# Redis kup mora biti večji od vrednosti, ki jo določi maxmemory # zastavica, saj ima alokator kupa svoje lastne zahteve po pomnilniku in # Fragmentacija kupa je neizogibna. Če je le zastavica maxmemory # Določeno, Maxheap bo nastavljen na 1,5*maxmemory. Če je zastavica maxheap # navedeno skupaj z maxmemory, bo zastavica maxheap samodejno # povečano, če je manjše od 1,5*maxmemory. # # Maxheap <bytes> Dodajanje tega okolja je dobro,Storitev Redis se ne zažene!!!!!!!
Privzeta vrednost je: maxheap 1024000000≈976,56M
Tega komentarja nisem našel v datoteki konferenci, našel sem nekaj takega:
# Ne porabite več pomnilnika kot določeno število bajtov. # Ko je dosežena omejitev pomnilnika, bo Redis poskušal odstraniti ključe # glede na izbrano politiko izselitve (glej maxmemory-policy).
# # Če Redis ne more odstraniti ključev v skladu s politiko ali če je politika # nastavljeno na 'noeviction', Redis začne odgovarjati z napakami pri ukazih # ki bi porabila več pomnilnika, kot SET, LPUSH in tako naprej, in se bo nadaljevala # za odgovarjanje na ukaze samo za branje, kot je GET.
# # Ta možnost je običajno uporabna pri uporabi Redisa kot LRU predpomnilnika ali za nastavitev # trda omejitev pomnilnika za instanco (z uporabo politike 'noeviction').
# # OPOZORILO: Če imate suženjske priključene na instanco z vklopljenim maxmemory, # Odšteje se velikost izhodnih medpomnilnikov, potrebnih za napajanje podrejenih # iz števila uporabljenega pomnilnika, tako da bodo omrežne težave / ponovna sinhronizacija # ne sproži zanke, kjer so tipke izločene, in posledično izhod # medpomnilnik podrejenih je poln DEL-jev izločenih ključev, kar sproži brisanje # več ključev in tako naprej, dokler baza podatkov ni popolnoma izpraznjena.
# # Na kratko... Če imate pritrjene sužnje, je priporočljivo, da nastavite spodnji del # omejitev za maxmemory, da je na sistemu nekaj prostega RAM-a za slave # izhodnih medpomnilnikov (vendar to ni potrebno, če je politika 'noeviction').
# # OPOZORILO: če ne nastavite maxmemory, bo Redis končal z # izjema izven pomnilnika, če je omejitev kupa dosežena.
# # OPOMBA: ker Redis uporablja sistemsko paginalno datoteko za dodeljevanje pomnilnika kupa, # poraba pomnilnika delovnega seta, prikazana v Windows Task Manager ali drugih # orodja, kot je ProcessExplorer, ne bodo vedno natančna. Na primer, prav # po shranjevanju datotek RDB ali AOF v ozadju, vrednost delovne množice # lahko občutno pade. Da bi preverili pravilno količino pomnilnika # pri redis-strežniku za shranjevanje podatkov uporabite ukaz INFO odjemalca. The INFO # prikazuje le pomnilnik, ki se uporablja za shranjevanje podatkov Redis, ne pa dodatnega # pomnilnik, ki ga Windows proces uporablja za svoje potrebe. Th3 dodatna količina # pomnilnika, ki ni prijavljen z ukazom INFO, je mogoče izračunati z odštevanjem # Peak Working Set, ki ga poroča Windows Task Manager in used_memory_peak # poroča ukaz INFO.
# # Maxmemory <bytes> Opozorilo: Če je omejitev kupa dosežena, bo nenastavitev maxmemory povzročila, da se Redis zaključi z izjemo brez pomnilnika.
Opomba: ZaradiRedis uporablja sistemske datoteke za stroniciranje za dodeljevanje pomnilnika v kup,
Windows Upravitelj opravil ali druga orodja, kot je Processexplorer, ne prikazujejo vedno natančne porabe pomnilnika delovnih sklopov. Preprosto povedano,Poraba pomnilnika, ki jo prikazuje Upravitelj opravil, ni natančna!!!
Uporabite ukaz info za poizvedbo, kot sledi:
# Spomin 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: Neizselitev mem_fragmentation_ratio:1.00 mem_allocator:jemalloc-3.6.0
Nastavitve so naslednje:
1073741824 bajtov = 1G Po nastavitvi redis .net odjemalec doda napako v predpomnilniku, kot sledi:
Ukaz OOM ni dovoljen pri uporabi pomnilnika > 'maxmemory'. # MAXMEMORY POLICY: kako bo Redis izbral, kaj odstraniti, ko maxmemory # je doseženo. Izbirate lahko med petimi vedenji:
# # volatile-lru -> odstranite ključ z naborom expire z uporabo LRU algoritma # allkeys-lru -> odstraniti katerikoli ključ po algoritmu LRU # volatile-random -> odstranite naključni ključ z nastavljenim potekom # allkeys-random -> odstranite naključni ključ, katerikoli ključ # volatile-ttl -> odstranite ključ z najbližjim časom poteka (manjši TTL) # Noeviction -> sploh ne poteka, samo vrne napako pri operacijah pisanja
# # Opomba: pri katerikoli od zgornjih politik bo Redis ob pisanju vrnil napako # operacije, kadar ni primernih ključev za izselitev.
# # Ob datumu pisanja so ti ukazi: 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
# # Privzeto je:
# # maxmemory-policy noeviction #MAXMEMORY策略: Ko MAXMEMORY
#到达. Izbirate lahko med petimi vedenji:
#
#volatile LRU-> uporablja algoritem LRU za odstranjevanje ključev z nabori poteka veljavnosti
#allkeys LRU-> izbriše katerikoli ključ po LRU algoritmu
#volatile naključno – > odstraniti naključne ključe z poteklimi kompleti
#allkeys naključne > izbrišejo naključne ključe, poljubne ključe
#volatile TTL-> Izbriši ključ z najbližjim časom poteka (manjši TTL)
#noeviction-> sploh ne poteče, vrne le napake pri pisanju
#
#注意: Za katero koli od zgornjih strategij Redis vrne napako ob pisanju
#操作, ko ni primernega ključa za izselitev.
#
#在编写之日 so ti ukazi: 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 izvršno razvrščanje
#
#默认值为:
#
#maxmemory策略无效 Prav tako morate nastaviti naslednje konfiguracije:
Privzeta nastavitev redis je zelo konservativna, torej se ne shranjuje, ko je omejitev pomnilnika presežena, politika pa se lahko spremeni v algoritem LRU (v zadnjem času najmanj uporabljen algoritem) – novo shranjene informacije nadomestijo stare podatke.
Pregled:
(Konec)
|