Incidentu reaģēšana

Redis OOM "command not allowed": maxmemory un izlikšanas politikas

Ieraksti sāk neizdoties ar "OOM command not allowed", vai kodols nakts vidū nogalina Redis. Abos gadījumos vainīgi atmiņas limiti, kurus neviens apzināti nav iestatījis. Kā darbojas maxmemory, kuru izlikšanas politiku izvēlēties un kā noteikt Redis atmiņas apjomu, lai tas paliktu darbā.

· 11 min lasīšanai · AG Data komanda

Ja jūsu lietotne pēkšņi žurnālā raksta OOM command not allowed when used memory > 'maxmemory', Redis dara tieši to, kas tam likts: tas sasniedzis atmiņas limitu un atsakās pieņemt ierakstus, nevis izliek atslēgas. Pretējā kļūme ir vēl sliktāka: limita nav vispār, Redis aug, līdz Linux OOM killer to izbeidz, un jūsu kešatmiņa vai rinda pazūd vienā mirklī. Abām ir viens cēlonis: Redis maxmemory un izlikšanas politikas iestatījumi, kurus neviens nav apzināti izvēlējies. Šajā rakstā: kā darbojas limits, kā izvēlēties izlikšanas politiku un kā reālistiski plānot atmiņu. Viss šeit rakstītais attiecas arī uz Valkey.

Ko OOM kļūda patiesībā nozīmē

Redis pārbauda atmiņas lietojumu ikreiz, kad klients izpilda komandu, kas pievieno datus. Ja lietojums pārsniedz maxmemory, Redis piemēro iestatīto maxmemory-policy. Ar noklusējuma politiku noeviction nekas netiek izlikts: serveris atgriež kļūdu, mēģinot izpildīt komandas, kas saglabā jaunus datus, bet lasīšana turpina darboties (Redis dokumentācija: atslēgu izlikšana).

Tātad kļūda nav avārija. Tā ir Redis pašaizsardzība. Jautājums ir, vai jūs vēlaties tieši šādu uzvedību, un atbilde atkarīga no tā, ko tajā glabājat.

Vispirms izlemiet: vai šis Redis ir kešatmiņa vai datubāze?

No šī lēmuma izriet viss pārējais.

Izlikšanas politikas vienkāršiem vārdiem

Lamatas: volatile-* politikas uzvedas kā noeviction, ja nevienai atslēgai nav TTL. Komandas iestata volatile-lru, aizmirst, ka puse lietotnes raksta atslēgas bez derīguma termiņa, un tik un tā saņem OOM kļūdas. Ja izvēlaties volatile politiku, pārbaudiet, vai atslēgām, kuras paredzēts izlikt, tiešām ir TTL.

Redis LRU un LFU ir tuvinājumi: Redis paņem dažu atslēgu paraugu (maxmemory-samples, noklusējums 5) un izliek labāko kandidātu no tām. Palielinot paraugu skaitu līdz 10, rezultāts tuvojas īstam LRU uz nelielu CPU rēķina. Lielākajai daļai slodžu ar 5 pietiek.

maxmemory izmērs: kāpēc "visa RAM" ir nepareizi

64 bitu sistēmās maxmemory pēc noklusējuma ir 0, kas nozīmē bez limita. Tieši tā Redis nonāk līdz kodola nogalināšanai. Iestatiet to skaidri un atstājiet vietu lietām, kas nav jūsu dati:

  1. Papildu izmaksas un fragmentācija. Redis administrēšanas ceļvedis to saka tieši: ja domājat, ka jums ir 10 GB brīvas atmiņas, iestatiet 8 vai 9 (Redis administrēšana).
  2. Replikācijas un AOF buferi. Atmiņa buferiem, kas gaida nosūtīšanu replikām vai AOF failam, netiek ieskaitīta maxmemory. Ar replikāciju vai saglabāšanu atstājiet tiem brīvu RAM. INFO memory pašreizējo apjomu rāda kā mem_not_counted_for_evict.
  3. Fork saglabāšanas laikā. Kad Redis raksta RDB momentuzņēmumu vai pārraksta AOF, tas izveido fork. Lietotnē ar daudz ierakstiem saglabāšanas laikā Redis var izmantot līdz 2 reizēm vairāk atmiņas nekā parasti, jo mainītās lapas tiek kopētas. Plānojiet to, citādi tieši saglabāšanas brīdī uzbruks OOM killer.
  4. Citi procesi serverī: monitoringa aģenti, Sentinel, OS lapu kešatmiņa saglabāšanas failiem.

Administrēšanas ceļvedis iesaka arī vm.overcommit_memory = 1, lai fona saglabāšana neizgāztos uz fork(), un izslēgt Transparent Huge Pages, kas var pasliktināt atmiņas lietojumu un latentumu.

Kā diagnosticēt Redis, kam beidzas atmiņa

redis-cli INFO memory
redis-cli INFO stats
redis-cli MEMORY DOCTOR
redis-cli --bigkeys

Ko darīt, ja tas notiek tieši tagad

  1. Ja tā ir tīra kešatmiņa, pārslēgšanās uz izliekošu politiku darbības laikā ir ātra: CONFIG SET maxmemory-policy allkeys-lru. Pēc tam saglabājiet to konfigurācijas failā.
  2. Ja tajā ir svarīgi dati, nepārslēdzieties uz izlikšanu panikā: jūs dzēstu datus, lai kļūda pazustu. Palieliniet maxmemory, ja serverim tiešām ir brīva RAM, vai palieliniet resursus, tad noskaidrojiet, kas izauga.
  3. Meklējiet atslēgu, kas uzsprāga. Nevaldāms saraksts vai kopa ir bieža parādība, un šīs vienas atslēgas salabošana bieži atbrīvo lielāko daļu atmiņas.
  4. Pārbaudiet atslēgas bez TTL, kurām tas bija paredzēts.

Kā novērst atkārtošanos

Galvenās atziņas

Redis Valkey Atmiņa Izlikšana
Sadarbība ar mums

Redis pietrūkst atmiņas?

Mēs plānojam, pielāgojam un novēršam problēmas Redis un Valkey produkcijā: atmiņas limiti, izlikšana, saglabāšana, replikācija un pārslēgšanās.

Sazināties Vairāk no emuāra