Entah bagaimana saya menukar memori 14 GB. Setelah membunuh pelakunya, saya memiliki banyak memori bebas, jadi saya pikir saya bisa memasukkan data penting lagi. Jadi dengan 5 GB dari 32 GB yang digunakan dan 14 GB ruang swap yang digunakan, saya berlari swapoff -a
.... dan 4 jam kemudian sekitar setengah dari pekerjaan selesai.
Ini berarti kurang dari 1 MB / s, sementara saya dapat dengan mudah menyalin 200 MB / s. Swap saya dienkripsi tetapi begitu juga semua partisi normal dan dengan aes-ni itu tidak menyebabkan beban CPU yang nyata (dan mengisi ruang swap hanya membutuhkan waktu beberapa menit). Saya melihat bahwa tidak ada alasan khusus untuk mengoptimalkan swapoff
, namun saya bertanya-tanya bagaimana itu bisa menjadi lambat?
Hanya menambahkan beberapa data lagi: Memori utama saya adalah 32 GB dan saya memiliki ruang swap 32 GB di masing-masing dari 4 harddisk (pasti berlebihan, tapi siapa yang peduli?). Seluruh ruang swap dapat (didekripsi dan) dibaca dalam waktu kurang dari 5 menit:
time -p sudo sh -c 'for i in /dev/mapper/cryptswap?; do md5sum $i & done; wait'
014a2b7ef300e11094134785e1d882af /dev/mapper/cryptswap1
a6d8ef09203c1d8d459109ff93b6627c /dev/mapper/cryptswap4
05aff81f8d276ddf07cf26619726a405 /dev/mapper/cryptswap3
e7f606449327b9a016e88d46049c0c9a /dev/mapper/cryptswap2
real 264.27
Membaca bagian dari partisi tidak bisa lebih lambat daripada membaca semuanya. Namun membaca sekitar 1/10 dari itu membutuhkan waktu sekitar 100 kali lebih lama.
Saya mengamati bahwa selama swapoff
kedua CPU sebagian besar idle (mungkin 10% dari satu inti) dan begitu pula disk ("diukur" oleh LED). Saya juga melihat bahwa ruang swap dimatikan satu demi satu.
iostat -d 5
menunjukkan IO rendah pada diskswapoff
juga?Jawaban:
Pertama, mari kita lihat apa yang dapat Anda harapkan dari hard drive Anda. Hard drive Anda dapat melakukan 200 MB / s secara berurutan . Ketika Anda mencari waktu, itu bisa menjadi jauh lebih lambat. Untuk mengambil contoh sewenang-wenang, lihat spesifikasi untuk salah satu disk 3TB modern Seagate, ST3000DM001 :
Kecepatan data berkelanjutan maksimum: 210 MB / s
Carilah rata-rata baca: <8,5 ms
Bytes per sektor: 4.096
Jika Anda tidak perlu mencari, dan jika swap Anda berada di dekat tepi disk, Anda dapat berharap untuk melihat hingga tingkat maksimum = 210 MB / s
Tetapi jika data swap Anda sepenuhnya terfragmentasi, dalam skenario terburuk, Anda harus mencari-cari untuk setiap sektor yang Anda baca. Itu berarti Anda hanya bisa membaca 4 KB setiap 8,5 ms, atau 4 KB / 0,0085 = 470 KB / s
Jadi langsung dari kelelawar, itu tidak terbayangkan bahwa Anda sebenarnya berlari melawan kecepatan hard drive.
Yang mengatakan, itu tampak konyol yang
swapoff
akan berjalan sangat lambat dan harus membaca halaman rusak, terutama jika mereka ditulis dengan cepat (yang menyiratkan in-order). Tapi itu mungkin saja cara kerja kernel. Laporan bug Ubuntu # 486666 membahas masalah yang sama:Salah satu balasan adalah:
Laporan bug ditutup tidak terselesaikan.
Buku Mel Gorman " Memahami Linux Virtual Memory Manager " agak ketinggalan zaman, tetapi setuju bahwa ini adalah operasi yang lambat:
Ada sedikit lebih banyak diskusi dari tahun 2007 tentang milis linux-kernel dengan subjek " mempercepat swapoff " - meskipun kecepatan yang mereka bahas ada sedikit lebih tinggi daripada yang Anda lihat.
Ini adalah pertanyaan menarik yang mungkin pada umumnya diabaikan, karena
swapoff
jarang digunakan. Saya berpikir bahwa jika Anda benar-benar ingin melacaknya, langkah pertama akan mencoba untuk menonton pola penggunaan disk Anda lebih hati-hati (mungkin denganatop
,iostat
atau bahkan alat-alat yang lebih kuat sepertiperf
atausystemtap
). Hal-hal yang harus dicari mungkin pencarian yang berlebihan, operasi I / O kecil, penulisan ulang yang konstan dan pergerakan data, dll.sumber
Saya telah mengalami masalah yang sama dengan laptop saya yang memiliki SSD sehingga mencari waktu seharusnya tidak menjadi masalah.
Saya menemukan penjelasan alternatif . Berikut ini kutipannya
Jadi ini adalah masalah kernel daripada yang lainnya.
sumber
swapoff
diimplementasikan. Ketika proses swapping out keluar, tidak butuh waktu lama.strace swapoff
yang cukup banyak melakukan panggilanswapoff
sistem.Yup,
swapoff
mekanismenya sangat tidak efisien. Solusinya mudah: beralih pada proses, alih-alih beralih ke halaman yang ditukar. Gunakan skrip python ini (saya tidak berafiliasi):Perhatikan bahwa mode operasi daemon hanya untuk desktop / laptop yang sering di-hibernasi. Saya tidak akan menjalankannya sebagai daemon pada sistem server - jalankan saja di latar depan, tunggu sampai ada laporan yang menangani beberapa proses kemudian hentikan dan coba:
Karena sebagian besar halaman sekarang hadir baik dalam swap dan dalam memori,
swapoff
sangat sedikit yang harus dilakukan dan sekarang harus sangat cepat (saya melihat ratusan MB / s).Bagian sejarah di depan
Script python tersebut didasarkan pada sisa dari jawaban ini, yang pada gilirannya adalah peningkatan saya dari jawaban yang lebih tua ini yang ditulis oleh jlong . Karena skripnya jauh lebih aman, saya sarankan untuk hanya mencoba sisa jawaban saya sebagai baris pertahanan terakhir :
Ini berjalan mungkin 2 detik dan tidak akan benar-benar melakukan apa-apa, cukup daftarkan 10 segmen memori teratas (sebenarnya ia mencetak lebih banyak satu-liner; ya saya memang suka satu-liner; cukup periksa perintah, terima risiko, salin dan tempel ke shell Anda; ini sebenarnya akan dibaca dari swap).
Satu-liner utama aman (untuk saya), kecuali membaca banyak / proc.
Sub-perintah yang disiapkan untuk ujian manual Anda tidak aman . Setiap perintah akan menggantung satu proses selama membaca segmen memori dari swap. Jadi tidak aman dengan proses yang tidak mentolerir jeda. Kecepatan transfer yang saya lihat berada di urutan 1 gigabyte per menit. (Skrip python tersebut menghilangkan kekurangan itu).
Bahaya lain adalah terlalu banyak tekanan memori pada sistem, jadi periksalah seperti biasa
free -m
Apa fungsinya?
Output dari skrip perl ini adalah serangkaian
gdb
perintahdump memory (range)
yang memanggil halaman yang ditukar ke memori.Output dimulai dengan ukuran, jadi cukup mudah untuk melewatinya
| sort -Vr | head
untuk mendapatkan 10 segmen terbesar berdasarkan ukuran (SSIZE). The-V
berdiri untuk menyortir versi-nomor-cocok, tetapi bekerja untuk tujuan saya. Saya tidak dapat menemukan cara membuat pengurutan numerik berfungsi.sumber
sort -t = -k 2n
/proc/$pid/mem
, mencari, dan membaca secara langsung. Inilah PoC yang sebagian besar didasarkan pada cuplikan Anda: gist.github.com/WGH-/91260f6d65db88be2c847053c49be5ae Proses cara ini tidak dihentikan, AFAIK seharusnya tidak ada bahaya yang disebabkan oleh ini.Selama swapoff, jika slot swap yang digunakan terdeteksi, maka kernel pertama kali bertukar di halaman. Fungsi unuse_process () kemudian mencoba untuk menemukan semua entri tabel halaman yang sesuai dengan halaman yang baru saja ditukar dan membuat pembaruan yang diperlukan untuk tabel halaman. Pencarian ini sangat lengkap dan memakan waktu: mengunjungi setiap deskriptor memori (dari keseluruhan sistem) dan memeriksa entri tabel halamannya satu per satu.
Silakan lihat halaman 724 dari "Memahami versi Linux Kernel 3".
sumber