Ситуация: исправьте 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
матрицы для векторов и написать параллельный код. Поэтому я хочу использовать виртуальную память, потому что мне нужно выполнить работу; скорость не имеет значения.
ПСЕВДОКОД
- Сценарий оболочки, который создает своп, запускает MATLAB и удаляет своп при выходе из MATLAB. ( MichaelHooreman )
- Включить обмен на внешнем жестком диске. Как использовать
sudo swapon -a
здесь? - Запустите Matlab.
- Положите Matlab использовать своп.
- Удалить своп, когда выходит 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
Логи после запуска скрипта
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 если ошибки / предупреждения?
Постоянный своп = отдельная настройка свопинга от запущенного клиента
Настройка свопа
# /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. Медленное, но постоянное решение?
Ответы:
Ладно, у вас есть список. Позвольте мне ответить в строке
Мне не нравится концепция этого сценария вообще. То, что у вас есть внешний жесткий диск, который вы пытаетесь использовать в качестве подкачки, это просто плохая идея. Если вы действительно собираетесь делать это на регулярной основе, измените размер своих разделов, чтобы разместить соответствующий раздел подкачки, добавить файл подкачки или просто купить больший внутренний диск.
Просто делай математику. Если вы знаете размер матрицы до запуска программы, то рассчитайте размер в MiB и сравните его с доступным свопом.
Matlab имеет право API? Я не думаю, что это правильный форум для этого вопроса. Даже если у вас был API, вы будете блокировать ввод-вывод с помощью свопинга, так что это будет просто полоса прогресса, которая на самом деле не отражает реальность.
Вы не только то, что вы закончили вычисления, не означает, что операционная система работает с выделенными вами ресурсами. Когда вы закончите выписывать, чтобы поменяться, это освободится. Вы использовали столько памяти, что многие приложения не могут получить необходимую им память, поэтому они также используют своп. Просто оставьте его включенным, и пусть операционная система сделает это. Перед выполнением следующего запуска очистите кеши.
Возможно, в этом есть нечто большее, я не эксперт по виртуальной машине Linux. Было бы целесообразно изучить, как работает распределитель SLAB / SLUB и как настроить его для ваших больших требований к памяти. Вы можете быть в состоянии MLOCK Matlab в память. Это заставляет ОС резервировать память для вас, или она просто не запускается, вы также должны разблокировать ее, когда закончите. Я могу сделать это с C API просто отлично, но я не уверен, как бы вы сделали это вне процесса, который я не могу перекомпилировать, который потребовал бы некоторых исследований.
Наконец, для такого рода вещей был создан EC2. Похоже, что 16G - это то, что вам нужно, у m4.4xlarge есть 64G ram при $ 0,958 в час. Это меньше, чем чашка кофе. Сценарий вашей установки Matlab, используя очарование Juju или аналогичный и превратить все это в вычисление в качестве службы.
16Г 16ГБ?
«Мне нужны матрицы размером> 100 ГБ. Я не знаю, сможете ли вы сделать это с помощью EC2».
Вы должны очистить свои кэши также
echo 3 > /proc/sys/vm/drop_caches
?Как вы можете MLOCK Matlab в память?
man mlock
, Хотя я обманываю, когда цитирую это. Этот вызов гарантирует, что вы можете выделить всю нужную вам память и избежать ее замены, она никогда не будет использовать виртуальную память. Это не то, что вы хотите.Я думаю, что вы можете связать C API с Matlab. - Есть ли у вас идеи отключить своп в случае сбоя в процессах?
Когда я спрашиваю у ОС адресное пространство памяти, иногда это не всегда удается, но это не значит, что я не могу повторить попытку. То, что Matlab не может понять, чтобы дважды вызывать malloc, является проблемой Matlab.
Таким образом, чтобы повлиять на изменение, которое вы хотите, если эти 100 ГБ пространства действительно стоят премиум-класса, вам необходимо выяснить, как заставить операционную систему урезать объем памяти (путем очистки кэшей для начинающих), чтобы диспетчер памяти не почувствуйте необходимость использовать дополнительное пространство подкачки, которое было предоставлено. Тогда и только тогда вы можете попросить менеджер памяти освободить файл подкачки.
Легко вырастить такие вещи, как память и диски, гораздо сложнее их сжать. Сокращение вызывает перебалансировку каждого пользователя, у которого есть ресурсы, выделенные в этом пространстве. Если я вместо этого сказал: «У меня есть массив хранения объемом 100 ТБ, но теперь мне нужно только 60 ТБ, почему при удалении 40 ТБ диска массив перестает работать?» Ну, ответ будет очевидным, верно?
Так что вот ваши варианты, как я это вижу.
Изучите matlab C API, чтобы узнать, сможете ли вы лучше контролировать распределение памяти для этих массивных рабочих наборов.
рефакторинг ваших вычислений для вычисления того, что у вас есть, с использованием подматриц или другого разреженного представления данных.
напишите свою собственную программу на C / C ++, используя множество библиотек линейной алгебры для выполнения вычислений и использования
malloc
илиmmap
анонимности для выделения нужного адресного пространства.источник
echo 3 | sudo tee /proc/sys/vm/drop_caches
Вы не можете выделить обмен для программного обеспечения. Что вы можете сделать, это создать сценарий оболочки, который создает файл подкачки, запускает MATLAB и удаляет файл подкачки при выходе из MATLAB.
Вот пример сценария, который создает файл подкачки размером 10 МБ в каталоге / tmp, монтирует его, запускает R (у меня нет matlab), ждет выхода R, размонтирует файл подкачки и удаляет его.
Обратите внимание: - у вас будет предупреждение, поскольку файл подкачки не принадлежит root. Это потому, что система будет использовать если для любого программного обеспечения, может быть, не запускается вами, и вы можете прочитать в этом файле ... Я позволю вам исправить это. - если вы [Ctrl] - [C] сценарий или выход из системы, и т. д., своп будет оставаться подключенным. Я также позволю тебе это исправить.
источник
Вот как вы можете расширить свою память SWAP, используя внешний жесткий диск :
Во-первых, запишите фактическую память SWAP, выполнив:
Во-вторых, имейте под рукой папку вашего жесткого диска. Это должно быть что-то вроде
/media/myhdd
.Создайте файл размером X ГБ, используя следующую команду в терминале:
Создайте SWAP в файле, используя:
Наконец, включите SWAP:
Теперь ваш своп увеличился. Проверьте снова с
free -m
Мы можем настроить это в неинтерактивном скрипте (
sudo
необходимые полномочия):PS: пожалуйста, оптимизируйте / исправьте, если это возможно. Как уже говорилось, это мой первый скрипт :)
источник
Я бы хотя бы проверил, насколько хорошо работает сжатая RAM (модуль ядра zram, доступный начиная с версии ядра 3.14).
Следуя инструкциям archlinux wiki
Я предполагаю, что сжатая оперативная память должна быть быстрее, чем дисковый ввод-вывод.
Чтобы сохранить изменения и после перезапуска, введите
/etc/rc.local
и запустите команды времени загрузкиsudo systemctl enable rc-local.service
.источник
sudo systemctl enable rc-local.service
zram
это не применимо для подкачки на HDD / SSD, поэтомуzram
не применимо здесь, пожалуйста, смотрите ветку askubuntu.com/a/472227/25388Используйте,
zswap
если у вас есть разделы подкачки на HDD / SSD. Модуль Thozram
не имеет разделов подкачки на жестком диске / жестком диске, поэтому ответ Хакалы не применим. См. Ветку zram vs zswap vs zcache Ultimate: когда использовать какую для объяснений. Настройка,zswap
как описано в теме Как успешно активировать Zswap для вычислений Matlab в Ubuntu 16.04?Замените соответствующую строку следующей строкой в
/etc/default/grub
Беги
sudo update-grub
.источник