Linux: bagaimana cara eksplisit membuka semua yang mungkin secara eksplisit?


59

Saya telah meluncurkan sesuatu yang menghabiskan banyak memori dan sekarang semuanya sangat terlambat. Saya kira memori semua aplikasi telah beralih untuk mengosongkan beberapa ruang untuk proses intensif-memori, dan sekarang semuanya perlahan-lahan kembali ke RAM ketika diakses.

Apakah ada cara untuk secara eksplisit memindahkan segala yang mungkin dari menukar kembali ke RAM? Atau mungkin tidak semuanya, tetapi hanya beberapa proses data tertentu?

Jawaban:


59

Saya akan merekomendasikan memungkinkan swap kontrol memori Linux normal dalam hal-hal yang benar-benar digunakan, seperti yang digunakan.

Satu-satunya hal yang bisa saya pikirkan adalah mematikan swap, lalu nyalakan lagi

sudo swapoff -a
sudo swapon -a

Itu mengasumsikan Anda memiliki memori fisik cadangan yang cukup untuk menampung semua yang ada di swap ...


4
Ini bekerja, sangat lambat :) Terima kasih! Tapi tetap saja saya percaya ada solusi yang lebih elegan :)
kolypto

7
Hati-hati dengan solusi ini, itu akan mengambil segalanya dari swap secara paksa ... jika tidak sesuai dengan memori fisik, kernel akan memulai pembunuh OOM yang mematikan. Saya tidak tahu ada yang bagus "cobalah untuk memindahkan semuanya ke RAM, tetapi gagal dengan anggun jika tidak memungkinkan" perintah.
Juliano

1
Saya sudah mencobanya dan ternyata bekerja sangat lambat. Jadi dimungkinkan untuk memantau RAM gratis dan mematikan swapoffjika memori hampir habis: dalam hal ini, ruang swap akan tetap berfungsi :)
kolypto

2
Saya tidak yakin membunuh swapoff akan benar-benar menghentikan operasi. Tergantung bagaimana itu diterapkan.
Douglas Leeder

3
Tampaknya perintah swapoff melakukan sesuatu seperti "jangan izinkan penulisan baru untuk ditukar" sementara proses lain yang sedang berjalan (yang dulu / sedang menggunakan swap) masih dapat "melepaskan swap". Ini mungkin mengapa tampaknya berjalan sangat lambat. Tampaknya tidak menyebabkan OOM seperti yang dikatakan orang lain (saya menggunakan Ubuntu Bionic) - kemungkinan hanya akan menjadi kasus jika "proses tambahan (atau yang sudah ada) mulai menggunakan memori baru" (yaitu OOM nyata). Jadi semuanya swapoff / swapon adalah solusi yang bagus sepertinya. Lembut / mantap. Ini mengasumsikan bahwa Anda tidak memulai lebih banyak memori menggunakan proses (atau meningkatkan konsumsi dalam menjalankan yang).
Roel Van de Paar

13

Anda dapat menyetelnya menggemakan beberapa angka antara 0 hingga 100 menjadi /proc/sys/vm/swappiness.

Kontrol ini digunakan untuk menentukan seberapa agresif kernel akan menukar halaman memori. Nilai yang lebih tinggi akan meningkatkan agresivitas, nilai yang lebih rendah mengurangi jumlah swap . Nilai 0 menginstruksikan kernel untuk tidak memulai swap sampai jumlah halaman gratis dan file-didukung kurang dari tanda air tinggi di zona.

Nilai default adalah 60.


13
Jangan menggunakan / proc / sys secara langsung, gunakan sysctlperintah sebagai gantinya. Dalam hal ini, ya sysctl vm.swappiness=x.
Juliano

7
Saya tidak berpikir bahkan swappiness of zero akan menyebabkan halaman yang sudah ditukar secara eksplisit dibawa ke memori utama?
Douglas Leeder

1
@ Douglas benar. vm.swappiness terutama akan mengontrol keputusan apakah memindahkan barang untuk ditukar atau mengurangi jumlah cache dan buffer ketika memori diminta.
Juliano

@Juliano, mengapa / proc / sys tidak digunakan?
James

@James Karena / proc / sys adalah antarmuka level yang lebih rendah yang digunakan untuk mengubah dan menanyakan konfigurasi kernel (ini adalah "detail implementasi"). Linux menyediakan sysctlperintah tingkat tinggi untuk interaksi pengguna. Hasil akhirnya adalah sama, tetapi biasanya antarmuka tingkat yang lebih tinggi lebih disukai bagi pengguna untuk berinteraksi secara langsung. Agak suka menghidupkan mesin dengan hubungan arus pendek kabel pengapian (level bawah) alih-alih hanya memutar kunci (level lebih tinggi).
Juliano

5

Linux melakukan pekerjaan yang baik dalam mengelola memori dan Anda seharusnya tidak menghalangi jalannya. Pengaturan vm.swappiness (disebutkan sebelumnya) tidak menghalangi. Anda lebih mungkin mengalami masalah aneh melakukan hal-hal dengan cara lain.

Apa yang Anda luncurkan yang begitu haus akan ingatan? Bisakah itu disetel? Jika tidak memiliki arahan batas memori sendiri, Anda dapat melihat ulimit juga.


Dalam kasus saya itu convert -density 200 file.pdf jpegs/file.jpg. Untuk beberapa alasan ia menggunakan banyak memori, tetapi Anda benar: itu dapat disetel. Pokoknya, situasinya mungkin dengan aplikasi apa pun :)
kolypto

1
Saya setuju dengan jawaban ini - Anda mungkin harus meninggalkan operasi normal pada mesin untuk menukar apa yang sebenarnya dibutuhkan.
Douglas Leeder

convertmemiliki -limitargumen untuk mengontrol penggunaan memori vs. penggunaan disk, dan Anda harus membacanya. Pengaturan -limit memory 512MBatau sejenisnya akan baik. Mungkin juga baik untuk menentukan MAGICK_TEMPORARY_PATH eksplisit dan membersihkannya setelah perintah Anda selesai.
slacy

3

Jika Anda memiliki memori yang tersedia untuk semua aplikasi Anda, tidak apa-apa untuk mengatur swappiness ke 0 sehingga hal-hal tidak akan swap keluar. Sebagai contoh, qemu-kvm adalah target besar VMM untuk ditukar, karena "tampaknya" hampir tidak digunakan sepanjang waktu. Saya telah melihat hingga 80% dari memori memori qemu-kvm ditulis untuk swap. VM yang berjalan di qemu-kvm akan menjadi hampir tidak responsif karena mereka kehabisan swap (meskipun tamu tidak tahu ini sedang terjadi). VM tamu akan berpikir itu berkinerja paling baik, meskipun sebenarnya sangat menyeret. Ketika saya sekelompok VM "bangun" dan mulai melakukan hal-hal, itu dapat melonjak rata-rata beban hingga lebih dari 30, bahkan pada perangkat keras kelas perusahaan dengan memori dan disk yang cukup cepat. Saya kira ini adalah kegagalan dalam desain qemu-kvm out-of-the-box.

Semoga ini bisa membantu seseorang.


Saya khawatir ini tidak cukup akurat.
Marc.2377

2

Saya akan menyarankan untuk tidak memikirkan VM subsistem dalam kernel. Sangat tidak mungkin bahwa Anda benar-benar memiliki informasi yang cukup untuk membuat keputusan yang lebih baik daripada yang seharusnya. Dan jika Anda memaksanya untuk melakukan hal yang salah, maka Anda hanya akan membuat segalanya lebih lambat.


9
Ada beberapa kasus di mana saya ingin melakukan apa yang diinginkan OP. Jika saya secara tidak sengaja membiarkan suatu proses menjalankan kerusuhan dan mengambil semua RAM + swap saya, maka saya dapat menunggu 15 detik setiap kali saya mengganti aplikasi agar memorinya keluar dari swap atau memaksanya dan menjalankan semuanya secepat yang biasa.
Alex

Yah ... Saya ingin "membuka" terjadi selama rehat kopi saya, tidak setiap kali saya mencoba untuk beralih aplikasi. Apakah itu "out-thinking the subsistem VM" ketika saya ingin menginformasikannya tentang coffee break yang menghambat?
Klaws

1

Jika Anda dapat mem-boot ulang sistem yang seharusnya melakukannya (dan mungkin membutuhkan waktu jauh lebih sedikit daripada mencoba solusi lain).


1

Untuk menyalin jawaban saya dari pertanyaan ini .

Agar Anda tahu bagaimana swappiness merdu bekerja. Ini berfungsi dengan memberi tahu subsistem VM untuk mencari halaman yang akan ditukar ketika% memori dipetakan untuk memproses tabel halaman + nilai swappiness> 100. Jadi pengaturan 60 akan menyebabkan sistem mulai membuka halaman basi dari tabel halaman proses ketika menggunakan lebih dari 40% memori sistem Anda. Jika Anda ingin mengizinkan program Anda menggunakan lebih banyak memori dengan mengorbankan cache Anda ingin menurunkan nilai swappiness.


Saya tidak berpikir memori program vs. cache adalah masalah di sini - saya pikir itu memori aplikasi vs. memori yang tidak digunakan. Dan saya tidak berpikir swappiness akan memengaruhi itu.
Douglas Leeder

0

Apakah prosesnya masih berjalan? Buka terminal dan lihat apakah Anda dapat melihat proses yang diluncurkan. (ps aux | grep processname mungkin membuatnya sedikit lebih mudah) Gunakan kill -9 PID untuk mematikannya jika masih berjalan. Berhati-hatilah dengan apa yang Anda bunuh. Jika Anda tidak tahu apa prosesnya, jangan bunuh itu! Juga, posting output -m gratis sehingga kita dapat melihat apakah Anda benar-benar masih menggunakan banyak swap.

Jika semuanya masih berjalan lambat, Anda mungkin masih memiliki apa pun yang Anda jalankan masih berjalan. Saya tidak akan pernah mematikan swap kecuali Anda benar-benar tahu apa yang Anda lakukan atau Anda suka hidup di tepi. =)


0

Saya percaya bahwa tidak ada cara yang benar-benar baik untuk memaksa Linux melepaskan data dari disk ke memori. Ketika swapoff / swapon adalah solusi yang berfungsi, tetapi itu kotor dan mudah dapat membuat sistem Anda tidak stabil. Untuk kasus-kasus ketika Anda memiliki lebih banyak data dalam swap daripada memori bebas, akan sulit untuk membayangkan kebijakan efisien apa pun yang dapat diterapkan oleh Linux untuk memutuskan data mana yang akan dipindahkan ke memori dan data apa yang disimpan dalam disk.

Rangkuman: Biarkan Linux secara bertahap mengembalikan kinerjanya dengan cara normal. Subsistem VM-nya diatur sedemikian rupa sehingga berusaha dan terus-menerus pindah ke kondisi seimbang yang ideal.


-2

Mengosongkan cache buffer

Jika Anda ingin mengosongkannya, Anda dapat menggunakan rantai perintah ini.

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

Anda dapat memberi sinyal Kernel Linux untuk menjatuhkan berbagai aspek dari item yang di-cache dengan mengubah argumen numerik ke perintah di atas.

CATATAN: bersihkan memori dari hal-hal yang tidak perlu (Kernel 2.6.16 atau yang lebih baru). Selalu pastikan untuk menjalankan sinkronisasi terlebih dahulu untuk membersihkan hal-hal berguna ke disk !!!

  • Untuk membebaskan pagecache:

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • Untuk membebaskan gigi dan inode:

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • Untuk membebaskan pagecache, gigi palsu, dan inode:

    $ echo 3 > /proc/sys/vm/drop_caches
    

Di atas dimaksudkan untuk dijalankan sebagai root. Jika Anda mencoba melakukannya menggunakan sudo maka Anda perlu sedikit mengubah sintaks menjadi seperti ini:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.