Bagaimana cara Meningkatkan Memori Virtual Ubuntu dan / atau Swap untuk Matlab?

16

Situasi: memperbaiki Out of Memorykesalahan dalam
Tujuan Matlab Ubuntu : mengalokasikan beberapa memori virtual dan / atau Swap pada HDD / SSD eksternal; penurunan baca / tulis dari 20 GBps menjadi 0,1 GBps, yang ok!
Terminologi: swap dan memori virtual di sini

Tidak, swap dan memori virtual benar-benar berbeda. Misalnya, pemetaan memori file 1GB menggunakan memori virtual tambahan 1GB tetapi tidak ada perubahan dalam penggunaan swap. Swap adalah bentuk backing store. Banyak penggunaan memori virtual tidak ada hubungannya dengan backing store. (Dan telah ada sistem dengan memori virtual dan tanpa swap serta sistem dengan swap tetapi tidak ada memori virtual.)

Perangkat keras konsumen terbatas sehingga saya perlu menggunakan lebih banyak memori virtual dan / atau bertukar dengan HDD eksternal saya. Matlab mengatakan tentang memori swap (TODO tidak termasuk memori virtual?)

Sistem Linux - Ubah ruang swap Anda dengan menggunakan perintah mkswapdan swapon.

Karakteristik sistem

  • Anda dapat melihat seberapa banyak Anda memilikinya swapon -s

    Filename                Type        Size    Used    Priority
    /dev/sda3               partition   8326140 0       -1
    
  • Konfigurasi Matlab

    % /programming//a/35971040/54964
    com.mathworks.services.Prefs.setIntegerPref('JavaMemHeapMax', 2048); % MB
    
    % TODO cannot find ways how to put Matlab use /dev/sda3
    
  • Jadi, Anda lihat bahwa Matlab saya tidak menggunakannya. Saya menerima Out of Memorykesalahan dengan matriks besar di Matlab. Saya tidak berhasil dalam reshapematriks untuk vektor dan menulis kode paralel. Jadi saya ingin menggunakan memori virtual karena saya harus menyelesaikan pekerjaan; harga tidak masalah.

Kodesemu

  1. Skrip shell yang membuat swap, mulai MATLAB, dan hapus swap saat MATLAB keluar. ( MichaelHooreman )
  2. Aktifkan swap pada HDD eksternal. Bagaimana cara menggunakannya di sudo swapon -asini?
  3. Mulai Matlab.
  4. Masukan Matlab gunakan swap.
  5. Hapus swap saat Matlab keluar.

Swap Sementara, Menjalankan Klien dan Menutup / Menghapus Swap dalam skrip Micheal

Situasi : tidak dapat mengontrol kesalahan dalam mengatur lingkungan (1), menjalankan Matlab (2) dan menutup lingkungan (3)
Skrip

#!/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}

Iterasi 1 dengan Transcend 25M3 1 TB dengan sedikit penggunaan berofe di mana filesystem ext4

  1. Log setelah memulai skrip

    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. Menjalankan klien

    • Histori perintah hilang di permulaan pertama Matlab dalam memori swap (tiket # 02075943), dengan kesalahan Ada masalah saat membaca riwayat perintah Anda - - . Nyalakan ulang Matlab Anda dan masalah akan terpecahkan jika Anda memiliki pengaturan default. Perintah prefdirmemberi /home/masi/.matlab/R2016ayang merupakan lokasi default ( /home/{username}/.matlab/R2016a. File /home/masi/.matlab/R2016a/matlab.prfada setelah restart, di sini .

    • ... [kesalahan lain] ...

  3. Menutup Matlab dan mengetik kata sandi lagi di Terminal

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

Buka: Cara Mendaftar Penanganan Kesalahan yang Lebih Baik dari Penangkapan Kesalahan di sini? Lihat skrip saya untuk contoh di sumber. Thread Bagaimana Cara Menjebak Kesalahan dan Swapoff jika Kesalahan / Peringatan?

Swap Permanen = Pisahkan Swap Setup dari Running Client

Menyiapkan 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

Masukkan yang berikut di akhir /etc/fstabuntuk perubahan permanen

# /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

Sistem: Linux Ubuntu 16.04 64 bit
Kernel Linux: 4.6
Opsi kernel Linux: wl
Matlab: 2016a
Dokumen Matlab resmi: Menyelesaikan Kesalahan "Kehabisan Memori"
HDD Eksternal: Transcend 1 TB StoreJet 25M3 tinjauan , Transcend 2 TB StoreJet 25M3
Filesystem HDD eksternal: ext4
Buffer HDD eksternal: 8 MB
Utas terkait: Cara menambah batasan memori MATLAB di ubuntu? (bagaimana cara menggunakan mkswap, swapon untuk MATLAB?) , Bagaimana cara Mengurangi peningkatan memori fisik di Matlab? , Bagaimana Mengatasi kesalahan memori di Matlab? , Bagaimana Memperbaiki Kesalahan Memori di Matlab untuk matriks 10800x10800? ,Bagaimana cara meningkatkan batas memori (bersebelahan dan keseluruhan) di Matlab r2012b? , Cara Meningkatkan Array Block dan Mengatasi Kesalahan Memori di Matlab 2009b? , Bagaimana Mengatasi Masalah Kehabisan Memori ini untuk Variabel Kecil di Matlab? , 'Kehabisan memori' di Matlab. Solusi lambat tapi permanen?

Léo Léopold Hertz 준영
sumber
4
Maaf ini tidak menjawab pertanyaan. Tapi apakah Anda yakin ini? Melakukan perhitungan dari swap membutuhkan waktu yang sangat lama. Ram membaca setidaknya 20 GB per detik, HDD eksternal Anda akan membaca kurang dari 0,1 GBps
Anake
1
@ Membuat Ya, saya tahu. Itu bukan masalah. Saya memiliki matriks besar yang dapat dihitung dengan 32/64 GB tetapi tidak dengan ultrabook 8 GB saya saat ini. Saya masih perlu melakukan perhitungan pada hari libur.
Léo Léopold Hertz 준영
1
Komentar lain yang tidak berguna maaf. Bisakah Anda meninggalkan komputer di rumah sehingga Anda bisa SSH dan menjalankannya di rumah / uni?
Anake
@Anake Tidak mungkin, maaf, saat ini. Juga, Matlab di sini jadi perlu perhitungan lokal. Juga, tidak memiliki kunci yang cukup untuk melakukannya saat ini.
Léo Léopold Hertz 준영
Apa keistimewaan MATLAB dalam konteks ini? Bukankah ini hanya duplikat dari Cara menambah ruang swap?
steeldriver

Jawaban:

2

OK, cukup daftar yang Anda miliki di sana. Biarkan saya merespons sebaris

  1. Bagaimana Cara Menerapkan Kesalahan-Penanganan Kesalahan yang Lebih Baik di sini? Lihat skrip saya untuk contoh di sumber. Thread Bagaimana Melakukan Trap-trap dan Swapoff jika Kesalahan / Peringatan ?.

Saya tidak suka konsep skrip ini sama sekali. Bahwa Anda memiliki hard drive eksternal yang ingin Anda gunakan sebagai swap adalah ide yang buruk. Jika Anda benar-benar berniat melakukan ini secara teratur, maka ubah ukuran partisi Anda untuk memasukkan partisi swap yang tepat, menambahkan file swap, atau hanya membeli disk internal yang lebih besar.

  1. Bagaimana cara memberi peringatan jika ukuran matriks melebihi ukuran swap?

Lakukan saja matematika. Jika Anda mengetahui ukuran matriks sebelum program dimulai, hitung ukurannya dalam MiB dan bandingkan dengan swap yang tersedia.

  1. Bagaimana cara membuat progress bar dalam menghitung matriks besar Anda di Matlab?

matlab memiliki hak API? Saya rasa ini bukan forum yang tepat untuk pertanyaan itu. Bahkan jika Anda memiliki API, Anda akan memblokir IO melalui swap sehingga hanya akan menjadi bilah kemajuan yang tidak benar-benar mencerminkan kenyataan.

  1. Bagaimana cara membunuh progres sibuk dan / atau swapon -s / swapoff dalam iterasi (2)?

Kamu tidak. hanya karena Anda selesai dengan perhitungan tidak berarti sistem operasi dilakukan dengan sumber daya yang Anda alokasikan. Setelah selesai menulis untuk bertukar, itu akan dibebaskan. Anda telah menghabiskan begitu banyak memori sehingga banyak aplikasi tidak bisa mendapatkan memori yang mereka butuhkan sehingga mereka menggunakan swap juga. Biarkan saja dan biarkan sistem operasi melakukan itu. Sebelum Anda menjalankan selanjutnya, bersihkan cache.

echo 3 > /proc/sys/vm/drop_caches 

Mungkin ada lebih dari itu, saya bukan ahli VM Linux. Akan bermanfaat untuk menyelidiki bagaimana pengalokasi SLAB / SLUB bekerja dan bagaimana menyetelnya untuk kebutuhan memori Anda yang besar. Anda mungkin dapat MLOCK matlab ke dalam memori. Itu memaksa OS untuk mencadangkan memori untuk Anda, atau itu tidak dimulai, Anda juga harus membukanya setelah selesai. Saya dapat melakukan ini dengan C API, tetapi saya tidak yakin bagaimana Anda akan melakukannya di luar proses yang tidak dapat saya kompilasi ulang, yang akan memerlukan beberapa penelitian.

Akhirnya, ini adalah jenis barang yang dibuat untuk EC2. Sepertinya 16G adalah yang Anda butuhkan, m4.4xlarge memiliki 64G ram @ $ 0,958 per Jam. Itu kurang dari secangkir kopi. Script pemasangan matlab Anda menggunakan juju charm atau sejenisnya dan ubah semuanya menjadi perhitungan sebagai layanan.

Apakah 16G 16 GB?

  • Ya, biasanya ketika kita meninggalkan suffix yang kita maksud angka base2 dalam satuan byte. Jika Anda ingin ringkas, Anda akan menulis 16GiB.

"Saya perlu matriks yang> 100 GB. Saya tidak tahu apakah Anda bisa melakukannya dengan EC2."

Haruskah Anda menghapus cache juga echo 3 > /proc/sys/vm/drop_caches?

  • Ya, tidak ada salahnya untuk selalu melakukan itu. Lihat Dokumentasi / sysctl / vm.txt di kernel linux.

Bagaimana Anda bisa MLOCK Matlab ke dalam memori?

  • man mlock. Meskipun saya melakukan kesalahan ketika saya mengutip itu. Panggilan ini memastikan bahwa Anda dapat mengalokasikan semua memori yang Anda inginkan dan tetap tidak ditukar, itu tidak akan pernah menggunakan memori virtual. Bukan itu yang Anda inginkan.

Saya pikir Anda dapat mengikat C API ke Matlab. - - Apakah Anda punya ide untuk mematikan swap jika ada kegagalan dalam proses?

  • Saya akan berterus terang di sini, konsep file swap manajemen mikro dengan cara yang Anda usulkan adalah konyol. Tugas sistem operasi adalah mengelola sumber daya dan membagikannya secara adil & konsisten. Setelah Anda memberinya lebih banyak sumber daya, ia akan menggunakannya sesuai keinginan. Anda tidak bisa mengatakannya ketika Anda sudah selesai dan menarik sumber daya dari bawahnya, OS memberi tahu Anda ketika sudah selesai.

Ketika saya meminta OS untuk ruang alamat memori, kadang-kadang itu tidak selalu berhasil, itu tidak berarti saya tidak dapat mencoba lagi. Matlab itu tidak dapat memanggil malloc dua kali adalah masalah matlab.

Jadi, untuk memengaruhi perubahan yang Anda inginkan, jika ruang 100G itu benar - benar bernilai tinggi maka Anda perlu mencari tahu bagaimana cara memberitahu sistem operasi untuk memangkas jejak memori (dengan membersihkan cache untuk permulaan) sehingga manajer memori tidak rasakan kebutuhan untuk menggunakan ruang swap tambahan yang disediakan. Kemudian dan hanya setelah itu Anda dapat meminta manajer memori untuk melepaskan file swap.

Sangat mudah untuk menumbuhkan hal-hal seperti memori dan disk, jauh lebih sulit untuk mengecilkannya. Penyusutan memaksa penyeimbangan ulang setiap pengguna yang memiliki sumber daya yang dialokasikan di ruang itu. Jika saya sebaliknya berkata "Saya memiliki array penyimpanan 100TB tapi sekarang saya hanya perlu 60TB, mengapa ketika saya menghapus 40TB disk yang array berhenti bekerja?" Nah, jawabannya akan jelas bukan?

Jadi, inilah pilihan Anda seperti yang saya lihat.

  1. selidiki matlab C API untuk melihat apakah Anda bisa mendapatkan kontrol yang lebih baik tentang bagaimana memori dialokasikan untuk set kerja masif ini.

  2. refactor komputasi Anda untuk menghitung apa yang Anda miliki sekarang menggunakan sub-matriks atau representasi data jarang lainnya.

  3. tulis program Anda sendiri dalam C / C ++ menggunakan kebanyakan pustaka aljabar linier di luar sana untuk melakukan perhitungan dan gunakan mallocatau mmapanonim untuk mengalokasikan ruang alamat yang Anda butuhkan.

ppetraki
sumber
Ya, tapi itu mungkin tidak cukup dan Anda mungkin harus menunggu dan mencoba lagi sebelum berhasil, jika pernah.
ppetraki
1
heh, sisa komentar Anda tidak muncul di ponsel cerdas saya. Anda tidak dapat menggemakan sudo seperti itu, sebaliknya lakukan. echo 3 | sudo tee /proc/sys/vm/drop_caches
ppetraki
Saya menerima jawaban ini karena ia memiliki pengertian yang tepat dalam jawabannya. Untuk menjalankan Klien dalam skrip yang sama dengan menyiapkan lingkungan sangat rentan kesalahan. Diskusi lebih lanjut tentang hal ini di sini unix.stackexchange.com/a/298543/16920 - - Alangkah baiknya jika Anda bisa sedikit membersihkan tubuh Anda.
Léo Léopold Hertz 준영
12

Anda tidak dapat mendedikasikan swap untuk perangkat lunak. Yang dapat Anda lakukan adalah membuat skrip shell yang membuat swap, mulai MATLAB, dan hapus swap saat MATLAB keluar.

Berikut ini contoh skrip yang membuat swap 10 MB di direktori / tmp, mount, mulai R (saya tidak punya matlab), tunggu R keluar, umount file swap, dan hapus.

Harap perhatikan bahwa: - Anda akan mendapat peringatan karena file swap tidak dimiliki oleh root. Itu karena sistem akan digunakan jika untuk perangkat lunak apa pun, mungkin tidak dijalankan oleh Anda, dan Anda dapat membaca file ini ... Saya membiarkan Anda memperbaikinya. - jika Anda [ctrl] - [c] skrip, atau logoff, atau dll, swap akan tetap terpasang. Saya membiarkan Anda memperbaikinya juga.

#!/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}
Michael Hooreman
sumber
1
Yah, itu tidak benar-benar didedikasikan untuk MATLAB, tetapi untuk situasi apa pun membutuhkan lebih banyak RAM sementara. Harap dicatat bahwa swapon / swapoff membutuhkan root yang benar (jadi: sudo)
Michael Hooreman
1
Ya, sudah. Itulah cara menjadi root.
Michael Hooreman
Jawaban yang bagus. Saya pribadi akan mendekatinya, dan menyimpan skrip add-swap.sh saya sendiri untuk saat-saat indah ketika ingatan saya habis
Sergiy Kolodyazhnyy
Saya memberikan hadiah itu di sini karena itu membuat saya menjadi hal yang benar. Namun saya tidak dapat menerima jawabannya karena manajemen kesalahan sangat sulit dan tidak lengkap. Cara terbaik adalah mengatur swap secara terpisah dari menjalankan Matlab, silakan lihat jawabannya di sini unix.stackexchange.com/a/298543/16920
Léo Léopold Hertz 준영
1

Ini adalah bagaimana Anda dapat memperluas memori SWAP Anda menggunakan hard drive eksternal :

  • Pertama, tulis memori SWAP Anda yang sebenarnya dengan menjalankan:

    free -m
    
  • Kedua, siapkan folder HDD Anda. Seharusnya seperti itu /media/myhdd.

  • Tentukan ukuran SWAP tambahan yang ingin Anda tambahkan. Katakanlah, X GB.
  • Hitung jumlah byte yang kuantitasnya. Menggunakan GB, ini adalah: Y = X * 1024 ^ 3 , di mana Y adalah hasil perhitungan Anda.
  • Pilih ukuran blok file (dalam byte). Mari kita gunakan default di sini: 4096 (Lihat lebih lanjut tentang ini di sini ).
  • Hitung jumlah blok yang akan dimiliki file: Z = Y / 4096
  • Buat file berukuran X GB menggunakan perintah berikut di terminal:

    dd if=/dev/zero of=/media/myhdd/swapfile bs=4096 count=Z
    
  • Buat SWAP dalam file menggunakan:

    sudo mkswap /media/myhdd/swapfile -f
    
  • Akhirnya, aktifkan SWAP:

    sudo swapon -p 1000 /media/myhdd/swapfile
    

Sekarang SWAP Anda telah meningkat. Periksa lagi denganfree -m


Kami dapat mengatur ini dalam skrip non-interaktif ( sudodiperlukan daya):

#!/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: harap optimalkan / koreksi jika memungkinkan. Seperti yang dikatakan, ini adalah skrip pertama saya :)


sumber
Yah, swap sudah lambat, tapi saya tidak bisa membayangkan memiliki swap di USB drive. Ini akan menjadi lambat seperti IMHO
Michael Hooreman
Sebuah skrip sebagai ringkasan akan sangat bagus di sini.
Léo Léopold Hertz 준영
1
Saya tidak pernah membuat skrip, tetapi akan mencobanya.
1

Setidaknya saya akan menguji seberapa baik RAM terkompresi (modul zram kernel, tersedia sejak kernel versi 3.14) berkinerja.

Mengikuti instruksi 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

Dugaan saya adalah bahwa RAM yang dikompresi harus lebih cepat daripada disk I / O.

Untuk menjaga perubahan juga setelah restart, letakkan perintah waktu boot /etc/rc.localdan jalankan sudo systemctl enable rc-local.service.

JJ Hakala
sumber
Saya memperluas jawaban ke utas unix.stackexchange.com/q/297752/16920 untuk efek zram pada ukuran memori dan tingkat halaman. Saya tidak dapat menemukan efek pada ukuran memori, mungkin sebagian besar pada halaman. Namun, peringatan systemd / ... meningkat dengan runit. Alangkah baiknya mengetahui tentang tingkat kesalahan zram.
Léo Léopold Hertz 준영
Dalam kasus zram0, ada beberapa statistik yang tersedia di / sys / block / zram0 dalam file orig_data_size dan compr_data_size . Saya tidak punya banyak data bertukar di sana, tetapi untuk apa ada rasionya adalah sekitar 0,35. Dengan rasio itu, 11 GB data mungkin cocok dengan 4 GB RAM. Itu bisa berarti 7 GB data tidak ditukar ke disk.
JJ Hakala
1
Anda dapat menempatkan perintah waktu boot di /etc/rc.local dan kemudiansudo systemctl enable rc-local.service
JJ Hakala
Saya mengetahui bahwa zramini tidak berlaku untuk swap pada HDD / SSD jadi zramtidak berlaku di sini, silakan lihat utas askubuntu.com/a/472227/25388
Léo Léopold Hertz 준영
1

Gunakan zswapjika Anda memiliki bagian swap pada HDD / SSD. Modul zramini tanpa bagian swap pada HDD / SSD, jadi jawaban Hakala tidak berlaku. Lihat thread zram vs zswap vs zcache Ultimate guide: kapan harus menggunakan yang mana untuk penjelasan. Pengaturan zswapseperti yang dijelaskan di utas Cara Mengaktifkan Zswap dengan Berhasil untuk Perhitungan Matlab di Ubuntu 16.04?

  • Ganti baris yang sesuai dengan baris berikut di /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"
    
  • Lari sudo update-grub.

Léo Léopold Hertz 준영
sumber