Bagaimana cara menambah ruang swap maksimum pada Mac OS X?

14

Pada Mac OS X Yosemite 10.10.5, ketika saya mencoba menjalankan perhitungan yang perlu mengalokasikan dan menggunakan memori 128 GB (ini adalah program baris perintah yang ditulis dalam C), kernel membunuh proses saya dengan prasangka ekstrem. Entri log konsol ini adalah contoh dari satu contoh:

9/25/15 7: 08: 40.000 PM kernel [0]: swap rendah: membunuh pid 6202 (huffgrp)

Perhitungan berfungsi dengan baik dan dalam jumlah waktu yang wajar ketika mengalokasikan dan menggunakan memori 64 GB. Mac saya memiliki 32 GB RAM dan ruang beaucoup pada hard drive. Saya juga mencoba ini pada Mac lain dengan 8 GB RAM, di mana perhitungan 64 GB berjalan dengan baik juga, mengambil lebih lama tentu saja, tetapi perhitungan 128 GB terbunuh oleh kernel dengan cara yang sama.

Omong-omong, malloc()jangan pernah mengembalikan kesalahan, tidak peduli berapa banyak ruang yang saya minta. Kernel hanya akan mematikan proses setelah terlalu banyak memori yang benar-benar digunakan oleh proses, menghasilkan banyak pertukaran ke hard drive.

Jadi tampaknya ada batas ruang swap rahasia di suatu tempat antara 64 GB dan 128 GB.

Pertanyaan saya adalah: bagaimana cara mengkonfigurasi ulang kernel untuk mengizinkan lebih banyak ruang swap? Saya menemukan file yang tampak menjanjikan /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist, tetapi saya tidak melihat nomor rahasia di sana. Halaman manual untuk dynamic_pagermengatakan bahwa semua yang dilakukannya adalah mengatur nama dan lokasi file swap. Ada versi lama dari halaman manual yang sama yang mendokumentasikan -Sopsi untuk mengatur ukuran file swap yang dibuat. Saya mencobanya, meminta 160 GB swapfiles, tetapi tidak berpengaruh. File swap masing-masing masih 1 GB, dan prosesnya masih dimatikan oleh kernel.

Mark Adler
sumber
Saya juga memposting pertanyaan ini di apple.stackexchange.com, tetapi belum ada tanggapan di sana.
Mark Adler
1
Alasan Anda bisa malloclebih dari yang Anda miliki adalah karena commit_limit sangat tinggi (mungkin tak terbatas). Oleh karena itu OS akan mengalokasikan memori yang tidak dimilikinya (ini bertaruh bahwa proses tidak akan menggunakannya, os biasanya memenangkan taruhan ini). Anda mungkin ingin menyesuaikan batas komit menjadi batas memori, dengan cara ini proses akan gagal lebih awal.
ctrl-alt-delor
Saya tidak bisa melihat mengapa Anda menganggap paragraf 5 itu benar, itu tidak mengikuti dari paragraf 4 (meskipun Anda memulainya dengan “jadi”). Anda juga sudah mencoba menambahkan banyak swap? (pertanyaannya tidak jelas tentang ini, meskipun saya menduga jawabannya adalah ya).
ctrl-alt-delor
@ Richard Ya, saya tahu mengapa malloc()melakukan itu. Saya membelokkan kemungkinan komentar pada seseorang yang berpikir saya tidak memeriksa nilai balik dari malloc(). Ngomong-ngomong, tujuan saya bukanlah untuk gagal lebih awal. Tujuan saya adalah untuk berhasil.
Mark Adler
@ Richard Karena pesan kernel mengatakan "swap rendah". Mengenai "menambahkan banyak swap", tidak, saya belum melakukannya karena saya tidak tahu caranya. Itulah tepatnya pertanyaan ini. Bagaimana cara menambahkan ruang swap? Tentu saja, kernel menambahkan ruang swap secara otomatis, tetapi hanya sampai batas tertentu. Karena itu, akar pertanyaan: Bagaimana cara meningkatkan batas ruang swap kernel?
Mark Adler

Jawaban:

4

Bukan jawaban yang Anda minta, tetapi jika Anda membuat file Anda sendiri dengan ukuran yang sesuai, mmap itu ke dalam proses Anda, dan kemudian menjalankan perhitungan Anda di ruang alamat ini itu harus memiliki efek yang sama dengan file swap dan Anda dijamin untuk memiliki ruang, yang bertentangan dengan bersaing dengan proses lain untuk RAM / swap yang tersedia.

Mungkin juga lebih lambat, tergantung pada seberapa sering Anda menimpa data, tetapi harus jauh lebih portabel.

kebodohan
sumber
2
Ide yang hebat! Saya memiliki harapan tinggi. Sayangnya, mereka berlari melawan pantai kenyataan yang keras. Proses ini masih dibunuh oleh kernel untuk sejumlah besar swapping, sama seperti sebelumnya (pesan konsol "swap rendah"), meskipun itu menggunakan file yang saya buat untuk digunakan sebagai memori virtual oleh mmap().
Mark Adler
Maaf, sebagian besar pengalaman saya adalah dengan Linux. Tapi, mungkin masalahnya adalah bahwa kernel tidak membilas kembali ke file dan menahannya di RAM. Bagaimana jika Anda secara berkala menelepon msync()untuk memaksanya melakukannya?
dataless
0

Info mac saya cukup tanggal mungkin tidak ada lagi keajaiban kernel untuk melakukan ini. Karena itu saya sarankan menggunakan Linux untuk program ini, di mana Anda dapat me-mount folder atau partisi sebagai swap dengan sangat sederhana.

Hilangkan ketidakpastian menggunakan folder swap dinamis. Buat partisi swap fisik (hanya partisi kosong yang tidak diformat, dengan kode jenis tabel disk untuk swap, di Linux itu adalah kode hex 0x82.) Kemudian:

  1. Edit file / etc / rc temukan bagian swap mengomentari semuanya. tambahkan barismount -vat swap
    • berarti me-mount semua partisi swap di / etc / fstab
  2. Lari pdisk /dev/disk? -dump
    • "?" adalah nomor disk dari hd Anda, catat nomor di sebelah partisi swap
  3. Edit atau buat / etc / fstab (mungkin tidak ada) tambahkan baris seperti /dev/disk?s?? none swap sw 0 0
    • ? adalah disk Anda.
    • ?? adalah jumlah partisi swap.
  4. reboot
Kekuatan penuh
sumber