Як зупинити процес Linux для подальшого виконання, замінивши його пам'яттю


19

Я хочу зупинити тривалий процес, щоб він не споживав жодних процесорних чи фізичних ресурсів пам'яті з наміром відновити той самий процес у майбутньому.

Я знаю, що частина процесора досяжна за допомогою SIGSTOPта передачі SIGCONT сигналів, але чи можливо негайне негайне розгортання сторінки (заміни у випадку брудних сторінок) негайно приватної RSS-пам’яті про зупинений процес?


1
Який задум стоїть за цим? Ви хочете, щоб процес відновився швидше? Або ви хочете запобігти запису конфіденційних даних на диск? Або щось інше? Якщо ми знаємо намір, ми можемо дати кращі відповіді.
Олівер

13
ОС зробить це автоматично. Дійсно немає причин робити щось конкретне.
Девід Шварц

@oliver Я створюю плановий пакет ( github.com/brutusin/wava ). Поточна реалізація пропонує непередбачуване планування, але я хочу перейти на попереджувальне (можливість зупинити виконання завдань), щоб витончено уникнути деяких ситуацій із тупиком, коли всі запущені завдання залежать від чергових завдань. Мені потрібна саме така поведінка, яку я запитував, продовжуючи зупиняти процеси (не створюючи нових з контрольної точки)
idelvall

1
@DavidSchwartz, що є ризикованим твердженням
idelvall

@idelvall Тоді це здається, що ти не хочеш робити нічого особливого для пам’яті.
Девід Шварц

Відповіді:


11

Ви можете заглянути в техніку, яку називають контрольно-пропускною. Це дозволить вам взяти запущений процес і зберегти його стан у набір файлів, а потім відновити його в більш пізній час.
Щоб скористатися ним, почніть з установки програми criu [ git , wiki ] ( yum install criuабо apt install criu).

Щоб перевірити запущений процес, створіть порожній каталог для зберігання його файлів та CD у цьому каталозі.

mkdir /var/tmp/checkpoint
cd /var/tmp/checkpoint

Тепер перевірте запущений процес. У цьому випадку я використовую -shell-завдання, оскільки мій процес працює в оболонці з пов'язаним tty.

criu dump -t 404 --shell-job

404 - це процес, який я хочу перевірити. Коли я це роблю, я бачу, що мій запущений процес вбивається, і каталог / var / tmp / checkpoint заповнюється набором файлів, необхідних для його відновлення.

Щоб відновити процес, я переконуюсь, що я перебуваю в каталозі з файлами контрольної точки і виконую відновлення.

cd /var/tmp/checkpoint
criu restore --shell-job

Процес підбере місце, де він зупинився, у терміналі, де це було запущено. Якщо я вбиваю цей запущений процес і запускаю criu restore --shell-jobще раз, він повернеться до контрольної точки і запуститься знову.

Сподіваюсь, це допомагає.


4
Це не робить те, що заявляє ОП, що вони хочуть зробити. Спробуйте - зменшення використовуваної пам'яті не буде. Він просто перейде з приватної пам'яті процесу в кеш диска (завдяки виписуванню набору файлів). Це просто робить додатковий крок збереження та додатковий крок відновлення, і та сама пам'ять використовується (і викидається) таким же чином. Насправді це може погіршити ситуацію, оскільки частина пам'яті дублюється через створення всього нового для виписки.
Девід Шварц

хе, хороший пункт @David, особливо якщо /tmpце tmpfs (підкріплений пам'яттю / swap space). Якщо ви встановите контрольну точку до звичайної файлової системи, що підтримується диском, ви можете використовувати vmtouch -eдля виселення сторінок із кеш-сторінки, але вона тимчасово використовує додаткову оперативну пам'ять. (Якщо у вас criuнемає можливості зробити пряме введення-виведення (з O_DIRECT) ...)
Пітер Кордес

1
Важко дізнатися, чи цього хоче ОП, чи ні, оскільки ОП вимагає конкретного рішення, а не пояснення, яку проблему він намагається вирішити. Це може бути ідеальною відповіддю, або це може бути для нього марним, ми не можемо сказати.
Девід Шварц

Я ще не переглянув це докладно, але здається, що відновлений процес - це новий процес (інший pId), і це не точно те, що мені потрібно ...
idelvall

1
@idelvall: Ось так працює більшість ароматів контрольно-пропускного пункту. Одним з основних випадків використання є економія прогресу в обчисленні через перезавантаження.
Пітер Кордес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.