Używając StackExchange.Redis do manipulacji pamięcią podręczną redis, błąd wygląda następująco:
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.
Rozwiązanie tymczasowe, zmodyfikuj plik redis.windows.conf,Usługa Redis wymaga ponownego uruchomienia, ustawiony następująco:
Jeśli nie chcesz restartować usługi Redis, możesz użyć polecenia redis-cli, aby skonfigurować ją następująco:
Wyjaśnienie jest następujące:
# Domyślnie Redis przestanie akceptować zapisy, jeśli migawki RDB są włączone # (przynajmniej jeden punkt zapisu) i ostatni zapis w tle nie powiódł się. # To uświadomi użytkownikowi (w trudny sposób), że dane nie są utrwalane # Na dysku poprawnie, inaczej prawdopodobnie nikt nie zauważy i niektórzy # Katastrofa się wydarzy.
# # Jeśli proces zapisu tła znów zacznie działać, Redis zacznie działać # automatycznie ponownie pozwala na zapisy.
# # Jednak jeśli masz właściwy monitoring serwera Redis # i trwałości, możesz chcieć wyłączyć tę funkcję, aby Redis to zrobił # Pracuj normalnie, nawet jeśli pojawią się problemy z dyskiem, # Pozwoleń i tak dalej. Mówiąc prosto: Redis musi rozgałęzić główny proces, aby zapobiec udawaniu śmierci podczas zapisywania danych na dysku twardym, a następnie ukończyć proces zapisywania danych na dysku twardym w procesie forkowania; jeśli główny proces zużywa 4GB pamięci, dodatkowe 4GB potrzebne są przy podprocesie fork, wtedy pamięć jest za mała, fork się nie udaje, a potem także dysk twardy do zapisywania danych. Aby zobaczyć logi redis, musisz skonfigurować redis.windows.conf w następujący sposób:
# Określ nazwę pliku logu. Można też użyć "stdout" do wymuszenia # Redis, aby zalogować się na standardowym wyjściu. logfile "E:/Redis-x64-3.2.100/redis.txt" Wyjątki logów są następujące:
[8984] 14 maja 14:05:09.060 * Zapis w tle rozpoczęty przez pid 8672 [8672] 14 maja 14:05:09.169 # Wersja Redis na Windows zachowuje pamięć sterty z pliku stronicowania systemu do udostępniania z rozgałęzionym procesem używanym do operacji persystencji. Obecnie nie ma wystarczającej dostępnej wolnej przestrzeni w pliku systemowego stronicowania. Możesz zwiększyć rozmiar pliku stronicowania systemowego. Czasami restart defragmentuje plik stronicowania systemu na tyle, by ta operacja została pomyślnie zakończona.
Redis nie może kontynuować. Wychodząc. [8984] 14 maja 14:05:09.278 # operacja fork zakończona niepowodzeniem
Po analizie okazało się, że problem z konfiguracją maksymalnego "maxheap" o maksymalnym rozmiarze stosu wynikał z niewystarczającej dostępnej pamięci.
Rozwiązanie
Otwórz plik konfiguracyjny Redus "redis.windows.conf" i znajdź następującą sekcję kodu:
# Sterta Redis musi być większa niż wartość określona przez pamięć max. # flag, ponieważ alokator kopca ma własne wymagania dotyczące pamięci oraz # Fragmentacja sterty jest nieunikniona. Jeśli tylko flaga maxmemory jest # Określone, maxheap zostanie ustawiony na 1,5*maxmemory. Jeśli flaga maxheap to # Określona wraz z maxmemory, flaga maxheap będzie automatycznie # zwiększone, jeśli jest mniejsze niż 1,5*maxmemory. # # Maxheap <bytes> Dodanie tego ustawienia jest dobre,Usługa Redis nie uruchamia się!!!!!!!
Domyślna wartość to: maxheap 1024000000≈976,56M
Nie znalazłem tego komentarza w pliku konferencyjnym, znalazłem coś takiego:
# Nie używaj więcej pamięci niż określona ilość bajtów. # Gdy limit pamięci zostanie osiągnięty, Redis będzie próbował usunąć klucze # zgodnie z wybraną polityką eksmisji (zobacz maxmemory-policy).
# # Jeśli Redis nie może usuwać kluczy zgodnie z polityką lub jeśli polityka jest # ustawione na 'noeviction', Redis zacznie odpowiadać błędami do poleceń # które zużywają więcej pamięci, jak SET, LPUSH i tak dalej, i będą kontynuować # aby odpowiadać na polecenia tylko do odczytu, takie jak GET.
# # Ta opcja jest zwykle przydatna przy używaniu Redis jako pamięci podręcznej LRU lub do ustawienia # twardy limit pamięci dla instancji (stosując politykę 'noeviction').
# # UWAGA: Jeśli masz slave podłączone do instancji z włączoną maxmemory, # Odejmuje się rozmiar wyjściowych potrzebnych do zasilania podrzędnych # z liczby wykorzystanych pamięci, tak aby problemy sieciowe / resynchronizacja # nie wywołuje pętli, w której są usuwane, a w konsekwencji wyjście # bufor slave jest pełen DEL-ów kluczy usuniętych, co wywołuje usunięcie # kolejnych kluczy i tak dalej, aż baza danych zostanie całkowicie opróżniona.
# # W skrócie... Jeśli masz dołączonych niewolników, zaleca się ustawienie dolnej części # limit dla maxmemory, aby w systemie było trochę wolnej pamięci RAM dla slave # wyjściowych (ale nie jest to konieczne, jeśli polityka to "noeviction").
# # UWAGA: nieustawienie maxmemory spowoduje zakończenie Redis z # wyjątek poza pamięcią, jeśli limit sterty zostanie osiągnięty.
# # UWAGA: ponieważ Redis używa pliku systemowego stronicowania do alokacji pamięci sterty, # zużycie pamięci w Zestawie Roboczym pokazywane przez Menedżera zadań Windows lub inne # narzędzia takie jak ProcessExplorer nie zawsze będą dokładne. Na przykład, prawda # po zapisie w tle plików RDB lub AOF, wartość zbioru roboczego # może znacząco spaść. Aby sprawdzić właściwą ilość użytej pamięci # przez serwer redis, aby przechować dane, użyj polecenia klienta INFO. The INFO # pokazuje tylko pamięć używaną do przechowywania danych redis, a nie dodatkową # pamięci wykorzystywanej przez proces Windows do własnych potrzeb. Th3 dodatkowa ilość # pamięci niezgłoszonej przez polecenie INFO można obliczyć, odejmując # Szczytowy zestaw roboczy raportowany przez Menedżera zadań Windows i used_memory_peak # zgłoszone przez komendę INFO.
# # maxmemory <bytes> Ostrzeżenie: Jeśli limit sterty zostanie osiągnięty, nieustawienie maksymalnej pamięci spowoduje zakończenie Redis z wyjątkiem wyjątku poza pamięcią.
Uwaga: Ze względu naRedis wykorzystuje pliki stronicowania systemowego do alokacji pamięci kopcowej,
Windows Task Manager lub inne narzędzia, takie jak Processexplorer, nie zawsze pokazują dokładne zużycie pamięci worksetu. Mówiąc prosto,Zużycie pamięci pokazane przez Menedżera zadań nie jest dokładne!!!
Użyj polecenia info, aby zapytać w następujący sposób:
# Pamięć 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: Brak eksmisji mem_fragmentation_ratio:1:00 mem_allocator:jemalloc-3.6.0
Ustawienia są następujące:
1073741824 bajtów = 1G Po ustawieniu klient redis .net dodaje błąd pamięci podręcznej w następujący sposób:
Polecenie OOM nie jest dozwolone przy użyciu pamięci > 'maxmemory'. # MAXMEMORY POLICY: jak Redis wybierze, co usunąć gdy maxmemory # zostało osiągnięte. Możesz wybrać spośród pięciu zachowań:
# # Volatile-LRU -> usuń klucz z zestawem wygaśnięcia za pomocą algorytmu LRU # allkeys-lru -> usuwa dowolny klucz zgodnie z algorytmem LRU # Volatile-Random -> usuwa losowy klucz z zestawem wygaśnięcia # allkeys-random -> usuń losowy klucz, dowolny # volatile-ttl -> usuń klucz z najbliższym czasem ważności (drobny TTL) # Noewiction -> wcale nie wygasają, po prostu zwracają błąd przy operacjach zapisu
# # Uwaga: przy każdej z powyższych polityk Redis zwróci błąd podczas zapisu # operacji, gdy nie ma odpowiednich kluczy do eksmisji.
# # W dniu zapisu te polecenia to: setnx setex addend # 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 executive sort
# # Domyślnie to:
# # Maxmemory-Policy Noelicittion #MAXMEMORY策略: Gdy MAXMEMORY
#到达. Możesz wybrać spośród pięciu zachowań:
#
#volatile LRU-> wykorzystuje algorytm LRU do usuwania kluczy z zestawami wygaszających
#allkeys LRU-> usuwa dowolny klucz zgodnie z algorytmem LRU
#volatile losowe – > usuwać losowe klucze z przeterminowanych zestawów
#allkeys losowe > usuwają losowe klucze, arbitralne klucze
#volatile TTL-> Usuń klucz z najbliższym czasem wygaśnięcia (Minor TTL)
#noeviction-> wcale nie wygasa, zwraca jedynie błędy operacji zapisu
#
#注意: Dla dowolnej z powyższych strategii Redis zwraca błąd przy zapisie
#操作, gdy nie ma odpowiedniego klucza do eksmisji.
#
#在编写之日 polecenia to: 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 Sortowanie Wykonawcze
#
#默认值为:
#
#maxmemory策略无效 Musisz też ustawić następujące konfiguracje:
Domyślne ustawienie redis jest bardzo konserwatywne, to znaczy, nie jest zapisywane po przekroczeniu limitu pamięci, a polityka może zostać zmieniona na algorytm LRU (ostatnio najmniej używany algorytm) – nowo zapisane informacje zastąpią stare dane.
Recenzja:
(Koniec)
|