Как увеличить виртуальную память Ubuntu и / или поменять местами для Matlab?


16

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

Нет, своп и виртуальная память совершенно разные. Например, при отображении памяти в файле объемом 1 ГБ используется 1 ГБ виртуальной памяти, но при этом не происходит никаких изменений в использовании подкачки. Своп - это форма бэк-магазина. Многие виды использования виртуальной памяти не имеют ничего общего с резервным хранилищем. (И были системы с виртуальной памятью и без подкачки, а также системы с подкачкой, но без виртуальной памяти.)

Потребительское оборудование ограничено, поэтому мне нужно использовать больше виртуальной памяти и / или менять местами внешние жесткие диски. Matlab говорит о подкачке памяти (за исключением TODO виртуальной памяти?)

Linux Systems - Изменение пространства подкачки, используя mkswapи swaponкоманды.

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

  • Вы можете увидеть, сколько у вас есть по swapon -s

    Filename                Type        Size    Used    Priority
    /dev/sda3               partition   8326140 0       -1
    
  • Конфигурации Matlab

    % /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.

Временный обмен, запуск клиента и закрытие / удаление обмена в скрипте Майкла

Ситуация : невозможно контролировать ошибки при настройке среды (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 ТБ с небольшим использованием 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 в памяти подкачки (тикет # 02075943), с ошибкой При чтении истории команд возникла проблема - - . Просто перезапустите ваш Matlab, и проблема будет решена, если у вас есть настройки по умолчанию. Команда prefdirдает /home/masi/.matlab/R2016aрасположение по умолчанию ( /home/{username}/.matlab/R2016a. Файл /home/masi/.matlab/R2016a/matlab.prfсуществует после перезагрузки, здесь .

    • ... [другие ошибки] ...

  3. Закрытие Matlab и повторный ввод пароля в Терминале

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

Открыть: Как применить здесь лучшую обработку ошибок для перехвата ошибок? Смотрите мой скрипт для примера в источнике. Тема Как сделать ошибок захвата и Swapoff если ошибки / предупреждения?

Постоянный своп = отдельная настройка свопинга от запущенного клиента

Настройка свопа

# /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 ядра опции: з.д.
Matlab: 2016a
Официальный Matlab документы: Resolve "из памяти" Ошибки
Внешний HDD: Transcend 1 TB StoreJet 25м3 обзор , Transcend 2 StoreJet TB 25м3
Внешние HDD Файловая система: ext4
Внешний буфер жесткого диска: 8 МБ
Связанные темы: Как увеличить ограничение памяти MATLAB в Ubuntu? (как использовать mkswap, swapon для MATLAB?) , Как уменьшить увеличение физической памяти в Matlab? , Как решить из ошибки памяти в Matlab? , Как исправить Из ошибки памяти в Matlab для 10800x10800 матрицы? ,Как увеличить предел памяти (как смежный, так и общий) в Matlab r2012b? , Как увеличить массив блок и устранить Из Ошибки памяти в Matlab 2009b? , Как решить это из выпуска памяти для малого переменной в Matlab? , «Из памяти» в Matlab. Медленное, но постоянное решение?


4
Извините, это не отвечает на вопрос. Но ты уверен, что хочешь этого? Выполнение вычислений из свопа занимает невероятно много времени.
Оперативная память

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

1
Еще один бесполезный комментарий извините. Не могли бы вы оставить компьютер дома, чтобы вы могли работать по SSH и запускать их дома / в универе?
Anake

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

Что особенного в MATLAB в этом контексте? Разве это не просто дубликат Как увеличить пространство подкачки?
SteelDriver

Ответы:


2

Ладно, у вас есть список. Позвольте мне ответить в строке

  1. Как применить лучшую обработку ошибок для перехвата ошибок здесь? Смотрите мой скрипт для примера в источнике. Как сделать перехват ошибок и обмен, если ошибка / предупреждение?

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

  1. Как поставить предупреждения, если размер матрицы превышает размер свопа?

Просто делай математику. Если вы знаете размер матрицы до запуска программы, то рассчитайте размер в MiB и сравните его с доступным свопом.

  1. Как добиться прогресса в вычислении вашей огромной матрицы в Matlab?

Matlab имеет право API? Я не думаю, что это правильный форум для этого вопроса. Даже если у вас был API, вы будете блокировать ввод-вывод с помощью свопинга, так что это будет просто полоса прогресса, которая на самом деле не отражает реальность.

  1. Как убить занятый прогресс и / или обменять -s / swapoff в итерации (2)?

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

echo 3 > /proc/sys/vm/drop_caches 

Возможно, в этом есть нечто большее, я не эксперт по виртуальной машине Linux. Было бы целесообразно изучить, как работает распределитель SLAB / SLUB и как настроить его для ваших больших требований к памяти. Вы можете быть в состоянии MLOCK Matlab в память. Это заставляет ОС резервировать память для вас, или она просто не запускается, вы также должны разблокировать ее, когда закончите. Я могу сделать это с C API просто отлично, но я не уверен, как бы вы сделали это вне процесса, который я не могу перекомпилировать, который потребовал бы некоторых исследований.

Наконец, для такого рода вещей был создан EC2. Похоже, что 16G - это то, что вам нужно, у m4.4xlarge есть 64G ram при $ 0,958 в час. Это меньше, чем чашка кофе. Сценарий вашей установки Matlab, используя очарование Juju или аналогичный и превратить все это в вычисление в качестве службы.

16Г 16ГБ?

  • Да, обычно, когда мы опускаем суффикс, мы имеем в виду числа base2 в байтах. Если вы хотите быть кратким, вы должны написать 16 ГБ.

«Мне нужны матрицы размером> 100 ГБ. Я не знаю, сможете ли вы сделать это с помощью EC2».

Вы должны очистить свои кэши также echo 3 > /proc/sys/vm/drop_caches?

  • Да, не больно всегда так делать. Смотрите Documentation / sysctl / vm.txt в ядре Linux.

Как вы можете MLOCK Matlab в память?

  • man mlock, Хотя я обманываю, когда цитирую это. Этот вызов гарантирует, что вы можете выделить всю нужную вам память и избежать ее замены, она никогда не будет использовать виртуальную память. Это не то, что вы хотите.

Я думаю, что вы можете связать C API с Matlab. - Есть ли у вас идеи отключить своп в случае сбоя в процессах?

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

Когда я спрашиваю у ОС адресное пространство памяти, иногда это не всегда удается, но это не значит, что я не могу повторить попытку. То, что Matlab не может понять, чтобы дважды вызывать malloc, является проблемой Matlab.

Таким образом, чтобы повлиять на изменение, которое вы хотите, если эти 100 ГБ пространства действительно стоят премиум-класса, вам необходимо выяснить, как заставить операционную систему урезать объем памяти (путем очистки кэшей для начинающих), чтобы диспетчер памяти не почувствуйте необходимость использовать дополнительное пространство подкачки, которое было предоставлено. Тогда и только тогда вы можете попросить менеджер памяти освободить файл подкачки.

Легко вырастить такие вещи, как память и диски, гораздо сложнее их сжать. Сокращение вызывает перебалансировку каждого пользователя, у которого есть ресурсы, выделенные в этом пространстве. Если я вместо этого сказал: «У меня есть массив хранения объемом 100 ТБ, но теперь мне нужно только 60 ТБ, почему при удалении 40 ТБ диска массив перестает работать?» Ну, ответ будет очевидным, верно?

Так что вот ваши варианты, как я это вижу.

  1. Изучите matlab C API, чтобы узнать, сможете ли вы лучше контролировать распределение памяти для этих массивных рабочих наборов.

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

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


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

1
хех, остальная часть вашего комментария не появилась на моем смартфоне. Вы не можете sudo эхо, а не делать. echo 3 | sudo tee /proc/sys/vm/drop_caches
ппетраки

Я принимаю этот ответ, потому что в нем есть правильный смысл. Запуск Клиента в том же сценарии, что и при настройке среды, безумно подвержен ошибкам. Подробнее об этом здесь unix.stackexchange.com/a/298543/16920 - Было бы здорово, если бы вы могли немного очистить свое тело.
Лео Леопольд Герц 준영

12

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

Вот пример сценария, который создает файл подкачки размером 10 МБ в каталоге / tmp, монтирует его, запускает R (у меня нет matlab), ждет выхода R, размонтирует файл подкачки и удаляет его.

Обратите внимание: - у вас будет предупреждение, поскольку файл подкачки не принадлежит 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 нуждается в праве суперпользователя (так: sudo)
Michael Hooreman

1
Да у тебя есть. Вот как стать root.
Майкл Хореман

Хороший ответ. Я лично подхожу к этому и держу свой собственный скрипт add-swap.sh для этих прекрасных моментов, когда память съедается
Сергей Колодяжный

Я наградил награду здесь, потому что она сделала меня правильным. Однако я не могу принять ответ, потому что управление ошибками очень сложно и неполно. Лучше всего установить своп отдельно от запуска Matlab, пожалуйста, посмотрите ответ здесь unix.stackexchange.com/a/298543/16920
Лео Леопольд Херц t

1

Вот как вы можете расширить свою память SWAP, используя внешний жесткий диск :

  • Во-первых, запишите фактическую память SWAP, выполнив:

    free -m
    
  • Во-вторых, имейте под рукой папку вашего жесткого диска. Это должно быть что-то вроде /media/myhdd.

  • Определите размер дополнительного SWAP, который вы хотите добавить. Допустим, Х ГБ.
  • Рассчитать количество байтов, что количество. Используя ГБ, это: Y = X * 1024 ^ 3 , где Y - результат вашего расчета.
  • Выберите размер блока файла (в байтах). Давайте используем значение по умолчанию здесь: 4096 (Подробнее об этом здесь ).
  • Вычислите количество блоков в файле: Z = Y / 4096
  • Создайте файл размером X ГБ, используя следующую команду в терминале:

    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
    

Теперь ваш своп увеличился. Проверьте снова с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-накопителе. Это будет медленно , как ад ИМХО
Michael Hooreman

Сценарий в качестве резюме будет здорово здесь.
Лео Леопольд Герц 16

1
Я никогда не создавал сценарий, но попробую.

1

Я бы хотя бы проверил, насколько хорошо работает сжатая RAM (модуль ядра zram, доступный начиная с версии ядра 3.14).

Следуя инструкциям archlinux wiki

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 на размер памяти и скорость подкачки. Я не могу найти никакого влияния на объем памяти, вероятно, в основном на пейджинг. Тем не менее, предупреждение systemd / ... увеличилось с runit. Было бы здорово узнать о частоте ошибок Zram.
Лео Леопольд Герц 준영

В случае zram0 есть некоторая статистика, доступная в / sys / block / zram0 в файлах orig_data_size и compr_data_size . У меня там не так много данных, но соотношение составляет около 0,35. При таком соотношении 11 ГБ данных могут уместиться в 4 ГБ ОЗУ. Это может означать, что 7 ГБ данных не были перенесены на диск.
Джей Джей Хакала

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

Я обнаружил, что zramэто не применимо для подкачки на HDD / SSD, поэтому zramне применимо здесь, пожалуйста, смотрите ветку askubuntu.com/a/472227/25388
Léo Léopold Hertz 준영

1

Используйте, zswapесли у вас есть разделы подкачки на HDD / SSD. Модуль Tho zramне имеет разделов подкачки на жестком диске / жестком диске, поэтому ответ Хакалы не применим. См. Ветку zram vs zswap vs zcache Ultimate: когда использовать какую для объяснений. Настройка, 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.