Saya sedang mengembangkan program; kadang-kadang berakhir mengalokasikan jumlah memori yang sangat besar (>> 10G pada mesin dengan memori fisik 8G), menyebabkan sistem menjadi tidak responsif. Saya ingin membatasi jumlah memori yang dapat dialokasikan oleh proses. Cara yang biasa saya lakukan adalah:
ulimit -m 4000000 ; ./myprogram
... yang seharusnya mematikan program saya jika mencoba menggunakan lebih dari 4GB memori.
Pada OS X El Capitan ini tampaknya tidak berpengaruh; bahkan ulimit -m 1
(membatasi semua program hanya dengan memori 1kB!) tidak efektif.
Bagaimana saya bisa mengatur batas atas pada memori yang tersedia untuk proses tertentu?
macos
el-capitan
command-line
memory
development
callallen
sumber
sumber
ulimit -m
tidak lagi berfungsi di Linux (> 2.4.30), meskipunulimit -v
masih berfungsi seperti yang diharapkan. (Sepertiulimit -m
,ulimit -v
juga tampaknya tidak berpengaruh pada OS X.)Jawaban:
Ada dua pendekatan untuk membatasi penggunaan memori Anda: Ex post facto, dan preemptive. Artinya, Anda dapat mencoba untuk mematikan program Anda setelah terlalu besar, atau Anda dapat memprogramnya untuk tidak menjadi terlalu besar.
Jika Anda bersikeras pada pendekatan ex post facto, Anda dapat menggunakan skrip Bash berikut. Script ini pertama-tama menemukan jumlah memori (seperti yang didefinisikan oleh "resident set size") yang digunakan oleh prosesid pid, memfilter semua data non numerik menggunakan grep, dan menyimpan jumlahnya sebagai variabel n. Script kemudian memeriksa apakah n lebih besar dari x yang Anda tentukan. Jika ya, proses dengan pid prosesi terbunuh.
Tolong dicatat:
<pid>
dengan id proses program Anda.<x>
dengan rss = "resident set size" (yaitu ukuran memori sebenarnya) yang tidak Anda inginkan melebihi program.n=$(ps -<pid> -o rss | grep '[0-9]') if [ $n -gt <x> ]; then kill -9 <pid>; fi
Jika Anda ingin ini berjalan setiap y detik, cukup masukkan dalam satu lingkaran, dan katakan itu untuk menunggu y detik setelah setiap iterasi. Anda juga bisa menulis perintah serupa menggunakan
top
. Titik awal Anda adalahtop -l 1|grep "<pid>"|awk '{print $10}'
.@ kenorb ini jawabannya membantu saya dengan naskah saya
Sementara saya percaya bahwa menjawab pertanyaan, dalam jangka panjang saya percaya itu adalah desain pemrograman yang lebih baik untuk mengambil pendekatan preemptive menggunakan alokasi memori manual.
Pertama, apakah Anda yakin penggunaan memori benar-benar masalah? Dokumentasi Go menyatakan:
Jika Anda masih berpikir Anda memiliki masalah, maka saya mendorong Anda untuk mengelola memori secara manual seperti yang dilakukan dalam bahasa pemrograman C. Karena go ditulis dalam C, saya curiga akan ada cara untuk masuk ke manajemen / alokasi memori C, dan memang ada. Lihat repositori github ini yang,
Kasus penggunaan diberikan sebagai:
Ini sepertinya solusi jangka panjang yang lebih baik.
Jika Anda ingin mempelajari lebih lanjut tentang C (termasuk manajemen memori), Bahasa Pemrograman C adalah referensi standar.
sumber