Situasi: memperbaiki Out of Memory
kesalahan 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
mkswap
danswapon
.
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 Memory
kesalahan dengan matriks besar di Matlab. Saya tidak berhasil dalamreshape
matriks untuk vektor dan menulis kode paralel. Jadi saya ingin menggunakan memori virtual karena saya harus menyelesaikan pekerjaan; harga tidak masalah.
Kodesemu
- Skrip shell yang membuat swap, mulai MATLAB, dan hapus swap saat MATLAB keluar. ( MichaelHooreman )
- Aktifkan swap pada HDD eksternal. Bagaimana cara menggunakannya di
sudo swapon -a
sini? - Mulai Matlab.
- Masukan Matlab gunakan swap.
- 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
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
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
prefdir
memberi/home/masi/.matlab/R2016a
yang merupakan lokasi default (/home/{username}/.matlab/R2016a
. File/home/masi/.matlab/R2016a/matlab.prf
ada setelah restart, di sini .... [kesalahan lain] ...
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/fstab
untuk 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?
Jawaban:
OK, cukup daftar yang Anda miliki di sana. Biarkan saya merespons sebaris
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.
Lakukan saja matematika. Jika Anda mengetahui ukuran matriks sebelum program dimulai, hitung ukurannya dalam MiB dan bandingkan dengan swap yang tersedia.
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.
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.
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?
"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
?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?
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.
selidiki matlab C API untuk melihat apakah Anda bisa mendapatkan kontrol yang lebih baik tentang bagaimana memori dialokasikan untuk set kerja masif ini.
refactor komputasi Anda untuk menghitung apa yang Anda miliki sekarang menggunakan sub-matriks atau representasi data jarang lainnya.
tulis program Anda sendiri dalam C / C ++ menggunakan kebanyakan pustaka aljabar linier di luar sana untuk melakukan perhitungan dan gunakan
malloc
ataummap
anonim untuk mengalokasikan ruang alamat yang Anda butuhkan.sumber
echo 3 | sudo tee /proc/sys/vm/drop_caches
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.
sumber
Ini adalah bagaimana Anda dapat memperluas memori SWAP Anda menggunakan hard drive eksternal :
Pertama, tulis memori SWAP Anda yang sebenarnya dengan menjalankan:
Kedua, siapkan folder HDD Anda. Seharusnya seperti itu
/media/myhdd
.Buat file berukuran X GB menggunakan perintah berikut di terminal:
Buat SWAP dalam file menggunakan:
Akhirnya, aktifkan SWAP:
Sekarang SWAP Anda telah meningkat. Periksa lagi dengan
free -m
Kami dapat mengatur ini dalam skrip non-interaktif (
sudo
diperlukan daya):PS: harap optimalkan / koreksi jika memungkinkan. Seperti yang dikatakan, ini adalah skrip pertama saya :)
sumber
Setidaknya saya akan menguji seberapa baik RAM terkompresi (modul zram kernel, tersedia sejak kernel versi 3.14) berkinerja.
Mengikuti instruksi wiki archlinux
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.local
dan jalankansudo systemctl enable rc-local.service
.sumber
sudo systemctl enable rc-local.service
zram
ini tidak berlaku untuk swap pada HDD / SSD jadizram
tidak berlaku di sini, silakan lihat utas askubuntu.com/a/472227/25388Gunakan
zswap
jika Anda memiliki bagian swap pada HDD / SSD. Modulzram
ini 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. Pengaturanzswap
seperti 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
Lari
sudo update-grub
.sumber