Поміняйте розмір розділу на комп'ютері оперативної пам’яті об’ємом 64 Гб для роботи в пам’яті


36

У мене на комп’ютері є 64 Гб оперативної пам’яті та 240 ГБ SSD , які я збираюся використовувати для обчислювань, які потребують пам'яті (машинне навчання, обмін даними тощо). Більшість порад, які я знайшов в Інтернеті, стосуються близько 2-4-8 ГБ оперативної пам’яті, і вони рекомендують в 2 рази розмір розділу RAM своп (тобто 128 ГБ).

Чи розумно зробити розділ обміну 128 ГБ? які переваги я отримую, зробивши величезний розділ свопу?

Чи правильно я розумію, що у випадку, якщо у мене закінчиться фізична ОЗУ:

  1. Якщо у мене немає заміни, я отримую помилку "поза пам'яттю"
  2. Якщо у мене є підміна, деякі сторінки ОЗУ будуть скопійовані для підкачки розділу, і програма продовжить працювати (хоча і повільніше).

Деякі люди кажуть, що це зробити погано ідею на SSD, оскільки це обмежена кількість циклів читання / запису. Наскільки швидко за допомогою swap він вичерпає цикли читання / запису SSD (наскільки я знаю, це близько 50000 запису IOPS)?

Я використовую Linux ( Ubuntu 14.04 (Trusty Tahr)).

Наразі встановити обмін на 16 ГБ, як це, безумовно, повинно бути достатньо (наприклад, RedHat пропонує 4 ГБ), а 16 ГБ дискового простору насправді не велика справа.


1
Замість того, щоб чітко покладатися на своп, якщо ви знаєте розмір робочого фронту або готові зробити трохи більше управління пам'яттю низького рівня, подумайте про те, mmapщоб виділити свої робочі сторінки. Тоді ваша кількість свопів буде точно тією, яка вам потрібна для вашого процесу.
пухнастий

5
Порада, що рекомендує «вдвічі більше оперативної пам’яті», відноситься до старих часів, коли на комп'ютерах було мало оперативної пам'яті. У кількох документах зазначено, що він застосовується в першу чергу для комп'ютерів з <2 Гб оперативної пам’яті. Крім того, розмір swap здебільшого пов'язаний з тим, що ви робите з машиною.
Джон У. Сміт

Дивіться також цю помилку сервера Q & a - якщо ви працюєте на Java (і, можливо, інших додатках), ви хочете переконатися, що у вас є достатній обмін для них, щоб збільшити розмір пам’яті. Я особисто дотримуюся стандарту RHEL оперативної пам’яті + 2 для мого розділу swap
warren

2
Прикро, що більшість коментарів тут було видалено. Додавання ще: До речі, варто згадати, що якщо ваше ядро ​​підтримує його, ви, можливо, захочете змонтувати свій swap-розділ discardна SSD. Також (і це було зазначено у відповіді нижче), не забувайте, що ви можете використовувати файл замість розділу для потенційно простішого управління (і жодних показів на SSD, наприклад, фрагментації).
Джейсон C

1
Якщо у вас є пам’ятка, що займає пам’ять, як, наприклад, навчання SVM, і у вас закінчується оперативної пам’яті та починаєте мінятись, все стане занадто млявим, щоб відновитись, і ваш єдиний доступний хід - це витягування штекера (що трапилося зі мною пару разів) . Ви, мабуть, хочете, щоб ваш процес був знищений OOM, якщо він почне мінятися, щоб ви могли принаймні змінити речі та почати заново. Можливо, із SSD накопичувачами це не так вже й погано. Я б також перевірив налаштування OOMK - мені траплялося, що на Ubuntu іноді процеси забиваються OOM, коли ще залишається багато оперативної пам’яті, тому що вони виділяються агресивно
pqnet

Відповіді:


36

Вам, напевно, потрібна лише невелика кількість свопів. Коли у вас є достатня оперативна пам’ять для типового робочого набору для вашого комп’ютера, що я впевнений, що ви робите, вам потрібен лише обмін на дві речі:

  1. Вам потрібна заміна, щоб отримати інформацію, до якої, швидше за все, ніколи не звертаються з оперативної пам'яті, щоб звільнити більше місця для кеш-диска. Багато програм працює під час запуску системи і більше ніколи не матимуть доступу до них. Ви не хочете, щоб жодна сторінка, яку вони забруднили, застрягла в ОЗУ назавжди. Тож вам потрібна своп, щоб утримувати їх.

  2. Вам потрібен своп, щоб покрити асигнування, які ніколи не заповнюватимуться. Цей простір просто повинен бути доступним, навіть якщо він не буде використовуватися. Без цього системі доведеться відмовитись від розподілу пам'яті, навіть якщо вона має достатню кількість вільної фізичної оперативної пам’яті, оскільки вона не має достатнього резервного накопичувача, щоб дозволяти використовувати всі її виділення відразу.

Жоден з них не вимагає великої кількості свопів. Наприклад, 16 ГБ повинно бути більш ніж достатньо. Мета полягає в тому, щоб не пускати великі робочі набори ціною швидкості. Мета полягає в тому, щоб ви могли ефективно використовувати свої 64 Гб, а не потрібно засмічувати їх сміттям або резервувати його для крайових випадків, які ніколи не відбудуться.

(Я погоджуюсь з Бертом, що 4 ГБ цілком ймовірно буде достатньо.)


2
@wrwt Помістіть свій розділ swap в кінці диска (або принаймні після розділу даних), це дозволить зробити його розмір швидшим і менш інтенсивним при записі, якщо ви коли-небудь захочете налаштувати його (точніше, це зробить розмір розділу розділу даних щоб розмістити його простіше, оскільки не потрібно рухати старт). Немає зв'язку між позицією та роботою на SSD, як це іноді є на механічних накопичувачах.
Джейсон C

Хоча ця відповідь, ймовірно, достатня для більшості любителів, то це справді погана порада для справжніх серверів - відповідь залежить від того, як написано програму, оскільки нестача місця для обміну пам’яттю призведе до того, що вбивця поза пам’яттю влучить і припинить обробляти випадковим чином (так, ви правильно прочитали; "випадковий")
Soren

3
@Soren Це суперпользователь, а не сервер за замовчуванням. ;) Безумовно, правда, що налаштування простору підкачки - не єдине рішення, яке потрібно прийняти для "справжніх серверів". Вам також потрібно приймати рішення щодо таких завдань, як надмірна комісія, можливо, вам доведеться налаштувати вбивцю OOM тощо. (І відповіді набагато складніші, якщо ви очікуєте, що ваш робочий набір перевищить фізичну оперативну пам'ять. Але майже ніхто більше не працює на таких машинах.)
David Schwartz

5
Linux буде надмірно заповнювати пам'ять навіть без включеної підкачки. Він просто обробляє OOMK, коли фактично використовується занадто багато пам'яті. Тож другий пункт відповіді невірний.
Руслан

1
@MaciejPiechotka Або скористайтеся файлом.
Джейсон C

29

RedHat рекомендує 4 Гб на машині з 64 ГБ .

Однак розміщення розмірів - це більше мистецтво, ніж наука. Це залежить від того, для чого використовується машина, скільки місця на диску та пам’яті та інших факторів. Пам'ятайте, що ви завжди можете додавати більше свопів пізніше.

Використання правила 2X фізичної пам'яті застаріло, оскільки кількість систем пам'яті має сьогодні. Але працювати з нульовим свопом не рекомендується, якщо ви не знаєте, що робите. Рекомендація 4 Гб - хороша відправна точка.


12
+1 за останній абзац. Рекомендація 2x бере початок, коли на більшості комп'ютерів не вистачало оперативної пам’яті, щоб уникнути заміни при звичайному використанні. Суб'єктивно, якщо за допомогою комп'ютерів тоді, 2x обмеження, як видається, було вибрано як достатньо велике число, що комп'ютер стане неприпустимо повільним, перш ніж закінчиться своп.
Дан Нілі

1
2X також добре працював, коли системи мали 4 ГБ / 8 ГБ оперативної пам’яті та сотні гігабайт дискового простору. Звичайно, це було, мабуть, більше, ніж потрібно, але в чому шкода? Але тепер, коли системи мають 16 ГБ / 64 ГБ оперативної пам’яті та 128 ГБ / 256 ГБ SSD, шкода очевидна.
Девід Шварц

12

В Linux вам потрібна достатня кількість свопів, щоб загальна доступна віртуальна пам'ять (RAM + SWAP) була достатньою для всіх процесів, які ви хочете запустити, і їх максимального віртуального сліду.

Якщо у вас менше заміни, ніж ця, або взагалі немає заміни, то трапляється така ситуація: у системи не вистачає пам'яті, намагаючись виділити сторінку. Але це все-таки м'який збій, навіть якщо немає підкачки, оскільки в системі є безліч сторінок "жертви", які можна видалити, щоб звільнити місце: а саме сторінки всіх файлів, що підтримуються файлами, наприклад, виконувані файли і спільні бібліотеки!

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

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

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

dd if=/dev/zero of=/path/to/swapfile size=$((1024 * 1024)) count=32768  # 32 Gb.
mkswap /path/to/swapfile
swapon /path/to/swapfile

Коли вам це більше не потрібно:

swapoff /path/to/swapfile
rm /path/to/swapfile

Примітки:

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

  2. Існують способи змусити Linux вийти з ладу, коли немає пам'яті, а саме через маніпулювання значеннями цих записів у sysctl:

    vm.overcommit_memory
    vm.overcommit_ratio
    

2
+1 для фактичного перегляду параметрів конфігурації ядра - Ключ знаходиться в частині питання If I have no swap, I get an 'out of memory' error- а це false- правда, що коли у вас не буде місця на обміні, вбивця, що не входить у пам'ять, буде вбиватися і вбивати випадковий процес звільнення місця - тому кількість необхідного місця для заміни залежить від того, як написано ваше додаток.
Сорен

@Soren Ймовірно, що більша частина оперативної пам’яті буде заповнена фактичними даними, тому вбивця поза пам’яті не матиме великої різниці. Thx для "правди" все одно.
wrwt

3

Є більше міркувань. Якщо вам потрібно / хочете призупинити роботу, тоді вам потрібно хоча б розмір оперативної пам’яті, а потім і деякий. Однак це здається вам малоймовірним, враховуючи, що ви, здається, будуєте в основному обчислювальну робочу коня.

У цьому випадку, будь ласка, подумайте про використання файлу swap замість розділу. Вам не потрібно турбуватися про розмір розмірів, позбавлення від нього або додавання його пізніше не потребує перерозподілу. Немає (помітного) виконання покарання за використання файлу над розділом. Якщо вам це коли-небудь знадобиться, подивіться на розмір, і це також дасть вам хороші підказки.


1
@Kaz Я думаю, ти говориш про щось інше, ніж це kaste. Касте говорить, що якщо ви хочете призупинити / перезимувати ваш комп’ютер, вимкнути його та забрати там, де ви пізніше зупинилися, вам потрібно достатньо місця для обміну, щоб зберігати всю вашу оперативну пам’ять (інакше куди вона піде?).
amalloy

@amalloy Якщо ви зберігали оперативну пам’ять у вашому просторі, куди йде своп (пам'ятаючи, що цей swap трактується як пам'ять - якщо він втратив, це те саме, що втратити таран).
NPSF3000

2

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

Сучасні операційні системи забезпечують віртуальну пам’ять у вигляді комбінації фізичної пам'яті та місця обміну, тому, якщо вам потрібно більше пам’яті, ніж наявна машина, потрібно додати достатньо місця для заміни, щоб заповнити прогалину. Тобто, якщо вам потрібно максимум 80 ГБ, а машина має 64 ГБ, вам потрібно 16 Гб.

Зазвичай інсталятори операційної системи просять зробити початкову область заміни (оскільки це найпростіше і дозволяють встановлювати навіть крихітні комп’ютери), і було встановлено, що для типових операцій Unix гарним правилом є наявність віртуальної пам'яті розміром втричі більше фізичної пам'яті, тому зазвичай це пропонується. Однак ви знаєте більше про схему використання, щоб ви могли змінити це за необхідності.

Немає нічого поганого в роботі без простору, якщо тиск у вашій пам'яті завжди менше. Linux буде прозоро використовувати будь-яку невикористану пам'ять як кеш диска.


2

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

Як випадковий приклад, який тут же стосується мене цього літа ... При реалізації квадратичного сита потрібен великий (мабуть) суміжний масив для позначення (з деяким складним алгоритмом, деталі якого для цього прикладу фактично не мають значення). Масив повинен бути ~ 100 гіга-записів, так що легко в діапазоні 1 ТБ. Я міг би зробити вигляд, що виділяє це, і дозволити ОС зробити дивовижну кількість неефективного обміну, щоб отримати сторінки в оперативній пам'яті і вийти з неї для підтримки всіх послідовних записів через масив. Замість того, щоб робити щось з великим головою, я домоглася виділити набагато менший масив, який точно вписується в пам’ять, а потім повторно використовувати цей маленький масив, щоб ітеративно покрити решту великого масиву фрагментами. Я також зняв ОС, позбавив працюючого набору служб, замінив оболонку,

SSD може бути швидким, але це не так швидко, як організувати обчислення для того ж набору операцій, не затримуючись ніколи заміняти.


1

Як згадували інші, swap-розділ є хорошою ідеєю, навіть якщо у вас є багато оперативної пам’яті. Недоцільно ставити його на SSD; часті записи про заміну розділів з часом зносять ваш диск.

Якщо у вас є запасний порт USB 3.0, я б запропонував використовувати флешку для вашого місця обміну. Існує безліч швидкісних флеш-накопичувачів, які настільки ж швидкі, як і ваш SSD, але набагато дешевші - досить дешеві, щоб замінити, якщо він почне виходити з ладу. Швидкий пошук на Amazon показує, що є багато пристойних флеш-накопичувачів USB 3.0 на 16 Гб за ціною менше 20 доларів і навіть близько 64 ГБ накопичувачів менше ніж за 60 доларів.

Розділіть всю флешку як простір для обміну, і ви матимете місце для заміни, якщо вам це потрібно, і спокій, знаючи, що пам'ять, яка багато разів записується, легко змінюється (і дешево).


3
+1 для не заміни на SSD, -1 для заміни на компонент, який має дуже короткий термін служби при такому використанні.
Aviator45003

1
@TC вірно, ArmanX - якщо ви намагаєтеся уникати використання спалаху (SSD), чому б ви використовували спалах на USB? Це нераціонально.
warren

2
@TC: Не використовувати SSD для заміни через зношення носія - це невиправдана міська легенда. Обмін не відбувається "весь час", але рідко. Крім того, це те, що було детально досліджено в Microsoft після випуску Win7, в результаті чого типові схеми доступу для заміни є цілком прийнятними для SSD (це Windows, а не Ubuntu, але ймовірно, що Linux не працює набагато гірше). У вас сто (або тисяча) разів більше операцій запису, зношуючи ваш SSD через дурні файли журналів, які ніхто ніколи не читає (зазвичай синхронізує кожен рядок).
Деймон

Логіка є хибною: якщо thumbdrive дійсно такий же швидкий, як SSD, чому він дешевший?
Agent_L

Це баланс. З одного боку, хороша ідея мати файл свопу. З іншого боку, якщо файл swap зносить SSD (що, правда, це, мабуть, не має значення), було б краще скористатися дешевою заміною - і флешка за 20 доларів набагато краще, ніж SSD на суму понад 100 доларів.
ArmanX

1

Вам буде добре навіть із 1GiB (і, швидше за все,) свопом. Мій робочий комп'ютер зазвичай використовує не більше 140-150 МіБ. Гігабайт - це надмірне резервування для цього.
Якщо ви не зробите обчислювальні завдання, для яких потрібні набори даних у сотнях гігабайт і (цей важливий!) Доступ до даних здійснюється більш-менш одноразово, ви ніколи не захочете мати своп значно більший за нього. Але знову ж таки, просто відображення файлу пам'яті файлу даних працює однаково добре для цього додатка.

Але більше своп допомагає більше, правда? Більше всього завжди краще!

Поміркуйте, яка різниця зробить своп, скажімо, 16GiB (або подумайте про 64GiB). Якщо ви ніколи не використовуєте ці 16GiB, ви також не можете їх відкладати в першу чергу. Але якщо ви все-таки користуєтесь ними, що відбувається? Диск порівняно з основною пам'яттю надзвичайно повільний. Навіть із SSD SATA-600, передача 16GiB займає від 30 до 40 секунд, а в деяких інших конфігураціях - у 2-4 рази.
Тепер хтось неминуче заперечує проти того, що ви швидше залучаєте до сторінки десяток сторінок 4кіБ, а не 16GiB за один раз. Хоча це правда, справа все ж стоїть. Якщо вам потрібно поміняти та вимкнути лише пару сторінок, вам не потрібно 16GiB свопів, але якщо вам потрібні 16GiB свопів, ви також збираєтесь їх передати (так чи інакше).

Теоретично 99,9% всіх користувачів навіть могли користуватися машиною 64GiB (або будь-якою машиною 8 + GiB) без будь-якого свопу, і, швидше за все, ніколи не помічають, щоб щось не було. Однак це недоцільно.
По-перше, він є неоптимальним, оскільки в операційній системі є менше варіантів того, що вона може відкинути, коли у неї не вистачає фізичної пам'яті. Тут можна зробити дві речі: поміняти місцями те, що не використовується, або викинути сторінки з буфера кеша. Якщо у вас немає своп, це може зробити тільки одне. Викидання сторінок із кеш-пам'яті буфера нешкідливо, але це може помітно вплинути на продуктивність.
По-друге, приватні анонімні відображення можуть просто вийти з ладу, якщо не відбудеться своп. Це зазвичай не відбудеться, але з часом, коли не вистачає фізичної пам’яті, щоб задовольнити їх усіх, і немає підкачки, в операційній системі є лише такий вибір, за винятком ...
По-третє, жахливий вбивця МОМ може вдарити Що означає більш-менш випадковий процес вбивати. Ні, дякую. Це не те, що ти хочеш, щоб це відбувалося.

З урахуванням сказаного, такі поради, як вам потрібно поміняти X разів більше встановленої оперативної пам’яті, походять від людей, які повторюють щось, що вони чули (і не розуміли!) Від того, хто повторював щось почуте (і не розумів!) Десятиліття тому.
Правило "використовувати 2X свою оперативну пам'ять" було легко запам’ятати великим правилом у 1980-х та 1990-х, воно ніколи не було «золотою правдою» (просто щось, що спрацьовувало нормально для більшості користувачів), і воно не застосовується нині. .

У вас повинен бути розумний обмін, який ви легко можете собі дозволити (скажімо, гігабайт), так що ОС може викласти деякі несвіжі речі, і тому світ не одразу закінчується, коли ви просите трохи більше пам’яті. Але це все.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.