Bagaimana cara menonaktifkan Mac OS X dari menggunakan swap ketika masih ada memori "Tidak Aktif"?

61

Sebuah fenomena umum dalam penggunaan sehari-hari saya (dan beberapa lainnya menurut berbagai posting di internet) dari OS X, sistem tampaknya menjadi lambat setiap kali tidak ada lagi memori "Gratis" yang tersedia. Seharusnya, ini karena swapping, karena aktivitas hard disk sudah jelas dan vm_stat melaporkan banyak pageouts. (Koreksi saya dari yang salah)

Namun, jumlah ram "Tidak Aktif" biasanya sekitar 12,5% -25% dari semua memori yang tersedia (^ 1.) Ketika bertukar mulai / terjadi / berakhir.

Menurut http://support.apple.com/kb/ht1342 :

Memori tidak aktif

Informasi ini dalam memori tidak sedang digunakan secara aktif, tetapi baru-baru ini digunakan.

Misalnya, jika Anda telah menggunakan Mail dan kemudian berhenti, RAM yang digunakan Mail ditandai sebagai Memori tidak aktif. Memori tidak aktif ini tersedia untuk digunakan oleh aplikasi lain, sama seperti memori Gratis. Namun, jika Anda membuka Mail sebelum memori tidak aktifnya digunakan oleh aplikasi yang berbeda, Mail akan terbuka lebih cepat karena memori tidak aktif dikonversi ke memori aktif, daripada memuat email dari hard disk yang lebih lambat.

Dan menurut http://developer.apple.com/library/mac/#documentation/Performance/Conceptual/ManagingMemory/Articles/AboutMemory.html :

Daftar tidak aktif berisi halaman yang saat ini ada dalam memori fisik tetapi belum diakses baru-baru ini. Halaman-halaman ini berisi data yang valid tetapi dapat dilepaskan dari memori kapan saja .

Jadi, pada dasarnya: Ketika sebuah program telah berhenti, ingatannya menjadi tidak aktif dan harus dapat diklaim kapan saja. Namun, OS X akan lebih memilih untuk mulai menukar memori ke file Swap daripada hanya mengklaim memori ini, setiap kali "Gratis" memori menjadi rendah.

Mengapa? Apa keuntungan dari perilaku ini, katakanlah, secara instan melepaskan memori tidak aktif dan bahkan tidak menyentuh file swap? Beberapa sumber (^ 2.) Menunjukkan bahwa OS X akan mengeluarkan memori "Tidak Aktif" untuk bertukar sebelum melepaskannya, tetapi itu tidak masuk akal sekarang apakah itu jika memori dapat dilepaskan dari memori kapan saja ? Bertukar itu mahal, melepaskan itu murah, kan?

Bisakah perilaku ini diubah menggunakan beberapa preferensi atau peretasan yang dikenal? (Lebih disukai yang tidak termasuk menonaktifkan swap / dynamic_pager sama sekali dan memulai kembali ...)

Saya sangat menghargai perintah pembersihan , serta konsep Memperbaiki izin disk untuk memaksa beberapa memori Gratis, tetapi itu adalah cara untuk secara paksa memaksa lebih banyak memori Gratis daripada benar-benar memperbaiki logika keputusan swap / release ...

Btw pertanyaan serupa ditanyakan di sini: http://forums.macnn.com/90/mac-os-x/434650/why-does-os-x-swap-when/ dan di sini: http: //hintsforums.macworld .com / showthread.php? t = 87688 tetapi meskipun OP kembali menanyakan pertanyaan inti, tidak ada jawaban yang menjawabnya ...

^ 1. UPDATE 17-mar-2012 Sejak saya pertama kali memposting pertanyaan ini, saya telah beralih dari 4GB menjadi 8GB ram yang terpasang, dan masalahnya tetap ada. Jumlah ram "Tidak Aktif" adalah 0,5gb-1,0gb sebelumnya dan sekarang biasanya sekitar 1,0-2,0GB ketika bertukar mulai / terjadi / berakhir, yaitu tampaknya sekitar 12,5% -25% ram disimpan sebagai Tidak Aktif oleh osx logika kernel.

^ 2. Misalnya https://apple.stackexchange.com/questions/4288/what-does-it-mean-if-i-have-lots-of-inactive-memory-at-the-end-of-a-work- hari :

Setelah semua memori Anda digunakan (memori bebas adalah 0), OS akan menuliskan memori tidak aktif ke swapfile untuk membuat lebih banyak ruang dalam memori aktif.

PEMBARUAN 17-mar-2012

Berikut adalah ringkasan metode yang telah disarankan untuk membantu sejauh ini:

The purge perintah

"Digunakan untuk memperkirakan kondisi boot awal dengan cache buffer hard disk untuk analisis kinerja. Ini tidak memengaruhi memori anonim yang telah dialokasikan melalui malloc, vm_allocate, dll".

Ini berguna untuk mencegah osx untuk menukar cache disk (yang konyol bahwa OSX sebenarnya melakukannya di tempat pertama), tetapi dengan downside bahwa cache disk dilepaskan, artinya jika cache disk tidak akan menjadi swap, seseorang hanya akan berakhir dengan cache buffer disk dingin, mungkin mempengaruhi kinerja negatif.

The FreeMemory aplikasi dan / atau Perbaikan izin disk untuk memaksa beberapa memori Gratis

Tidak membantu melepaskan memori apa pun, hanya memindahkan beberapa gigabytes isi memori dari ram ke hd. Pada akhirnya, ini menyebabkan banyak swap-in ketika saya mencoba untuk menggunakan aplikasi yang terbuka saat membebaskan memori, karena banyak vm-nya sekarang di swap.

Mempercepat alokasi swap menggunakan dynamicpagerwrapper

Tampaknya hal yang baik untuk dilakukan dalam rangka mempercepat penggunaan swap, tetapi tidak membahas masalah swapping osx di tempat pertama sementara masih ada memori tidak aktif.

Menonaktifkan swap dengan menonaktifkan dynamicpager dan memulai kembali

Ini akan memaksa osx untuk tidak menggunakan swap dengan harga tergantung sistem ketika semua memori digunakan. Bukan alternatif yang layak ...

Menonaktifkan swap menggunakan dynamicpager yang diretas

Mirip dengan menonaktifkan dynamicpager di atas, beberapa kutipan dari komentar ke posting blog menunjukkan bahwa ini bukan solusi yang layak: "Memori Tidak Aktif tinggi seperti biasa". "ketika sistem Anda kehabisan memori, seluruh os hang ...", "jika Anda mengkonsumsi seluruh jumlah memori mac, mesin kemungkinan akan hang"

Singkatnya, saya masih tidak mengetahui cara menonaktifkan Mac OS X dari menggunakan swap ketika masih ada memori "tidak aktif". Jika tidak memungkinkan, mungkin setidaknya ada penjelasan di suatu tempat mengapa osx lebih memilih untuk menukar memori yang dapat dilepaskan dari memori kapan saja ?

Motin
sumber
1
Saya punya masalah ini, diilustrasikan oleh nomor Monitor Aktivitas ini: bassistance.de/i/f2322d.png Hampir tidak ada memori bebas, tetapi banyak memori tidak aktif. Alih-alih mengklaim kembali itu, OSX lebih memilih untuk mulai bertukar berat, seperti yang Anda lihat pada halaman 40 GB keluar.
Jörn Zaefferer
Saya punya banyak memori gratis dan masih ada beberapa GB swap yang digunakan. 16GB rMBP.
Steven Lu
1
rupanya beberapa orang telah melaporkan manfaat dari menjalankan "pembersihan" apple.stackexchange.com/questions/67031/... non negative
rogerdpack

Jawaban:

19

Menurut definisi, memori tidak aktif adalah memori yang siap untuk paging out, dan paging out mungkin melibatkan penulisan untuk swap. Ini bukan masalah atau masalah apa pun yang harus dioptimalkan; itu sebenarnya OS X bekerja seperti yang dirancang .

Sayangnya, penulis dukungan teknis bukan pengembang kernel, dan kutipan artikel dukungan Basis Pengetahuan Apple hanya salah ketika mengklaim bahwa memori tidak aktif adalah memori yang tidak digunakan oleh program. Saat Anda keluar dari sebuah program, semua memori residennya menjadi Gratis; itu tidak berhenti di tidak aktif. Namun, tautan kedua ke situs pengembang yang menggambarkan cara kerja manajemen memori adalah sumber yang bagus, jika dibaca sepenuhnya.

Ada banyak kesalahpahaman tentang apa yang dimaksud dengan "memori tidak aktif" di OS X. Berlawanan dengan kesalahpahaman itu, tidak semua memori tidak aktif kosong, tidak digunakan, cache, atau dapat purgeable. Faktanya, memori aktif dapat di-cache atau dapat juga dimurnikan, jika telah diakses baru-baru ini. Banyak memori yang tidak aktif juga berisi data yang tidak bisa dibuang begitu saja. Jika dibuang, program akan macet, karena halaman yang dibuang akan berisi data yang valid (seperti kutipan dari sisi pengembang OS X mengatakan,) dan program mengharapkan data yang mereka simpan dalam memori (virtual) untuk tidak hilang begitu saja.

Memori tidak aktif berisi jenis data yang sama dengan memori aktif. Satu-satunya perbedaan adalah bahwa OS X telah memperhatikan bahwa beberapa potongan memori belum dibaca atau ditulis dalam beberapa saat.

Alasan bahwa OS X mengklasifikasikan beberapa memori sebagai tidak aktif dan daerah lain sebagai "aktif" ada hubungannya dengan paging out. Ketika kehabisan memori, Anda harus mengeluarkan beberapa data. Pertanyaannya adalah, data apa? Jika Anda mengeluarkan data yang ternyata dibutuhkan segera oleh suatu program, itu membuang-buang waktu dan tidak menghasilkan apa-apa. Jadi, Anda ingin halaman kehabisan memori bahwa program tidak perlu segera menggunakan lagi.

Mengantisipasi halaman mana yang kemungkinan tidak dibutuhkan di masa depan adalah sulit karena sebuah program dapat menggunakan memori virtualnya bagaimanapun suka dan tidak memberi tahu OS apa pun tentang apa rencananya. Tetapi sebagai heuristik, sebagian besar program "lengket" dalam penggunaan memori mereka; jika mereka belum pernah menggunakan memori dalam beberapa saat mereka cenderung terus tidak menggunakan memori itu, dan kemungkinan akan terus menggunakan memori yang baru saja mereka gunakan.

Jadi ketika OS memutuskan untuk mengeluarkan beberapa data, dibutuhkan strategi bertukar halaman yang belum digunakan baru-baru ini. Inilah sebabnya mengapa OS X memilah memori yang sedang ditempati oleh program menjadi dua tumpukan "aktif" dan "tidak aktif." The diposting link di atas ke situs Developer, jika membaca sepenuhnya, menceritakan bagaimana proses yang terjadi:

  • Ketika memori mulai menipis, OS mulai menelusuri halaman-halaman memori aktif, dan menetapkan flag pada masing-masingnya.
  • Jika suatu program membaca atau menulis ke suatu halaman, bendera dihapus.
  • Jika, setelah beberapa penundaan, bendera tidak dihapus, halaman itu akan diurutkan ke dalam tumpukan "tidak aktif".
  • Jika halaman "tidak aktif" diakses oleh programnya, itu dimasukkan kembali ke dalam tumpukan "aktif".
  • Ketika kehabisan memori, halaman "tidak aktif" paging out.

Perhatikan bahwa proses penyortiran untuk memutuskan memori mana yang akan diganti adalah serupa di semua sistem operasi modern. Linux memiliki dua daftar halaman aktif dan tidak aktif yang sama, seperti dijelaskan dalam Memahami Linux Virtual Memory Manager . Windows mungkin menggunakan sesuatu yang sedikit berbeda dengan lebih dari dua kelas kebaruan; Saya tidak dapat menemukan deskripsi teknis terkini yang dapat diandalkan saat ini. Lebih banyak implementasi dibahas di halaman Wikipedia yang berjudul "Algoritme penggantian halaman" . Satu-satunya perbedaan dengan OS X adalah bagaimana statistik ditampilkan: seseorang memutuskan itu akan menjadi ide yang baik untuk menunjukkan nomor terpisah untuk aktif dan tidak aktif dalam topatau Monitor aktivitas. Kalau dipikir-pikir ini mungkin bukan ide yang bagus (dan ini telah berubah di OS X 10.9.)

Proses pengaturan dan pembersihan bendera dan pemeliharaan tumpukan aktif / tidak aktif ini memang membutuhkan sedikit daya prosesor. Untuk alasan itu, OS X tidak melakukannya ketika ada banyak memori bebas. Jadi program pertama yang Anda mulai akan muncul sebagai semua "aktif" memori sampai memori bebas mulai menipis.

Jadi, saat Anda memulai dari papan tulis kosong, dan membuka lebih banyak program, Anda dapat melihat perkembangan berikut di Activity Monitor:

  • Pertama, ada banyak memori "bebas" dan sangat sedikit tidak aktif. Ini karena flagger memori belum mulai berjalan.
  • Ketika jumlah memori bebas turun, OS X akan mulai menjalankan flagger memorinya, dan Anda akan mulai melihat jumlah "tidak aktif" naik. Setiap bit "tidak aktif" sebelumnya "aktif."
  • Ketika Anda kehabisan memori bebas, halaman dari tumpukan "tidak aktif" akan keluar. Memory-flagger juga akan menjalankan kemiringan penuh memilah memori menjadi aktif dan tidak aktif. Biasanya, Anda akan melihat banyak "tidak aktif" saat swap sedang ditulis, yang menunjukkan bahwa memory-flagger melakukan apa yang seharusnya.

Halaman harusdiklasifikasikan sebagai tidak aktif sebelum ditukar. Itulah yang dimaksud kutipan dari situs Pengembang Apple ketika dikatakan "Halaman-halaman ini berisi data yang valid tetapi dapat dilepaskan dari memori kapan saja." Ini bertentangan dengan halaman Aktif, yang tidak akan dirilis sampai setelah mereka diturunkan ke Tidak Aktif. Ada berbagai cara untuk melepaskan halaman; jika halaman telah dipetakan dari file dan belum dimodifikasi, itu dapat segera dihapus dan dibaca kembali sesuai permintaan. Demikian pula jika itu adalah memori yang sebelumnya telah ditukar dan tidak dimodifikasi sejak itu ditukar. Program juga dapat secara eksplisit mengalokasikan cache dan memori yang dapat dimurnikan, untuk menyimpan data yang dapat dilupakan dan dibuat kembali sesuai permintaan (tetapi alasan suatu program akan mengalokasikan cache adalah jika diperlukan waktu yang signifikan untuk membuat ulang data itu.

Oleh karena itu melihat jumlah memori "tidak aktif" di Activity Monitor, dan melihat bahwa ada banyak tidak aktif pada saat komputer sedang menulis untuk bertukar, hanya memberi tahu Anda bahwa sistem bekerja sebagaimana dirancang.

Ada juga kebingungan antara memori tidak aktif dan file cache. Saya tidak yakin mengapa ada kebingungan itu, karena Activity Monitor sudah mendaftar di bawah judul yang berbeda. Cache adalah memori yang digunakan untuk menyimpan data terbaru yang telah dibaca atau ditulis dari sistem file, jika mereka perlu diakses lagi. Ketika memori rendah, OS X cenderung menyingkirkan cache terlebih dahulu. Jika Anda memiliki swap labruk, dan Monitor aktivitas menunjukkan tumpukan cache (BUKAN tidak aktif) maka itu akan menjadi masalah. Tetapi memori yang tidak aktif adalah hal yang berbeda.

Jika ragu, abaikan perbedaan antara "tidak aktif" dan "aktif." Anggap mereka sebagai satu gumpalan "memori yang digunakan oleh program" dan tambahkan dua angka bersama. Inilah yang dilakukan oleh setiap sistem operasi lain ketika memberi tahu Anda tentang penggunaan memori.

CATATAN untuk OS X 10.9: Maverick memperkenalkan "kompresi memori" yang merupakan, lebih atau kurang, lapisan swap yang lain. Halaman yang aktif sekarang diklasifikasikan tidak aktif, kemudian dikompres (yang mungkin muncul sebagai memori Kernel tergantung pada alat apa yang Anda gunakan,) kemudian ditulis untuk bertukar ketika penggunaan memori meningkat. Mavericks juga telah berhenti menunjukkan angka terpisah untuk aktif dan tidak aktif di Activity Monitor, karena ternyata tidak menjadi hal yang berguna untuk dilihat, terutama mengingat kesalahpahaman di sekitarnya.

kesesakan
sumber
4

Saat ini tidak ada cara mudah untuk menyesuaikan perilaku swappiness (atau begitulah sebutannya) macos X. Namun ada beberapa peretasan (memerlukan akun pengembang & SDK):

http://cestdelamerde.com/archives/22-Killing-Mac-OS-X-Swapping-How-To-Disable-dynamic_pager.html

http://dropsafe.crypticide.com/article/3848

Semoga berhasil!

Nota bene. Saya kira Anda mungkin ingin membaca jawaban ini (juga oleh saya) untuk memiliki ulasan yang lebih umum tentang apa yang aktif, tidak aktif dan memori lain di MacOSX: Memori Berkabel vs. Memori Aktif di OS X

bubu
sumber
Terima kasih atas balasan Anda. Menyesuaikan swappiness pasti akan membantu - mengecewakan bahwa itu tidak mudah! Mengenai tautan pertama, saya benar-benar mencari peretasan yang tidak termasuk menonaktifkan swap / dynamic_pager sama sekali dan memulai ulang, karena itu memerlukan terlalu banyak upaya untuk menonaktifkan penggunaan swap, serta membuat sistem tidak stabil ketika mendekati jumlah rendah memori tidak aktif dan bebas. Tautan ke-2 mengacu pada masalah file swap yang terus bertambah. Sementara dan masalah penting terutama ketika ada yang rendah pada file swap, itu tidak benar-benar relevan dengan pertanyaan saya di utas ini ...
Motin
4

Bukan solusi permanen, tapi setidaknya itu bisa membantu mendapatkan kembali beberapa memori tidak aktif, berpotensi menghindari pertukaran yang ditakuti: http://itunes.apple.com/nz/app/freememory/id460931672?mt=12

Alat ini gratis dan cukup mudah digunakan. Setelah dimulai, pilih opsi "Memori bebas" di bilah alat / menu sistem.

Berbeda dengan tampilan memori ActivityMonitor, ini hanya menunjukkan memori bebas, yang tampaknya menjadi indikator yang lebih baik untuk bertukar atau tidak.

Jörn Zaefferer
sumber
Saya telah mengevaluasi aplikasi ini sejak saran Anda sekitar dua bulan lalu. Tampaknya aplikasi ini memang meningkatkan jumlah memori "bebas" melalui berbagai trik, termasuk secara agresif mengklaim banyak memori untuk dirinya sendiri, kemudian melepaskannya. Namun, ini menyebabkan jumlah memori yang sama dengan yang "dibebaskan" untuk ditukar. Ini untuk mengatakan itu tidak membantu melepaskan memori apa pun, hanya memindahkan isi memori dari ram ke hd. Pada akhirnya, ini menyebabkan banyak swap-in ketika saya mencoba untuk menggunakan aplikasi yang terbuka saat membebaskan memori, karena banyak vm-nya sekarang di swap. :(
Motin
@Motin, saya telah menggunakan FreeMemory selama berbulan-bulan, dan itu tidak melakukan itu, setidaknya dalam pengalaman saya. Jika saya harus mendidik tebakan (berdasarkan apa yang saya lihat di Activity Monitor), perbedaannya adalah bahwa FM mengkonsumsi memori "aktif" terlebih dahulu, yang diprioritaskan daripada cache disk. Ini "membebaskan" memori lain dengan menjadi prioritas yang lebih tinggi, kemudian membebaskan memori sendiri . Saya belum pernah melihatnya menambah swap secara signifikan (mungkin sejumlah kecil yang dialokasikan saat sedang dikonsumsi).
kelopak mata
2

Dimulai dengan OS X 10.5 ada masalah manajemen memori yang jelas di MAC OS X. Web itu kemudian dipenuhi dengan keluhan tentang sistem yang melambat secara dramatis setelah beberapa waktu. Saat itu saya punya mesin lebih lambat, Mac Mini dengan RAM 1GB, jadi saya (salah) menyimpulkan bahwa itu karena perangkat keras yang lebih rendah.

Sekarang saya punya 2010 MBP, core i7, 8 GB RAM, dual GPU. Mac os X Snow Leopard terasa sakit, tetapi setelah bermigrasi ke OS X Lion, mengerjakan beberapa hal serius pada MAC mulai menjadi mimpi buruk.

Saya akhirnya berhasil mereproduksi skenario bermasalah, jadi saya menjalankan tes dan merekam layar, menjadi video.

Masalah kinerja MAC OS X Lion - manajemen memori rusak

Saya menjalankan perintah tar + bzip, yang merupakan hal dasar unix, pada sejumlah besar file gambar, di Pictures / folder saya. Tepat sebelum memulai, saya menjalankan perintah "pembersihan", untuk menghapus data program yang tidak aktif / di-cache.

Anda dapat melihat pada video bahwa memori bebas mulai turun sangat cepat, dan tidak aktif terus meningkat. Jika Anda melihat perintah "bsdtar", itu hanya membutuhkan sebagian dari RAM, jadi masalahnya bukan pada proses ini. Anda tidak dapat mengatakan bahwa itu adalah kebocoran memori program, karena dengan demikian masalahnya tidak akan menjadi ram tidak aktif, melainkan dalam aktif / kabel.

Ketika memori bebas turun di bawah 100mb, saya memulai beberapa aplikasi, seperti Safari, iPhoto, dan MS Word, dan Anda dapat melihat dalam video, bahwa dibutuhkan waktu beberapa menit untuk memulai aplikasi, ketika biasanya (ketika ada RAM gratis), itu akan memakan waktu 3-5 detik untuk memuat.

Saya menjalankan skenario yang sama dan perintah yang sama pada kotak Linux Centos 6 saya, tidak ada masalah di sana! Penggunaan memori sekitar 10-20mb, tidak ada masalah dengan cache / buffer.

Manajemen memori harus sangat rusak di Mac OS X!

egremyl
sumber
2
Apa yang Anda lihat adalah sistem file cache dalam memori. Saya setuju bahwa ada masalah, di mana cache tampaknya tidak pernah dibersihkan ... tetapi caching itu sendiri (dan pertumbuhan memori yang tidak aktif sebagai konsekuensinya) adalah fitur kinerja yang waras dan terkadang berguna.
kelopak mata
Lingkungan pengujian juga jauh dari steril. Kami tidak dapat mengetahui apa yang dilakukan QuickTime Player, atau salah satu dari program lain yang terbuka.
chrishiestand
1

Saya yakin tidak ada jawaban yang tepat untuk ini. Itu sama dengan memori yang tetap aktif ketika Anda meletakkan Mac Anda untuk tidur, itu hanya tumbuh dan tumbuh dengan setiap tidur yang Anda buat.

Di sisi "menyenangkan" (alias mahal), Anda dapat meningkatkan memori Anda atau mengganti HDD dengan SSD, sehingga swapping tidak akan menjadi hit kinerja. Saya memilih opsi pertama, karena memori Corsair sekarang tersedia dengan harga yang wajar.

RAM 16GB


sumber
2
Perlu diingat SSD memiliki siklus tulis yang terbatas. Juga catat bahwa untuk SSD yang non-trim diaktifkan, penulisan pada akhirnya bisa mahal karena sel Flash harus dihapus.
Wavy Crab
Bisakah Anda mengutip sumber pada masalah "Tidur menyebabkan penggunaan memori meningkat"?
GordonM
Bisakah saya mengutip pengalaman saya? :) Saya melakukan pencarian cepat dan menemukan ini: diskusi.apple.com/message/21624847#21624847 + ada banyak topik yang berkaitan dengan memori tidak aktif tidak dihapus ketika diperlukan. Saya pribadi melihat bagaimana, setelah setiap tidur, memori tidak aktif tetap seperti sebelumnya dan meningkat. 'purge' adalah sebuah opsi, tetapi saya tidak ingin membersihkan memori yang tidak aktif setiap 20 menit (saya yakin ini akan terjadi dengan RAM 4 GiB).
1
@WavyCrab SSD mungkin memiliki siklus penulisan terbatas, tetapi tidak ada kemungkinan Anda akan mencapai batas itu. Saya tidak akan khawatir tentang itu, kecuali itu adalah SSD untuk Pusat Data. Dalam hal apa pun jika Anda akan menurunkan SSD dengan tulisan berlebihan, Anda akan menurunkan HDD lebih cepat.
andreadi