Назад | Перейти на главную страницу

Сменить диск, используемый длительным процессом

Предположим, у меня есть процесс, который выполняет длительные вычисления (например, он работает несколько дней), он использует диск в качестве временного хранилища для хранения промежуточных результатов (например, смонтированный в /mnt и я хочу заменить /dev/sda1 по /dev/sdb1). Как я могу заменить этот диск другим, не прерывая этот процесс и не нарушая его слишком сильно?

Это общий вопрос, я не задумываюсь о конкретной программе. Допустим, мы запускаем последнюю версию Linux.

Любая программа, выполняющая вычисления, продолжающиеся несколько дней, должна быть спроектирована так, чтобы периодически фиксировать достаточное состояние на диске. Если перезапуск процесса означает, что вы потеряете час времени обработки, это может быть нормально, но если вы потеряете больше, я бы назвал эту программу плохо разработанной.

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

Возможные варианты:

  1. Использовать программный рейд
  2. Используйте другой уровень виртуального блочного устройства (возможно, LVM подойдет)
  3. Используйте файловую систему, которая сама может использовать несколько базовых устройств.

Это полностью зависит от поведения вашего процесса при использовании его временного хранилища.

Если в вашем процессе файл открыт на /mnt, то вы не сможете заменить устройство, не вызывая, скорее всего, сбоя процесса каким-либо неопределенным образом, даже если вам удастся принудительно отключить устройство. Обычно процессы не ожидают, что устройства, на которых у них есть открытые файлы, исчезнут.

Если ваш процесс открывается, записывает и закрывает файлы на /mnt, возможно, вам удастся его остановить, размонтировать и перемонтировать /mntи перезапустите его. Это зависит от того, сможете ли вы остановить процесс, пока он не использует /mnt. Чтобы ты мог

$ kill -STOP pid
$ lsof -p pid | grep /mnt
... then, if it has nothing open on /mnt ...
$ sudo umount /mnt
$ sudo mount /dev/sdb1 /mnt
$ kill -CONT pid

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

  • Проверить, если /mnt/wibble существуют
  • Оно делает! Готовимся открыть и прочитать
  • ... процесс останавливается, и на него устанавливается другое устройство /mnt...
  • ... процесс перезапускается ...
  • о нет! /mnt/wibble не открывается!
  • Умереть ужасно

Если процесс использует какой-либо каталог для создания и удаления временных файлов, вы, вероятно, можете попытаться остановить его с помощью kill -STOP $pid и найдите в / proc / $ pid / fd дескрипторы открытых файлов.

Если ничего не открылось, вы можете смело изменить место монтирования, скопировать его файлы и продолжить работу с kill -CONT $pid.

Если какие-то файлы все еще открыты или процесс не закрывает, вы можете попробовать перенести файловые дескрипторы с помощью GDB. Я попробовал это вручную, и это сработало, но я нашел сценарий, который может сделать это за вас: http://ingvar.blog.redpill-linpro.com/2010/07/10/changing-a-process-file-descriptor-on-the-fly/

Будьте осторожны, если процесс обменивается данными по сети, когда вы его останавливаете, соединения могут истекать по таймауту, поэтому вам нужно сделать это как можно быстрее (возможно, сначала проверьте последовательность команд на фиктивном процессе и запустите его как пакет)

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

РЕДАКТИРОВАТЬ: Вы также можете видеть открытые сетевые сокеты в / proc / $ pid / fd, чтобы вы могли определить, использует ли процесс сеть или нет.