Ситуация: зафиксировать Out of Memory
ошибки в Matlab Ubuntu
Цель: выделите некоторую виртуальную память и/или Подкачку на внешнем жестком диске/SSD; уменьшение чтения-записи от 20 Гбайт/с до 0,1 Гбайт/с, которое в порядке!
Терминология: подкачка и виртуальная память здесь
Нет, подкачка и виртуальная память полностью отличаются. Например, размещение в ОЗУ файл на 1 ГБ использует дополнительного 1 ГБ виртуальной памяти, но не имеет никакого изменения в использовании подкачки. Подкачка является формой запоминающего устройства. Много использования виртуальной памяти не имеют никакого отношения к запоминающему устройству. (И были системы с виртуальной памятью и никакой подкачкой, а также системы с подкачкой, но никакой виртуальной памятью.)
Потребительские аппаратные средства ограничены так, я должен использовать больше виртуальной памяти и/или подкачки с моими внешними жесткими дисками. Matlab заявляет о памяти подкачки (TODO, исключая виртуальную память?)
Системы Linux — Изменение Ваша область подкачки при помощи
mkswap
иswapon
команды.
Характеристики системы
Вы видите, каким количеством у Вас есть он swapon -s
Filename Type Size Used Priority
/dev/sda3 partition 8326140 0 -1
Конфигурации Matlab
% https://stackoverflow.com/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
'матрицы луга к векторам и пишущий параллельный код. Таким образом, я хочу использовать виртуальную память, потому что я должен получить сделанную работу; уровень не имеет значения.
Псевдокод
sudo swapon -a
здесь?Ситуация: не может управлять ошибками в установке среды (1), выполнение Matlab (2) и закрытие среды (3)
Сценарий
#!/usr/bin/env bash
# https://stackoverflow.com/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} # https://unix.stackexchange.com/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
Журналы после запуска сценария
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
Выполнение клиента
История команд, в которую входят первый запуск Matlab в памяти подкачки (билет № 02075943), с ошибкой, была проблемой, читая Вашу историю команд-. Просто перезапустите свой Matlab и и проблема решена, если у Вас есть настройки по умолчанию. Команда prefdir
дает /home/masi/.matlab/R2016a
который является местоположением по умолчанию (/home/{username}/.matlab/R2016a
. Файл /home/masi/.matlab/R2016a/matlab.prf
существует после перезапуска, здесь.
... [другие ошибки]...
Закрытие Matlab и ввод пароля снова в Терминале
[sudo] password for masi:
swapoff /media/masi/SamiWeek/tmp/swap_file_18.7.2016
[ bugs here! ]
Открытый: Как Применить Лучшую Обработку ошибок Обнаружения ошибок здесь? См. мой сценарий для примера в источнике. Поток, Как Сделать Обнаружение ошибок и Swapoff если Ошибка/Предупреждение?
Установка Подкачки
# https://unix.stackexchange.com/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
для постоянного изменения
# https://unix.stackexchange.com/a/298212/16920
# https://unix.stackexchange.com/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: Твердость "Из Памяти" Ошибки
Внешний жесткий диск: обзор StoreJet 25M3 Transcend 1 ТБ, StoreJet 25M3 Transcend 2 ТБ
Внешняя файловая система жесткого диска: ext4
Внешний буфер жесткого диска: 8 МБ
Связанные потоки: Как увеличить ограничение памяти MATLAB в человечности? (как использовать mkswap, swapon для MATLAB?), Как Уменьшить увеличение Физической памяти Matlab?, Как Решить из ошибки памяти в Matlab?, Как Зафиксировать Из Ошибки памяти в Matlab для 10800x10800 матрица?, Как я увеличиваю предел памяти (непрерывный, а также полный) в Matlab r2012b?, Как Увеличить Блок Массива и Твердость Из Ошибки памяти в Matlab 2009b?, Как Разрешить это Из Проблемы памяти для Маленькой Переменной в Matlab?, 'Из памяти' в Matlab. Медленное, но постоянное решение?
Хорошо, настоящий список Вы имеете там. Позвольте мне ответить встроенный
мне не нравится понятие этого сценария вообще. То, что у Вас есть внешний жесткий диск, который Вы пытаетесь использовать, поскольку подкачка является просто плохой идеей. Если Вы действительно намереваетесь сделать, это регулярно затем изменяет размер Ваших разделов, чтобы вставить надлежащий раздел подкачки, добавить файл подкачки или просто купить более крупный внутренний диск.
Просто делают математику. Если Вы знаете размер матрицы, прежде чем программа начнется, затем вычисляют размер в мебибайт и сравнивают его с доступной подкачкой.
matlab имеет право API? Я не думаю, что это - правильный форум для того вопроса. Даже если у Вас был API, Вы будете блокироваться на IO через подкачку, таким образом, это просто будет судорожный индикатор выполнения, который на самом деле не отражает действительность.
Вы не делаете. просто, потому что Вы сделаны с вычислением, не означает, что операционная система сделана с ресурсами, которые Вы выделили. Когда это будет делать записи для свопинга, это освободит. Вы использовали такую память, что много приложений не может получить память, в которой они нуждаются так, они используют подкачку также. Просто оставьте его на и позвольте операционной системе сделать, это - вещь. Перед выполнением следующего запуска, четкого кэши.
echo 3 > /proc/sys/vm/drop_caches
существует, вероятно, больше к нему, чем это, я не эксперт VM Linux. Стоило бы заняться расследованиями, как средство выделения SLAB/SLUB работает и как настроить его для Ваших требований памяти большой емкости. Вы можете к MLOCK matlab в память. Это вынуждает ОС зарезервировать память для Вас, или она просто не запускается, также необходимо разблокировать ее, когда Вы сделаны. Я могу сделать это с API C очень хорошо, но я не уверенный, как Вы сделали бы это за пределами процесса, который я не могу перекомпилировать, который потребовал бы некоторого исследования.
Наконец, это - вид материала, для которого был сделан EC2. Это похоже 16G, то, в чем Вы нуждаетесь, m4.4xlarge имеет 64G поршень 0,958$ в час. Это - меньше, чем кофе чашки. Напишите сценарий своей установки matlab использование очарования амулета или подобный и превратите все это в вычисление как услуга.
16G 16 ГБ?
"Мне нужны матрицы, которые являются> 100 ГБ. Я не знаю, можно ли сделать это с EC2".
необходимо ли очистить кэши также echo 3 > /proc/sys/vm/drop_caches
?
, Как может Вы MLOCK Matlab в память?
man mlock
. Хотя я попал впросак, когда я заключил это в кавычки. Этот вызов гарантирует, что можно выделить всю память, которую Вы хотите и удерживаете от того, чтобы быть выгруженным, это никогда не будет использовать виртуальную память. Это не то, что Вы хотите. я думаю, что можно связать API C с Matlab. - У Вас есть какая-либо идея выключить подкачку, если существует какой-либо отказ в процессах?
, Когда я прошу у ОС пространство адреса памяти, иногда она не всегда успешно выполняется, который не означает, что я не могу попробовать еще раз. Это, которое matlab не может выяснить для вызова malloc дважды, является проблемой matlab.
Так, для влияния на на изменение Вы хотите, если это 100G пространства действительно в большом почете затем необходимо выяснить, как сказать операционной системе обрезать, это - объем потребляемой памяти (путем очистки кэшей для начинающих), таким образом, диспетчер памяти не чувствует потребность использовать дополнительную область подкачки, которую это было обеспечено. Затем и только затем можете Вы просить, чтобы диспетчер памяти выпустил файл подкачки.
легко вырастить вещи как память и диски, намного более трудно уменьшить их. Уменьшающиеся силы изменение баланса каждого пользователя, которому выделили ресурсы в том пространстве. Если я вместо этого сказал, что "У меня есть массив хранения данных на 100 ТБ, но теперь мне только нужны 60 ТБ, почему это, когда я удаляю 40 ТБ диска, что массив прекращает работать?" Ну, Ответ был бы очевидным правом?
, Таким образом, вот Ваши опции, как я вижу его.
исследуют matlab C API, чтобы видеть, можно ли получить лучший контроль над тем, как память выделяется для этих значительных рабочих наборов.
осуществляют рефакторинг Ваше вычисление для вычислений то, что у Вас есть теперь подматрицы использования или некоторое другое редкое представление данных.
пишут Вашу собственную программу в C/C++ с помощью изобилия библиотек линейной алгебры там для выполнения вычисления и использования malloc
или mmap
анонимный для выделения адресного пространства, в котором Вы нуждаетесь.
Вы не можете выделить подкачку для программного обеспечения. То, что можно сделать, создают сценарий оболочки, который создает подкачку, запустите MATLAB и удалите подкачку, когда MATLAB выходит.
Вот сценарий в качестве примера, который создает подкачку 10 МБ в/tmp каталоге, монтирует его, запускает R (у меня нет matlab), ожидайте выходы R, umount файл подкачки и удалите его.
Обратите внимание на то, что: - у Вас будет предупреждение, потому что файл подкачки не принадлежит корню. Поэтому система будет использовать, если для какого-либо программного обеспечения, возможно, не работал Вами, и можно читать на этом файле... Я позволяю Вам зафиксировать его. - если Вы [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}
Это - то, как можно развернуть память ПОДКАЧКИ с помощью внешний жесткий диск :
Первый, запишите свою фактическую память ПОДКАЧКИ путем выполнения:
free -m
/media/myhdd
.
Создают файл размера X ГБ с помощью следующей команды в терминале:
dd if=/dev/zero of=/media/myhdd/swapfile bs=4096 count=Z
Создают ПОДКАЧКУ в использовании файла:
sudo mkswap /media/myhdd/swapfile -f
Наконец, включите ПОДКАЧКУ:
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 ###
пз: оптимизируйте/исправьте, если это возможно. Как сказано, это - мой первый сценарий когда-либо :)
Я, по крайней мере, протестировал бы, как хорошо сжатая 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
Мое предположение - то, что сжатая RAM должна быть быстрее, чем диск ввод-вывод.
Для оставления сдачу также после перезапуска поместите команды времени начальной загрузки в /etc/rc.local
и работайте sudo systemctl enable rc-local.service
.
Используйте zswap
, если у Вас есть части подкачки на жестком диске/SSD. Модуль Tho zram
без частей подкачки на жестком диске/SSD, таким образом, ответ Hakala не применим. Посмотрите поток zram по сравнению с zswap по сравнению с 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
.