Возможно, я смогу ответить на этот вопрос, так как я столкнулся с этой проблемой некоторое время назад, а также решил ее после того, как какое-то приложение R & D.Mor ROR работает в режиме реального времени и имеет более 8000+ изображений и интенсивную загрузку ЦП, поскольку в моем приложении происходит гораздо большесервер, так как каждый запрос использует LAT / LNG для обслуживания гео-вычисленного ответа. Я столкнулся с этой проблемой нехватки памяти, так же, как и у вас, когда я начал и переиндексировал свои данные наasticsearch.
Мои уроки-
- ElasticSearch - это монстр, который съест вашего барана.
- Не имеет значения, насколько оптимизированы ваши ключевые слова ИЛИ данные, которые вы нажимаете наasticSearch для индексации,у вас должен быть буфер по умолчанию для резервной памяти.
Что я сделал ... это решило мою проблему ...
- Добавьте пространство подкачки , которое действует как резервная память на случай, если ваша оперативная память будет израсходована.
- Я также обновил до 8 ГБ HD, чтобы быть на более безопасной стороне.
Теперь, так какя следовал завышеупомянутые шаги, я не сталкиваюсь с какой-либо низкой ошибкой памяти, несмотря на то, что размер моих данных indexex становится огромным каждый месяц. Более того, я по-прежнему хорош, чтобы избежать ошибок и проблем с памятью при индексации этих огромных данных.
Еще одна вещь, которую я недавно сделал для улучшения потребления памяти моего приложения на Rails внедряет jmalloc в мой ruby 2.4.1. Вы можете прочитать больше здесь , но простыми словами, это помогает улучшитьпотребление памяти приложениями ruby. Скопированное объяснение Jmalloc будет выглядеть так:
Ruby традиционно использует функцию языка C malloc для динамического выделения, освобождения и перераспределения памяти при хранении объектов.Jemalloc - это реализация malloc (3), разработанная Джейсоном Эвансом (отсюда и инициалы je в начале malloc), которая, по-видимому, более эффективна при распределении памяти по сравнению с другими распределителями из-за ее сосредоточенности на предотвращении фрагментации и масштабируемой поддержке параллелизма.
Ниже приведены шаги, которые я предпринял, чтобы добавить Jmalloc в свой существующий Ruby 2.4.1, переустановив 2.4.1 на моем производственном сервере (после тестирования на staging / dev) с помощью rvm.
===========CHECK RVM --
rvm info
============ check ruby version
ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
========== if ruby is installed, reinstall with Jemalloc and compile
=============REINSTALL RUBY WITH JAMALLOC
rvm reinstall 2.4.1 -C --with-jemalloc --disable-binary
============VERIFY JMALLOC IN THE BELOW LIST of ruby compiling list
ruby -r rbconfig -e "puts RbConfig::CONFIG['LIBS']"
-lpthread -ljemalloc -lgmp -ldl -lcrypt -lm
Результаты внедрения jmalloc в ruby были просто выдающимися даже после тестирования 2000 случайных запросов, моя общая память приложения составляла всего 364 МБ и оставалась неизменной при тестировании с использованием нижеприведенных гемов тестирования.
gem "memory_profiler"
gem "derailed_benchmarks"
надеюсь, это поможет