StackExchange.Redis -työkalua redis-välimuistin käsittelyyn virhe on seuraava:
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.
Väliaikainen ratkaisu, muokkaa redis.windows.conf-tiedostoa,Redis-palvelu täytyy käynnistää uudelleen, asetetaan seuraavasti:
Jos et halua käynnistää Redis-palvelua uudelleen, voit käyttää redis-cli-komentoa asettaaksesi sen seuraavasti:
Selitys on seuraava:
# Oletuksena Redis lopettaa kirjoitusten vastaanottamisen, jos RDB-snapshotit ovat käytössä # (vähintään yksi tallennuspiste) ja viimeisin taustatallennus epäonnistui. # Tämä tekee käyttäjän tietoiseksi (vaikealla tavalla), että data ei säily # levyllä oikein, muuten on todennäköistä, ettei kukaan huomaa ja jotkut # katastrofi tapahtuu.
# # Jos taustatallennusprosessi alkaa taas toimia, Redis alkaa toimia # Salli automaattisesti kirjoitukset uudelleen.
# # Kuitenkin, jos olet ottanut käyttöön kunnon valvonnan Redis-palvelimelle # ja sinnikkyyttä, saatat haluta poistaa tämän ominaisuuden käytöstä, jotta Redis # jatkaa normaalisti työskentelyä, vaikka levyssä olisi ongelmia, # luvat ja niin edelleen. Yksinkertaisesti sanottuna: Redis tarvitsee haarautua pääprosessista, jotta pääprosessi ei teeskentelisi kuolemaa tallentaessaan dataa kiintolevylle, ja sitten suorittaa datan tallennus kiintolevylle haarautumisprosessissa. Jos pääprosessi käyttää 4GB muistia, tarvitaan 4GB lisämuistia, kun fork-aliprosessi on tarpeen, mutta tällöin muisti ei riitä, haarukka epäonnistuu ja sitten myös datan tallennuskiintolevy epäonnistuu. Jotta voit nähdä redis-lokit, sinun täytyy konfiguroida redis.windows.conf seuraavasti:
# Määritä lokitiedoston nimi. Myös 'stdout' voidaan käyttää pakottamiseen. # Redis kirjautuu vakiolähtöön. lokitiedosto "E:/Redis-x64-3.2.100/redis.txt" Lokipoikkeukset ovat seuraavat:
[8984] 14. toukokuuta 14:05:09.060 * Taustatallennus aloitti pid 8672 [8672] 14. toukokuuta 14:05:09.169 # Redisin Windows-versio varaa kasamuistia järjestelmän sivutustiedostolta jaettavaksi haarautuneen prosessin kanssa, jota käytetään pysyvyysoperaatioissa. Tällä hetkellä alueella ei ole riittävästi yhtenäistä vapaata tilaa Järjestelmän sivutustiedosto. Voit kasvattaa järjestelmän sivutustiedoston kokoa. Joskus uudelleenkäynnistys hajottaa järjestelmän sivutiedoston riittävästi tämä operaatio saatiin onnistuneesti päätökseen.
Redis ei voi jatkaa. Poistumassa. [8984] 14. toukokuuta 14:05:09.278 # haarukkaoperaatio epäonnistui
Analyysin jälkeen kävi ilmi, että ongelma maksimikokoisessa "maxheap"-konfiguraatiossa johtui riittämättömästä muistista.
Ratkaisu
Avaa Redisin konfiguraatiotiedosto "redis.windows.conf" ja löydä seuraava koodiosio:
# Redis-keon on oltava suurempi kuin maxmemoryn määrittämä arvo # lippu, koska heap-allokaattorilla on omat muistitarpeensa ja # Kasan pirstoutuminen on väistämätöntä. Jos vain maxmemory-lippu on # määritelty, maxheap asetetaan arvoon 1.5*maxmemory. Jos maxheap-lippu on # määritellään maxmemoryn kanssa maxheap-lippu automaattisesti # kasvaa, jos se on alle 1,5*maxmemory. # # Maxheap <bytes> Tämän asetuksen lisääminen on hyvä,Redis-palvelu ei käynnisty!!!!!!!
Oletusarvo on: maxheap 1024000000≈976.56M
En löytänyt tätä kommenttia conf-tiedostosta, löysin jotain tällaista:
# Älä käytä enempää muistia kuin määritelty määrä tavuja. # Kun muistiraja saavutetaan, Redis yrittää poistaa avaimia # valitun häätöpolitiikan mukaan (katso maxmemory-politiikka).
# # Jos Redis ei voi poistaa avaimia politiikan mukaan, vai jos käytäntö on # asetettuna 'noeviction', Redis alkaa vastata virheillä komentoihin # joka vaatisi enemmän muistia, kuten SET, LPUSH ja niin edelleen, ja jatkaa # vastatakseen vain luku -komentoihin, kuten GET.
# # Tämä vaihtoehto on yleensä hyödyllinen, kun käytetään Redisiä LRU-välimuistina tai asetetaan # kova muistiraja instanssille (käyttäen 'noeviction'-politiikkaa).
# # VAROITUS: Jos sinulla on orjia kiinnitettynä instanssiin, jossa maxmemory on päällä, # orjien syöttämiseen tarvittavien ulostulopuskurien koko vähennetään # käytetystä muistimäärästä, jotta verkko-ongelmat / uudelleensynkronoinnit # ei laukaise silmukkaa, jossa avaimet häädetään, ja samalla ulostulo # slave-puskuri on täynnä DEL-avainten häätöjä, mikä laukaisee poiston # lisää avaimia, ja niin edelleen, kunnes tietokanta on täysin tyhjä.
# # Lyhyesti... Jos sinulla on orjia kiinni, suositellaan asettamaan matalamman # rajoitus maksimimuistille, jotta järjestelmässä on jonkin verran vapaata RAM-muistia orjaa varten # ulostulopuskurit (mutta tätä ei tarvita, jos käytäntö on 'noeviction').
# # VAROITUS: maxmemoryn asettamatta jättäminen aiheuttaa Redisin lopettamisen # muistin ulkopuolelle jäävä poikkeus, jos keoraja saavutetaan.
# # HUOM: koska Redis käyttää järjestelmän sivutustiedostoa kasamuistin varaamiseen, # Työjoukon muistin käyttö, joka näkyy Windowsin tehtävienhallinnassa tai muussa # työkalut kuten ProcessExplorer eivät aina ole tarkkoja. Esimerkiksi, oikea # taustatallennuksen jälkeen RDB- tai AOF-tiedostoista työjoukon arvo # voi laskea merkittävästi. Jotta voidaan tarkistaa oikea käytetty muistimäärä # redis-palvelimella datan tallentamiseksi käytä INFO-asiakaskomentoa. The INFO # komento näyttää vain muistin, jota käytetään redis-datan tallentamiseen, ei ylimääräistä # muisti, jota Windows-prosessi käyttää omiin tarpeisiinsa. Th3 ylimääräinen määrä # muistia, jota INFO-komento ei raportoi, voidaan laskea vähentämällä # Huipputoimintasarja raportoitu Windowsin tehtävienhallinnassa ja used_memory_peak # raportoitu INFO-komennon toimesta.
# # Maxmemory <bytes> Varoitus: Jos kekoraja saavutetaan, maxmemoryn asettamatta jättäminen aiheuttaa Redisin päättymisen ulkomuistin poikkeuksella.
Huomautus: KoskaRedis käyttää järjestelmän sivutustiedostoja kasamuistin varaamiseen,
Windowsin tehtävienhallinta tai muut työkalut kuten ProcessExplorer eivät aina näytä tarkkaa työsetin muistinkäyttöä. Yksinkertaisesti sanottuna,Tehtävienhallinnan osoittama muistinkäyttö ei ole tarkka!!!
Käytä info-komentoa kyselyyn seuraavasti:
# Muisto 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:häätö mem_fragmentation_ratio:1.00 mem_allocator:jemalloc-3.6.0
Ympäristöt ovat seuraavat:
1073741824 tavut = 1G Asetuksen jälkeen redis .net -asiakasohjelma lisää välimuistivirheen seuraavasti:
OOM-komento ei sallittu, kun käytetään muistia > 'maxmemory'. # MAXMEMORY-POLITIIKKA: miten Redis valitsee, mitä poistaa, kun maxmemory # saavutetaan. Voit valita viiden käyttäytymisen joukosta:
# # volatile-lru -> poista avain vanhentumisjoukolla LRU-algoritmilla # allkeys-lru -> poista minkä tahansa avaimen LRU-algoritmin mukaisesti # volatile-random -> poista satunnainen avain, jossa on vanhentumisasetus # allkeys-random -> poista satunnainen avain, mikä tahansa avain # volatile-ttl -> poista avain, jonka vanhenemisaika on lähin (pieni TTL) # häätö -> ei vanhene lainkaan, palauta vain virhe kirjoitusoperaatioissa
# # Huom: millä tahansa yllä mainituista käytännöistä Redis palauttaa virheen kirjoituksessa # operaatioita, kun häätöavaimia ei ole.
# # Kirjoitushetkellä nämä komennot ovat: set setnx setex append # incr decr rpush lpush lpushx lpushx linserti lset rpoplpush sadd # sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby # zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby # getset mset msetnx exec lajittelu
# # Oletus on:
# # maxmemory-politiikan häätö #MAXMEMORY策略: Kun MAXMEMORY
#到达. Voit valita viidestä käyttäytymisestä:
#
#volatile LRU-> käyttää LRU-algoritmia avainten poistamiseen, joilla on vanhentuneet asetukset
#allkeys LRU-> poistaa minkä tahansa avaimen LRU-algoritmin mukaisesti
#volatile satunnainen – > poista satunnaiset avaimet, joilla on vanhentuneet sarjat
#allkeys satunnaisia > poista satunnaiset avaimet, satunnaiset avaimet
#volatile TTL-> Poista avain, jonka viimeinen käyttöpäivä on lähin (pieni TTL)
#noeviction-> ei vanhene lainkaan, vaan palauttaa vain kirjoitusvirheitä
#
#注意: Millä tahansa yllä mainituista strategioista Redis palauttaa virheen kirjoituksessa
#操作, kun häätöavainta ei ole.
#
#在编写之日 nämä komennot ovat: 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-lajittelu
#
#默认值为:
#
#maxmemory策略无效 Sinun täytyy myös asettaa seuraavat asetukset:
Oletusredis-asetus on hyvin varovainen, eli sitä ei tallenneta muistirajan ylittämisen jälkeen, ja käytäntö voidaan muuttaa LRU-algoritmiin (viime aikoina vähiten käytetty algoritmi) – uusi tallennettu tieto korvaa vanhat tiedot.
Arvostelu:
(Loppu)
|