Redis
 sql >> база данни >  >> NoSQL >> Redis

redis bgsave не успя, защото fork не може да разпредели памет

По-конкретно, от често задаваните въпроси на Redis

Схемата за фоново запазване на Redis разчита на семантиката за копиране при запис на fork в съвременните операционни системи:Redis се разклонява (създава дъщерен процес), който е точно копие на родителя. Детският процес изхвърля DB на диск и накрая излиза. На теория детето трябва да използва толкова памет, колкото родителят е копие, но всъщност благодарение на семантиката на копиране при запис, внедрена от повечето съвременни операционни системи, родителският и дъщерният процес ще споделят общите страници с памет. Една страница ще се дублира само когато се промени в дъщерния или в родителския. Тъй като на теория всички страници могат да се променят, докато дъщерният процес се записва, Linux не може да каже предварително колко памет ще заеме детето, така че ако настройката overcommit_memory е настроена на нула вилка ще се провали, освен ако няма толкова свободна RAM, колкото изисква се наистина да се дублират всички родителски страници с памет, в резултат на което ако имате набор от данни Redis от 3 GB и само 2 GB свободна памет, той ще се провали.

Задаването на overcommit_memory на 1 казва на Linux да се отпусне и да изпълнява форка по по-оптимистичен начин на разпределение и това наистина е това, което искате за Redis.

Redis не се нуждае от толкова памет, колкото ОС смята, че трябва, за да записва на диск, така че може предварително да се провали във вилка.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да използвам повторно Redis връзка в socket.io?

  2. Използвайки Predis, как да SET (т.е. да съхранявате) многоизмерен асоциативен масив?

  3. Spring Data Redis:Redis Pipeline връща винаги нула

  4. Как да съхраня двоичен обект в redis с помощта на node?

  5. Не можа да се получи ресурс от пула (SocketTimeoutException:)