Membuat Linux read swap kembali ke memori

28

Kernel Linux menukar sebagian besar halaman dari memori ketika saya menjalankan aplikasi yang menggunakan sebagian besar memori fisik 16GB. Setelah aplikasi selesai, setiap tindakan (mengetik perintah, berpindah ruang kerja, membuka halaman web baru, dll.) Membutuhkan waktu sangat lama untuk diselesaikan karena halaman yang relevan terlebih dahulu harus dibaca kembali dari swap.

Apakah ada cara untuk memberitahu kernel Linux untuk menyalin halaman dari swap kembali ke memori fisik tanpa menyentuh secara manual (dan menunggu) setiap aplikasi? Saya menjalankan banyak aplikasi sehingga menunggu selalu menyakitkan.

Saya sering menggunakan swapoff -a && swapon -auntuk membuat sistem responsif lagi, tetapi ini membersihkan halaman dari swap, jadi mereka perlu ditulis lagi saat berikutnya saya menjalankan skrip.

Apakah ada antarmuka kernel, mungkin menggunakan sysfs, untuk menginstruksikan kernel untuk membaca semua halaman dari swap?

Sunting: Saya memang mencari cara untuk membuat semua swap swapcached. (Terima kasih derobert!)

[PS serverfault.com/questions/153946/… dan serverfault.com/questions/100448/... adalah topik terkait tetapi tidak menjawab pertanyaan tentang bagaimana membuat kernel Linux untuk menyalin halaman dari menukar kembali ke dalam memori tanpa menghapus swap.]

drrossum
sumber
Anda ingin semua swap menjadi cache dari memori sistem? Jadi Anda menginginkan gambar dari memori sistem yang dapat Anda muat ulang sesuka hati? Ini pada dasarnya cara kerja hibernasi - sistem memotret memorinya ke disk, mati, dan mengembalikan gambar saat dihidupkan. Apakah ada kemungkinan, menurut Anda, bahwa pada permintaan yang mengikuti utas itu mungkin bermanfaat bagi Anda? Misalnya, jika Anda ingin memotret memori Anda, nonaktifkan swap, selesaikan tugas, lalu kembalikan gambar dan ulangi - apakah itu sesuatu yang mungkin ingin Anda lakukan?
mikeserv
Saya tidak berpikir ini akan meninggalkan swap dalam keadaan swapcached. Karena itu menurut saya saran Anda adalah alternatif untuk metode swapoff-swapon.
drrossum
Tidak, itu tidak men-cache swap (yang, memang, agak aneh bagi saya) itu cache RAM di beberapa titik yang Anda anggap paling integral, kemudian mencurahkan seluruh memori sistem untuk beberapa tugas intensif sebelum mengembalikan cache ketika tugas selesai. Jika menukar selama tugas intensif adalah yang Anda inginkan maka Anda hanya akan memperlambat tugas tersebut - Anda akan perlu waktu ekstra untuk menukar halaman saat Anda melanjutkan.
mikeserv

Jawaban:

4

Berdasarkan program memdump awalnya ditemukan di sini saya telah membuat skrip untuk secara selektif membaca aplikasi yang ditentukan kembali ke memori. remember:

#!/bin/bash
declare -A Q
for i in "$@"; do
    E=$(readlink /proc/$i/exe);
    if [ -z "$E" ]; then.
        #echo skipped $i;.
        continue;.
    fi
    if echo $E | grep -qF memdump; then.
        #echo skipped $i >&2;.
        continue;.
    fi
    if [ -n "${Q[${E}]}" ]; then.
        #echo already $i >&2;.
        continue;.
    fi
    echo "$i $E" >&2
    memdump $i 2> /dev/null
    Q[$E]=$i
done | pv -c -i 2 > /dev/null

Penggunaan: sesuatu seperti

# ./remember $(< /mnt/cgroup/tasks )
1 /sbin/init
882 /bin/bash
1301 /usr/bin/hexchat
...
2.21GiB 0:00:02 [ 1.1GiB/s] [  <=>     ]
...
6838 /sbin/agetty
11.6GiB 0:00:10 [1.16GiB/s] [      <=> ]
...
23.7GiB 0:00:38 [ 637MiB/s] [   <=>    ]
# 

Dengan cepat melompati memori non-swapped (gigabytes per detik) dan melambat saat diperlukan swap.

Vi.
sumber
Alat ini melakukan persis apa yang saya cari. Terima kasih!
drrossum
Satu hal yang menyenangkan adalah bahwa, dari pengamatan saya, halaman yang ditukar disalin dalam RAM, tetapi mereka tidak dihapus dari swap (setidaknya, kebanyakan dari mereka tidak, karena penggunaan swap hanya berkurang sedikit). Interpretasi saya adalah bahwa Linux menyimpan dua salinan dari setiap halaman, satu di RAM dan satu di swap. Jika ini ditangani dengan benar, itu bahkan lebih baik daripada membatalkan dan menambahkan swap lagi, karena itu berarti, ketika halaman ganda harus ditukar lagi, tidak perlu ada salinan lain. Terima kasih kepada pakar kernel yang dapat mengonfirmasi.
Giovanni Mascellani
11

Mungkin membantu untuk meningkatkan /proc/sys/vm/page-cluster(default: 3).

Dari dokumentasi kernel ( sysctl/vm.txt):

halaman-cluster

page-cluster mengontrol jumlah halaman hingga halaman yang dibaca berturut-turut dari swap dalam satu upaya. Ini adalah swap rekanan swap dari mitra ke halaman. Consecutivity yang disebutkan bukan dalam hal alamat virtual / fisik, tetapi berturut-turut pada ruang swap - itu berarti mereka ditukar bersama.

Ini adalah nilai logaritmik - pengaturan ke nol berarti "1 halaman", mengatur ke 1 berarti "2 halaman", mengaturnya menjadi 2 berarti "4 halaman", dll. Nol menonaktifkan swap readahead sepenuhnya.

Nilai default adalah tiga (delapan halaman sekaligus). Mungkin ada beberapa manfaat kecil dalam menyetel ini ke nilai yang berbeda jika beban kerja Anda intensif untuk swap.

Nilai yang lebih rendah berarti latensi yang lebih rendah untuk kesalahan awal, tetapi pada saat yang sama kesalahan tambahan dan penundaan I / O untuk mengikuti kesalahan jika mereka akan menjadi bagian dari halaman berturut-turut yang akan dibawa oleh readahead.

Dokumentasi tidak menyebutkan batas, jadi mungkin Anda bisa mengatur ini sangat tinggi untuk membuat semua swap dibaca kembali segera. Dan tentu saja mengubahnya kembali menjadi nilai waras setelahnya.

derobert
sumber
Ini terdengar seperti solusi yang berguna. Dua intervensi manual dapat dikombinasikan dengan perintah tidur untuk menjadikannya intervensi pengguna tunggal. Tapi, itu mungkin tidak perlu membuat semua swap swapcached sangat cepat karena hanya membaca secara berurutan dari halaman yang diakses. Namun, ini solusi terbaik. Terima kasih!
drrossum
tbh ini mungkin solusi terbaik yang akan Anda dapatkan. Saya belum pernah mendengarnya sebelumnya tetapi sepertinya swap-in menjadi serangkaian IOP besar daripada serangkaian IOP kecil terus menerus yang mungkin yang menyebabkan masalah kinerja Anda. Saya akan terkejut secara sah jika ada sesuatu yang secara sempurna mengatasi situasi pribadi Anda.
Bratchley
Dalam hal ini, jika Anda mengalami pelambatan karena banyak swap-in kecil berturut-turut, bahkan hanya menyesuaikan page-clusternilai secara permanen dapat meningkatkan kinerja.
Ilmari Karonen
5

Anda dapat mencoba menambahkan program yang paling Anda pedulikan ke grup dan menyelaraskan swappiness sehingga saat berikutnya aplikasi menjalankan program yang Anda tambahkan cenderung menjadi kandidat untuk bertukar.

Beberapa halaman mereka kemungkinan masih akan ditukar tetapi mungkin mengatasi masalah kinerja Anda. Sebagian besar itu mungkin hanya perilaku "berhenti dan mulai" ketika banyak halaman program dalam swap dan program harus terus-menerus berhenti untuk menukar halaman-halamannya ke dalam RAM tetapi hanya dalam peningkatan 4k.

Sebagai alternatif, Anda dapat menambahkan aplikasi yang berjalan ke grup dan menyelaraskan swappiness sehingga aplikasi tersebut adalah yang cenderung menggunakan file swap paling banyak. Ini akan memperlambat aplikasi tetapi akan mengampuni sisa sistem.

Bratchley
sumber
4

Sepertinya saya bahwa Anda tidak bisa secara ajaib "membuat sistem responsif lagi". Anda bisa dikenakan penalti atau membaca kembali halaman dari ruang swap ke memori sekarang atau Anda dikenakan kemudian, tetapi satu atau lain cara Anda dikenakan. Memang, jika Anda melakukan sesuatu seperti swapoff -a && swapon -aitu, Anda mungkin merasa lebih sakit daripada kurang, karena Anda memaksa beberapa halaman untuk disalin kembali ke memori yang seharusnya tidak pernah diperlukan lagi dan akhirnya jatuh tanpa dibaca (pikirkan: Anda keluar dari aplikasi sementara banyak tumpukannya yang ditukar; halaman-halaman itu dapat dibuang sama sekali tanpa pernah dibaca kembali ke memori).

tapi ini membersihkan halaman dari swap, jadi mereka perlu ditulis lagi saat berikutnya saya menjalankan skrip.

Yah, hampir semua halaman yang disalin kembali dari swap ke memori utama akan segera dimodifikasi, jadi jika perlu dipindahkan kembali untuk bertukar lagi di masa depan, itu harus ditulis lagi di swap. Perlu diingat bahwa swap sebagian besar adalah tumpukan memori, bukan hanya-baca halaman (yang biasanya didukung file).

Saya pikir swapoff -a && swapon -atrik Anda sama bagusnya dengan apa pun yang bisa Anda dapatkan.

Celada
sumber
Kami berdua mengatakan hal yang persis sama pada saat yang sama;)
goldilocks
@goldilocks ya, saya melihat jawaban Anda muncul sebelum jawaban saya sudah siap, tetapi saya sudah so selesai jadi saya terjebak dengannya :-)
Celada
Anda dan goldilocks mengatakan hal yang sama, tetapi saya tidak percaya ini adalah cara kerja cache caching. Pemahaman saya adalah bahwa Anda dapat memiliki halaman di swap DAN memori pada saat yang sama. Halaman swap hanya menjadi tidak valid setelah halaman dalam memori diperbarui.
drrossum
Saya percaya bahwa jawaban yang Anda maksudkan oleh David Spillett benar: Anda memang dapat memiliki halaman dalam swap dan RAM pada saat yang sama ... tetapi hanya sampai versi RAM diubah. Maka Anda harus membuang salinan yang kedaluwarsa dalam swap. Ketika saya mengatakan "hampir semua halaman yang akan disalin kembali dari swap [...] akan segera dimodifikasi" yang saya maksudkan adalah saya berharap bahwa inilah yang terjadi sebagian besar waktu, jadi saya tidak mengharapkan halaman di kedua tempat menjadi bagian penting yang perlu dikhawatirkan.
Celada
Skenario penggunaan Anda mungkin berbeda: Anda mungkin memiliki banyak aplikasi dengan tumpukan besar yang sering dibaca dan tidak ditulis. Perasaan saya adalah bahwa kebanyakan orang tidak memiliki skenario seperti itu. Tetapi jika Anda melakukannya, saya kira Anda benar: swapoff -a && swapon -atidak akan baik untuk Anda. Saya kira dalam hal ini Anda akan memerlukan sesuatu yang memindai /proc/<each-process>/memdan membaca setiap halaman memori untuk memastikan itu ada di RAM. Tidak tahu apakah itu ada.
Celada
0

Ada diskusi yang sangat bagus di sini http://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that yang bermuara pada penurunan swappiness, dengan gagasan bahwa untuk meningkatkan respon yang dirasakan sistem seseorang harus mencegah pertukaran kode (dan inilah yang terjadi). Ini sebenarnya bukan jawaban untuk pertanyaan Anda, tetapi ini dapat mencegah masalah muncul (aplikasi Anda tidak ditukar, hanya data yang tidak digunakan dan cache halaman)

Fedxa
sumber
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
slm