Некоторые системы Linux становятся очень медленными, когда Redis загружает большой набор данных
Я получил отчет от пользователя Redis, и я не уверен, что ответить, так как я не эксперт в области Linux и его планировщика, однако нам (как проекту Redis) нужно особенно разбираться в подобных проблемах. в будущем, как и в Redis Cluster, у нас будет много экземпляров Redis, запущенных одновременно в одном окне. Поэтому я прошу помощи здесь.
Проблема:
- Ядро: "Linux redis1 2.6.32-305-ec2 #9-Ubuntu SMP четверг 15 апреля 08:05:38 UTC 2010 x86_64 GNU/Linux"
- много свободной оперативной памяти, никакие другие процессы не выполняют значительных операций ввода-вывода.
- Важно, работает на большом экземпляре EC2, а не на реальном сервере. Я никогда не видел ничего подобного в не виртуализированной среде. Экземпляр EC2 представлял собой: "Экстра большого объема 17,1 ГБ, большой объем памяти, 6,5 ЭБУ (2 виртуальных ядра с вычислительными блоками 3, 25 EC2 каждый), 420 ГБ локального хранилища экземпляров, 64-разрядная платформа".
По сути, после перезапуска большого экземпляра Redis система будет работать так медленно, что вы больше не сможете печатать на оболочке. Когда Redis загружает экземпляр, он использует 100% ЦП (загружает данные максимально быстро) и последовательно читает файл dump.rdb. Ввод / вывод не особенно высок, поскольку загрузка связана с процессором, а не с вводом / выводом.
Почему на самом деле коробка с двумя процессорами и большим количеством оперативной памяти, без перестановок на диске, должна в основном перестать работать с этой рабочей нагрузкой?
У меня сложилось впечатление, что это во многом связано с тем фактом, что это экземпляр EC2, что связано с используемой технологией виртуализации, поскольку я постоянно загружаю наборы данных Redis 24 ГБ в свой ящик без каких-либо проблем (даже с другими экземплярами Redis). работает с высокой нагрузкой).
Спасибо за любую подсказку!
Salvatore
Изменить: добавив некоторые отзывы, которые я получил из твиттера:
от @ezmobius: @antirez первым делом, попробуйте его из /mnt или локальных эфемерных дисков, чтобы увидеть, не является ли его EBS ненадежным, 2-й, чтобы убедиться, что это не "штраф за первую запись" (google it), и если это так сначала вы должны dd 0 на диске.
from @dvirsky: @antirez Я запускаю много экземпляров redis именно на таких узлах ec2. Я заметил некоторое замедление на bgsave, но не это явление.
3 ответа
Вывод 'top' может дать некоторые подсказки. В левом верхнем углу есть поле с надписью "% украдено", которое отражает количество аппаратного ЦП, перенаправленного на другие гости в том же физическом блоке. Я видел подобные замедления, когда гипервизор решает выделить больше ЦП другому гостю, особенно когда я выполняю какую-то длительную задачу, интенсивно использующую ЦП.
Не уверен, если это ваша проблема или нет, но стоит проверить.
У меня была такая же проблема на экземпляре EC2. Вероятно, это не связано с Redis - это происходит, когда происходит высокий IO (например, когда redis загружает файл дампа).
Посмотрите эту ветку на форумах Amazon: https://forums.aws.amazon.com/thread.jspa?messageID=215406
Я экспериментировал с разными ядрами / образами, и теперь он работает нормально (на старом ядре 2.6.21).
Вы должны проверить процессор украсть (xx.x%st
на правой стороне линии процессора), что top
показывает, когда вы испытываете 100% нагрузки и замерзшей оболочки. Steal показывает, сколько ваших фактических циклов ЦП украдено с вашей машины гипервизором и передано другой машине. Кража процессора актуальна только в виртуализированных средах. У меня возникла именно эта проблема с микроэкземплярами, из-за которой мой экземпляр стал непригодным к работе в течение примерно 1 часа (до тех пор, пока моя задача не была завершена) при выполнении задач с интенсивным использованием процессора.
Вы можете найти больше на эту тему, прочитав этот пост на Rreglings Грега. Хотя, если вы поверите слову Грега, это должно происходить только на микроинстанциях.