Очень быстрый откат виртуальной машины

Описание: существует ли виртуальная машина, оптимизированная для быстрого отката в памяти до предыдущего состояния?

Я напрасно пытался на StackOverflow и SuperUser - возможно, это правильное место, чтобы задать этот вопрос.:)

Я ищу самый быстрый способ отката виртуальной машины до ранее известного состояния. Я буду делать много откатов до одного и того же состояния. Создание снимка может быть медленным, но откат должен быть быстрым.

В идеале мне бы хотелось, чтобы производительность отката была максимально приближена к производительности единственной memcpy().

В настоящее время я тестирую что-то на своем портативном компьютере (Mac OS X), но позже разверну это на мощном сервере Linux. Переносимость была бы хорошей, но хорошо работать только на Linux. Коммерческие решения хороши, если они выполняют свою работу.

Для справки, вот как долго memcpy() занимает на моей машине: ( Код доступен здесь.)

     Размер Время
 ========= ========= 
    64 МБ 0,030 с
   128 МБ 0,085 с
   256 МБ 0,140 с
   512 МБ 0,290 с
  1024 МБ 0,600 с

До сих пор я пробовал VirtualBox и VMWare Fusion на моей машине. Производительность была сопоставима для обоих.

В идеале я бы также хотел откатить состояние диска. Кажется, что VirtualBox поддерживает "неизменяемые" диски, где весь дисковый ввод-вывод записывается в дифференциальный файл и отбрасывается при откате. Это похоже на естественную посадку.

Для отката виртуальной машины VirtualBox с 2,5 ГБ выделенной оперативной памяти с сохранением состояния на диске (SSD) потребовалось ~35 секунд.

Поскольку ожидается, что дисковый ввод-вывод будет медленным, я создал диск RAM (отформатированный как HFS+) и перенес туда снимки. Откат виртуальной машины без изменений до того же состояния занимает ~16,5 секунд.

Данные снимка занимают 1,11 ГБ. Таким образом, VirtualBox откатывает с диска ОЗУ ~15 с / 1 ГБ данных. Это в 6,72 раза больше, чем memcpy(). (Вызывает ли перегрузка системы ввода-вывода Mac OS X такую ​​большую нагрузку?)

Поскольку я не знаю способа откатить виртуальную машину VirtualBox, не выключив ее сначала, а затем не запустив ее снова, возможно, что это вызвано другими факторами.

В идеале гипервизор должен хранить все состояния снимка в основной памяти и использовать memcpy() для отката, что позволяет нам откатиться через ~5 секунд. (Еще более умный гипервизор может реализовать копирование при записи на страницы и только те страницы памяти, которые действительно изменились.)

Существуют ли какие-либо гипервизоры, оптимизированные для рабочих нагрузок с частым откатом? Если нет: какой может быть самый жизнеспособный способ реализовать такую ​​вещь сам?

(Я также провел небольшое исследование по откату на уровне процесса, и, кажется, есть некоторые интересные решения для этого для Linux; но наличие откатов для произвольных приложений и возможность отката ввода / вывода - большие плюсы.)

(Что я действительно хочу сделать, так это откат к контрольной точке в произвольных приложениях Java, в идеале вместе с их вводом / выводом. Я нашел только мертвые исследовательские проекты для отката JVM, но, возможно, кто-то знает о более текущей работе? однако мне нужно было бы делать это с произвольными приложениями Java.)

2 ответа

Я не знаю, каковы ваши реальные потребности. Однако возможно ли запустить несколько клонов и выполнить какое-то круговое распределение нагрузки? Затем вы можете откатить эти машины в фоновом режиме, и у вас будет больше времени для этого.

На самом деле, нет. Цель моментального снимка состоит в том, чтобы сделать "снимок" текущего состояния системы, поэтому, если что-то пойдет не так в ближайшем будущем (обновление или установка программного обеспечения), его можно быстро вернуть в состояние, предшествующее установке. Таким образом, вам не нужно делать полное восстановление из резервной копии. Снимки должны храниться в течение короткого периода времени и сохранять их чистыми в соответствии с VMWare.

Что-то похожее на то, что вы ищете, - это VMWare Site Recovery Manager, который позволяет вам иметь полностью реплицированную инфраструктуру виртуальных машин и только частично работать на то, что вам нужно. Я не верю, что он точно соответствует вашим целям, потому что это больше для зеркальной копии вашей виртуальной машины, а не для состояния "отката" вашей виртуальной машины.

Другой вариант, который я знаю о VMWare и, возможно, VirtulBox, - это создание запланированных задач, автоматизирующих моментальный снимок и реверсию с помощью командной строки (PowerCLI). Затем он создаст снимок и вернется обратно по расписанию.

Кроме того, если вам приходится делать снимки и выполнять откат часто, возможно, что-то не так в вашем процессе. Возможно, объяснение, почему вы делаете это, получило бы лучшие ответы.

редактировать

Я думаю, что лучший подход к этому может состоять в том, чтобы просто запустить несколько ВМ, все с одной базовой линией. По сути, клонируйте первые 3 или 4 дополнительные виртуальные машины и используйте их для тестирования. Что это будет делать, как только начальный набор тестов будет выполнен на VM1, начните тестирование на VM2. Откатите VM1 со снимком, пока это происходит. Затем, как только VM2 будет завершен, перейдите к VM3 и откатите VM2. Затем вернитесь к VM1, когда VM3 будет завершена, и откатите VM3. Если к тому времени, когда вы закончите работу с VM3, VM1 еще не завершит откат, добавьте дополнительную VM. Таким образом, когда вы достигнете, так сказать, конца "линии", VM1 будет выполнен с откатом. Поскольку он автоматизирован, вы можете использовать PowerCLI или какую-либо командную строку, чтобы отменить моментальный снимок после завершения теста.

Другие вопросы по тегам