Призупинити / відновити один процес на / з диска


22

Іноді ми хотіли б призупинити процеси, що займають пам'ять, на наших серверах Ubuntu та OS X, щоб тимчасово звільнити деяку оперативну пам’ять для інших завдань. Якби все, що нас хвилювало, - це використання процесора, Ctrl-Zспрацювало б просто . Однак нам потрібно мати можливість звільнити оперативну пам’ять (записавши її на диск), а потім перезапустити процес (диск -> ОЗУ) або іншими словами «сплячи» один процес. Будь-які підказки, як це зробити? (Переважно від CLI.) Дякую.


7
Я припускаю, що коли процес знаходиться в призупиненому стані, його використовувана пам'ять є кандидатом на заміну на диску, якщо це потрібно, і це потрібно робити автоматично з ядра.
enzotib

1
@enzotib - я поняття не маю, якщо це відбувається, і теоретично це звучить добре. Однак я просто зробив грубу перевірку і на практиці це не працює. Будь-які нові процеси, що виникають під час призупинення програми «Оперативної пам’яті оперативної пам’яті», є надзвичайно млявими, і я не виявляю жодної активності диска, яку можна було б очікувати, якщо оперативна пам’ять була замінена на диск.
Майк Ковінгтон

1
@frozenwithjoy Я можу підтвердити, що це відбувається. Єдині причини, з яких я можу подумати, що призупинений процес не буде поступово замінюватися, це якщо він вимагає незамінну пам'ять (досить рідкісна і (в основному) зарезервована для кореня) або якщо пам'ять, яку вона відображає, ділиться з іншим, активним процесом .
Жил "ТАК - перестань бути злим"

1
Термін, який може допомогти тут, - це "контрольна точка" (так, потворна форма дієслова). Це, як правило, складна проблема, оскільки програма може використовувати деякі ресурси, які можуть змінити стан, поки програма спить. Управління цією проблемою було однією з відмінностей між "Великим Залізним" та "трохи чудернацьким" комп'ютером.
dmckee

Відповіді:


8

Не існує загального засобу для сплячки одного процесу, а лише всієї системи.

Однак якщо вам не байдуже, що зображення процесу не переживе перезавантаження, є вбудована програма для збереження зображення процесу на диск: заміна. Переконайтеся, що у вас є достатньо місця для обміну, і якщо тиск в пам'яті і процес не активний (наприклад, тому, що він призупинений), його пам'ять буде замінена.

Якщо ви знаєте, що процес, ймовірно, буде тривалий час неактивним і вам знадобиться швидкий час реакції в якийсь момент, ви можете змусити звільнити багато оперативної пам’яті, виділивши багато оперативної пам’яті в короткочасний процес, наприклад

perl -e '$tmp = "a" x 999999999' # allocate about 1GB

Ви не маєте ніякого контролю над тим, що заміняється, тому інші процеси можуть бути замінені. В Linux ви можете замінити процес назад, примусово переходячи до сторінок, які він карта. Сценарій у цій відповіді зробить це так: завантажте в пам'ять всі сторінки, відображені процесом (зауважте, що це включає відкриті файли; ви можете переміщати регіони вибірково на основі інформації карти, щоб уникнути заміни даних, які знаєте, що вам не потрібно , див. цю відповідь для отримання додаткової інформації).


13

Термін, який ви шукаєте, - "Перевірка заявки ".

Мені відомі інструменти, які можуть це зробити, - це CryoPID і CryoPID2 .

Обидва інструменти призначені лише для Linux.

Я не знаю подібного інструменту для BSD або OS X.


2
Ще один додаток для використання - DMTCP: dmtcp.sourceforge.net
Мисливець на оленів,

5

Переконайтеся, що у вас є багато місця для обміну. Переконайтеся, що ваша система налаштована на обмін неактивними сторінками ( vm.swappiness = 100 ). Тоді має бути достатньо призупинити процес. Ядро вважає за краще заміняти неактивні сторінки.


-1

На Mac OS X ви можете спробувати скористатися purgeкомандою (надається з Xcode), щоб звільнити деяку (неактивну) ОЗУ.

vm_stat
purge
vm_stat

2
purgeне допомогло б тут. Він видаляє кеш диска, але це не спричинить заміну пам'яті процесу, і це не зробить швидше для іншого процесу отримання оперативної пам'яті.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.