Як збільшити віртуальну пам'ять Ubuntu та / або поміняти на Matlab?


16

Ситуація: виправити Out of Memoryпомилки в
цілі Matlab Ubuntu : виділити деяку віртуальну пам’ять та / або поміняти на зовнішньому HDD / SSD; зменшення читання / запису зменшилось з 20 Гбіт до 0,1 Гбіт, що нормально!
Термінологія: підкачки і віртуальна пам'ять тут

Ні, своп і віртуальна пам'ять абсолютно різні. Наприклад, для відображення пам’яті на 1 ГБ файл використовується додатковий 1 ГБ віртуальної пам’яті, але не має змін у використанні свопу. Swap - це форма підкладки магазину. Багато видів віртуальної пам'яті не мають нічого спільного з резервним магазином. (І були системи з віртуальною пам'яттю і без свопу, а також системи з свопом, але без віртуальної пам'яті.)

Споживаче обладнання є обмеженим, тому мені потрібно використовувати більше віртуальної пам'яті та / або обмінюватися своїми зовнішніми жорсткими дисками. Matlab каже про пам’ять своп (TODO виключаючи віртуальну пам'ять?)

Системи Linux - Змініть свій обмінний простір за допомогою команд mkswapі swapon.

Характеристика системи

  • Ви можете бачити, скільки у вас є swapon -s

    Filename                Type        Size    Used    Priority
    /dev/sda3               partition   8326140 0       -1
    
  • Конфігурації Матлаба

    % /programming//a/35971040/54964
    com.mathworks.services.Prefs.setIntegerPref('JavaMemHeapMax', 2048); % MB
    
    % TODO cannot find ways how to put Matlab use /dev/sda3
    
  • Отже, ви бачите, що мій Matlab не використовує його. Я отримую Out of Memoryпомилки з великими матрицями в Matlab. Я не мав успіху в reshapeнаписанні матриць на вектори і написанні паралельного коду. Тому я хочу використовувати віртуальну пам’ять, тому що мені потрібно виконати роботу; ставка не має значення.

Псевдокод

  1. Сценарій оболонки, який створює своп, запустіть MATLAB та видаліть своп, коли MATLAB закінчується. ( MichaelHooreman )
  2. Увімкнути заміну на зовнішньому жорсткому диску. Як sudo swapon -aтут користуватися?
  3. Почніть Matlab.
  4. Покладіть Matlab використовувати своп.
  5. Видаліть своп, коли Matlab закінчується.

Тимчасовий обмін, запуск клієнта та закриття / видалення заміни за сценарієм Micheal

Ситуація : не вдається контролювати помилки в налаштуванні середовища (1), запуску Matlab (2) та закритті середовища (3)
Script

#!/usr/bin/env bash

# /programming//a/69808/54964
set -e 
# TODO How to do swapoff if any error?

SWAP_FILE="/media/masi/SamiSwapVirtual/.swap_file_20.7.2016"
SIZE_MB=16000
TO_RUN="matlab"

dd if="/dev/zero" of=${SWAP_FILE} bs="1M" count=${SIZE_MB} status="progress"
mkswap ${SWAP_FILE}
chmod 0600 ${SWAP_FILE}
sudo chown 0.0 ${SWAP_FILE} # /unix//a/297153/16920
sudo swapon -v ${SWAP_FILE}
echo "Swap enabled. Press enter to continue"; read
${TO_RUN}
echo "I will remove the swap. Press enter to continue"; read
sudo swapoff -v ${SWAP_FILE}
rm -vf ${SWAP_FILE}

Ітерація 1 з Transcend 25M3 1 TB з невеликим використанням berofe, де файлова система ext4

  1. Журнали після запуску сценарію

    sh start_matlab_with_swap.sh 
    16000+0 records in
    16000+0 records out
    16777216000 bytes (17 GB, 16 GiB) copied, 134.489 s, 125 MB/s
    Setting up swapspace version 1, size = 15.6 GiB (16777211904 bytes)
    no label, UUID=48c2835b-4499-4534-aa49-0648e15bd5d9
    [sudo] password for masi: 
    swapon /media/masi/SamiWeek/tmp/swap_file_18.7.2016
    swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: insecure file owner 1000, 0 (root) suggested.
    swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: found swap signature: version 1d, page-size 4, same byte order
    swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: pagesize=4096, swapsize=16777216000, devsize=16777216000
    Swap enabled. Press enter to continue
    start_matlab_with_swap.sh: 11: read: arg count
    
  2. Запуск клієнта

    • Історія команд пішла в перший старт Matlab в пам’яті swap (квиток № 02075943), з помилкою Виникла проблема з читанням історії вашої команди - - . Просто перезапустіть Matlab і проблема буде вирішена, якщо у вас є налаштування за замовчуванням. Команда prefdirдає /home/masi/.matlab/R2016aмісце розташування за замовчуванням ( /home/{username}/.matlab/R2016a. Файл /home/masi/.matlab/R2016a/matlab.prfіснує після перезавантаження, тут .

    • ... [інші помилки] ...

  3. Закрити Matlab та знову ввести пароль у Terminal

    [sudo] password for masi: 
    swapoff /media/masi/SamiWeek/tmp/swap_file_18.7.2016
    [ bugs here! ]
    

Відкрито: Як тут застосувати кращу помилку з помилками, пов’язаними з помилками? Дивіться приклад у джерелі для мого сценарію. Тема, як зробити помилку та заміни, якщо помилка / попередження?

Постійна заміна = Окремі налаштування заміни від запущеного клієнта

Налаштування Swap

# /unix//q/297767/16920
masi@masi:~$ sudo fallocate -l 20G /mnt/.swapfile

masi@masi:~$ sudo mkswap /mnt/.swapfile 
Setting up swapspace version 1, size = 20 GiB (21474832384 bytes)
no label, UUID=45df9e48-1760-47e8-84d7-7a14f56bbd72

masi@masi:~$ sudo swapon /mnt/.swapfile
swapon: /mnt/.swapfile: insecure permissions 0644, 0600 suggested.

masi@masi:~$ sudo chmod 600 /mnt/.swapfile

masi@masi:~$ free -m
              total        used        free      shared  buff/cache   available
Mem:           7925        1494         175         196        6255        5892
Swap:         28610           0       28610

Поставте наступне в кінці /etc/fstabдля постійної зміни

# /unix//a/298212/16920
# /unix//a/298543/16920

# If swap is on SSD, trim blocks each time at startup.
#/mnt/.swapfile  none    swap    defaults,discard      0        0

# If swap on External HDD, just use sw.
/media/masi/SamiWeek/.swapfile  none    swap    sw      0        0

Система: Linux Ubuntu 16.04 64-бітне
ядро Linux: 4.6
Параметри ядра Linux: wl
Matlab: 2016a
Офіційні документи Matlab: Вирішіть «Поміть » Помилки
Зовнішній жорсткий диск: Transcend 1 TB StoreJet 25M3 огляд , Transcend 2 TB StoreJet 25M3
Зовнішня файлова система жорсткого диска: ext4
Зовнішній буфер жорсткого диска: 8 Мб
Пов'язані теми: Як збільшити обмеження пам'яті MATLAB в ubuntu? (як використовувати mmwp, swapon для MATLAB?) , Як зменшити збільшення фізичної пам'яті в Matlab? , Як вирішити помилку пам'яті в Matlab? , Як виправити помилку пам'яті в Matlab для матриці 10800x10800? ,Як я можу збільшити ліміт пам’яті (як суміжний, так і загальний) у Matlab r2012b? , Як збільшити блок масиву та усунути помилку пам'яті в Matlab 2009b? , Як вирішити цю проблему з пам'яті для малої змінної в Matlab? , 'Без пам'яті' в Matlab. Повільне, але постійне рішення?


4
Вибачте, це не відповідає на питання. Але ти впевнений, що цього хочеш? Проведення обчислень за допомогою свопу займає неймовірно багато часу. Рам читає щонайменше 20 ГБ в секунду, ваш зовнішній жорсткий диск буде читати менше 0,1 Гбіт / с
Anake

1
@Anake Так, я знаю. Це не проблема. У мене величезні матриці, які можна обчислити з 32/64 ГБ, але не з моїм нинішнім ультрабуком 8 Гб. Мені ще потрібно робити обчислення у свята.
Лео Леопольд Герц 준영

1
Ще один не корисний коментар Вибачте. Чи можете ви залишити комп’ютер вдома, щоб ви могли SSH запустити і запустити їх вдома / uni?
Anake

@Anake Наразі неможливо, вибачте Також Matlab тут потребує локальних обчислень. Крім того, не вистачає клавіш, щоб це зробити на даний момент.
Лео Леопольд Герц 준영

Що особливого у MATLAB у цьому контексті? Це не просто дублікат способу збільшення простору своп?
steeldriver

Відповіді:


2

Гаразд, цілий список у вас є. Дозвольте мені відповісти inline

  1. Як тут застосувати кращу помилку щодо помилок, пов’язаних із затримкою помилок? Дивіться приклад у джерелі для мого сценарію. Тема, як робити помилки та заміни, якщо помилка / попередження ?.

Концепція цього сценарію мені зовсім не подобається. Те, що у вас є зовнішній жорсткий диск, який ви намагаєтеся використовувати як своп, - лише погана ідея. Якщо ви дійсно збираєтесь робити це регулярно, то змініть розміри розділів, щоб помістити належний розділ для заміни, додайте файл swap або просто придбайте більший внутрішній диск.

  1. Як ставити попередження, якщо розмір матриці перевищує розмір свопу?

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

  1. Як мати смугу прогресу в обчисленні вашої величезної матриці в Matlab?

matlab має API? Я не думаю, що це правильний форум для цього питання. Навіть якщо у вас був API, ви будете блокувати IO за допомогою swap, тому це буде просто ривчаста смуга прогресу, яка насправді не відображає реальність.

  1. Як вбити зайнятий прогрес та / або замінити -s / swapoff в ітерації (2)?

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

echo 3 > /proc/sys/vm/drop_caches 

Напевно, тут є більше, ніж я, я не експерт з VM Linux. Варто було б дослідити, як працює розподільник SLAB / SLUB, і як налаштувати його на великі потреби в пам'яті. Можливо, ви зможете МЛОКУВАТИ матлаб в пам'ять. Це змушує ОС резервувати пам'ять для вас, або вона просто не запускається, вам також доведеться розблокувати її, коли закінчите. Я можу це зробити з API C відмінно, але я не впевнений, як ви це зробите поза процесом, який я не можу перекомпілювати, що вимагало б деяких досліджень.

Нарешті, саме для цього було виготовлено EC2. Схоже, що 16G - це те, що вам потрібно, m4.4xlarge має 64G оперативної пам'яті при $ 0,958 за годину. Це менше, ніж чашка кави. Сценарійте свій збір матлабу за допомогою шарму джуджу або подібного і перетворіть все на обчислення як послугу.

16G 16 Гб?

  • Так, зазвичай, коли ми залишаємо суфікс, ми маємо на увазі числа base2 в одиницях байтів. Якщо ви хочете зробити лаконічний, напишіть 16GiB.

"Мені потрібні матриці розміром> 100 Гб. Я не знаю, чи можна це зробити з EC2."

Чи слід також очищати кеші echo 3 > /proc/sys/vm/drop_caches?

  • Так, не шкода завжди робити це. Дивіться Документація / sysctl / vm.txt у ядрі Linux.

Як можна MLOCK Matlab в пам'ять?

  • man mlock. Хоча я і казав, коли це цитував. Цей дзвінок запевняє, що ви можете виділити всю потрібну пам'ять і не допускати її заміни, вона ніколи не буде використовувати віртуальну пам'ять. Це не те, чого ти хочеш.

Я думаю, ви можете прив’язати C API до Matlab. - - Чи маєте ви ідею вимкнути своп, якщо є якісь збої в процесах?

  • Я буду тут відвертим, концепція мікроменеджменту своп-файлів у запропонованому вами способі є смішною. Завдання операційної системи - керувати ресурсами та роздавати їх справедливим та послідовним чином. Як тільки ви дасте йому більше ресурсів, він використовуватиме їх так, як вважає за потрібне. Ви не можете сказати це, коли закінчите, і витягніть ресурси з-під нього, ОС підкаже, коли це буде зроблено.

Коли я запитую ОС для адресного простору пам'яті, іноді це не завжди вдається, це не означає, що я не можу спробувати ще раз. Що matlab не може зрозуміти, як зателефонувати у malloc двічі, це проблема matlab.

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

Вирощувати такі речі, як пам’ять і диски, легко, їх набагато важче скоротити. Зменшення примушує перебалансувати кожного користувача, який має ресурси, виділені в цьому просторі. Якщо я замість цього сказав: "У мене є масив пам'яті 100 Тб, але тепер мені потрібно лише 60 ТБ, чому саме тоді, коли я виймаю диск з 40 ТБ, масив перестає працювати?" Ну, відповідь була б очевидною правдою?

Тож ось ваші варіанти, як я бачу.

  1. досліджуйте API matlab C, щоб дізнатися, чи зможете ви краще контролювати, як розподіляється пам'ять для цих масивних робочих наборів.

  2. refactor ваш обчислення для обчислення того, що у вас зараз, використовуючи підматриці або інше розріджене подання даних.

  3. напишіть власну програму на C / C ++, використовуючи безліч лінійних бібліотек алгебри для виконання обчислень та використовуйте mallocабо mmapанонімно виділити потрібний адресний простір.


Так, але це може бути недостатньо, і вам, можливо, доведеться почекати і повторити спробу, перш ніж це вдасться, якщо це коли-небудь стане.
ppetraki

1
хе, решта ваших коментарів не з’явилася в моєму смартфоні. ти не можеш судо лунати так, натомість робити. echo 3 | sudo tee /proc/sys/vm/drop_caches
ppetraki

Я приймаю цю відповідь, оскільки вона має правильний сенс у своїй відповіді. Запуск клієнта в тому ж сценарії, що і налаштування середовища, шалено схильний до помилок. Більше дискусій про це тут unix.stackexchange.com/a/298543/16920 - - Було б чудово, якби ви могли трохи очистити своє тіло.
Лео Леопольд Герц 준영

12

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

Ось приклад скрипту, який створює swap 10Mb у каталозі / tmp, монтує його, запускає R (у мене немає matlab), чекає R виходить, змінює файл swap та видаляє його.

Зверніть увагу на те, що: - ви отримаєте попередження, оскільки файл swap не має root. Це тому, що система використовуватиме, якщо для будь-якого програмного забезпечення, можливо, не запускається вами, і ви можете прочитати цей файл ... Я дозволяю вам це виправити. - якщо ви [ctrl] - [c] скрипт, або вихід із системи, і т. д., своп залишатиметься встановленим. Я дозволяю вам це також виправити.

#!/usr/bin/env bash

SWAP_FILE=/tmp/my_swap_file
SIZE_MB=10
TO_RUN="R"

dd if=/dev/zero of=${SWAP_FILE} bs=1M count=${SIZE_MB}
mkswap ${SWAP_FILE}
chmod 0600 ${SWAP_FILE}
sudo swapon -v ${SWAP_FILE}
echo "Swap enabled. Press enter to continue"; read
${TO_RUN}
echo "I will remove the swap. Press enter to continue"; read
sudo swapoff -v ${SWAP_FILE}
rm -vf ${SWAP_FILE}

1
Ну, це не дуже присвячено MATLAB, але для будь-якої ситуації, що потребує тимчасово більше оперативної пам’яті. Зверніть увагу, що swapon / swapoff потребує кореневого права (так:
судо

1
Так, у вас є. Ось як стати корінням.
Майкл Хурмен

Гарна відповідь. Я особисто підходив би до цього, так і зберігав би свій власний сценарій add-swap.sh для цих чудових моментів, коли пам’ять з'їдається
Сергій Колодяжний

Я нагородив цю нагороду за те, що це змусило мене зробити правильний шлях. Однак я не можу прийняти відповідь, оскільки управління помилками дуже складне та неповне. Найкраще налаштувати своп окремо від запуску Matlab, будь ласка, дивіться відповідь тут unix.stackexchange.com/a/298543/16920
Léo Léopold Hertz 준영

1

Ось як можна розширити свою пам'ять SWAP за допомогою зовнішнього жорсткого диска :

  • Спочатку запишіть фактичну пам’ять SWAP, запустивши:

    free -m
    
  • По-друге, мати під рукою папку вашого жорсткого диска. Це повинно бути щось на кшталт /media/myhdd.

  • Визначте розмір додаткового SWAP, який ви хочете додати. Скажімо, X ГБ.
  • Обчисліть кількість байтів, яка є. Використовуючи ГБ, це: Y = X * 1024 ^ 3 , де Y - результат вашого розрахунку.
  • Виберіть розмір блоку файлу (він знаходиться в байтах). Давайте використаємо тут за замовчуванням: 4096 (Детальніше про це тут ).
  • Обчисліть кількість блоків, які матиме файл: Z = Y / 4096
  • Створіть файл розміром X GB за допомогою наступної команди в терміналі:

    dd if=/dev/zero of=/media/myhdd/swapfile bs=4096 count=Z
    
  • Створіть у файлі SWAP за допомогою:

    sudo mkswap /media/myhdd/swapfile -f
    
  • Нарешті, увімкніть SWAP:

    sudo swapon -p 1000 /media/myhdd/swapfile
    

Тепер ваш SWAP збільшився. Перевірте ще разfree -m


Ми можемо встановити це за допомогою неінтерактивного сценарію ( sudoнеобхідні повноваження):

#!/bin/bash

### Inputs ###

swap_GB=$(expr 1) # Enter here size of the swap memory to create, in GB.
swap_bs=$(expr 4096) # Enter here block size, in bytes (must be a multiple of 8).
HDD_folder="/media/myhdd/" # Enter absolute path of HDD inside the brackets.

### Swap creation ###

swap_size=$(expr $swap_GB \* 1024 \* 1024 \* 1024 / $swap_bs)
dd if=/dev/zero of=${HDD_folder}"/swapfile" bs=$swap_bs count=$swap_size
mkswap ${HDD_folder}"/swapfile" -f
swapon -p 1000 ${HDD_folder}"/swapfile"

### EOF ###

PS: будь-ласка, оптимізуйте / поправте, якщо можливо. Як говорилося, це мій перший сценарій коли-небудь :)


Що ж, заміна вже повільна, але я не можу уявити, щоб мати заміну на USB-накопичувачі. Це стане повільним, як пекло ІМХО
Майкл Хурмен

Сценарій як резюме було б чудово тут.
Лео Леопольд Герц 준영

1
Я ніколи не створював сценарій, але підкажу.

1

Я хоч би перевірив, наскільки добре стискана оперативна пам'ять (модуль ядра zram, доступний з моменту версії 3.14).

Дотримуючись вказівок wiki для archlinux

modprobe zram
echo lz4 > /sys/block/zram0/comp_algorithm
echo 4G > /sys/block/zram0/disksize
mkswap --label zram0 /dev/zram0
swapon --priority 100 /dev/zram0

Я здогадуюсь, що стисла ОЗУ повинна бути швидшою, ніж дисковий введення / вивід.

Щоб зміни збереглися і після перезавантаження, помістіть команди /etc/rc.localта запустіть час завантаження sudo systemctl enable rc-local.service.


Я поширив відповідь на потік unix.stackexchange.com/q/297752/16920 для впливу zram на розмір пам’яті та швидкість підкачки. Я не можу знайти жодного впливу на розмір пам’яті, мабуть, переважно, на підкачку. Однак системне / ... попередження зросло з runit. Було б чудово знати про рівень помилок zram.
Лео Леопольд Герц 준영

У випадку zram0 є деякі статистичні дані, доступні в / sys / block / zram0 у файлах orig_data_size та compr_data_size . У мене там мало обмінюються даними, але для того, що там, співвідношення становить приблизно 0,35. При такому співвідношенні 11 ГБ даних може вміститися до 4 ГБ оперативної пам’яті. Це може означати 7 Гб даних, не замінених на диск.
JJ Hakala

1
Ви можете розмістити команди часу завантаження в /etc/rc.local, а потімsudo systemctl enable rc-local.service
JJ Hakala

Я з’ясував, що zramне застосовується для swap на HDD / SSD, тому zramтут не застосовується, дивіться тему askubuntu.com/a/472227/25388
Léo Léopold Hertz 준영

1

Використовуйте, zswapякщо у вас є частини підкачки на HDD / SSD. Tho модуль zramне має підкачки на HDD / SSD, тому відповідь Хакала не застосовується. Дивіться нитку zram vs zswap vs zcache Кінцеве керівництво: коли використовувати який для пояснень. Налаштування, zswapяк описано в потоці Як успішно активувати Zswap для обчислення Matlab в Ubuntu 16.04?

  • Замініть відповідний рядок на наступний рядок у /etc/default/grub

    # https://wiki.archlinux.org/index.php/Zswap
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash zswap.enabled=1 zswap.max_pool_percent=25 zswap.compressor=lzo"
    
  • Біжи sudo update-grub.

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