Buang latar belakang pada partisi swap di Linux + SSD

11

Masalah

Saya ingin mengaktifkan operasi TRIM latar belakang pada partisi swap dalam disk SSD di Linux. Menurut beberapa artikel, misalnya yang ini , kernel mendeteksi konfigurasi ini dan secara otomatis melakukan operasi discard, tetapi pada pengujian saya tampaknya tidak berfungsi meskipun opsi "discard" mount digunakan untuk memaksakan perilaku ini.

Skenario

  • Debian Wheezy menjalankan Linux 3.2.0
  • Disk SSD: 1 x 120GB OCZ Vertex 3 MI
  • 2GB menukar partisi "biasa", tanpa lapisan lainnya (LVM, RAID, dll.)

Latar Belakang

Ini adalah langkah-langkah yang saya ikuti untuk memeriksa apakah latar belakang TRIM bekerja pada partisi swap:

  1. Dukungan TRIM : periksa apakah disk SSD mendukung perintah TRIM dan kernel menandai perangkat sebagai non-rotasi:

    # hdparm -I /dev/sda | grep TRIM
     * Data Set Management TRIM supported (limit 1 block)
     * Deterministic read data after TRIM
    
    # cat /sys/block/sda/queue/rotational
    0
    
  2. Ganti swap : pasang partisi, bersihkan semua cache VM dan konfigurasikan Linux untuk bertukar secara agresif dengan mengatur vm.swappiness ke 100. Kemudian, jalankan skrip yang mengalokasikan semua memori yang tersedia dan memaksa kernel untuk mulai bertukar:

    # swapon [--discard] /dev/sda2
    # echo 3 > /proc/sys/vm/drop_caches
    # echo 100 > /proc/sys/vm/swappiness
    # ./fill-up-memory.up
    

    Script menjalankan server dengan memori fisik 32GB + partisi swap 2GB dan membuat objek ~ 33.8GB dalam memori, itu cukup untuk mengisi semua memori dan mulai bertukar. Ini adalah contoh skrip yang mencapai perilaku ini:

    #!/usr/bin/python
    
    mem = 33.8
    testing = 'A' * int(1024 * 1024 * 1024 * mem)
    raw_input()
    
  3. Periksa konten swap : "swapon -s" menunjukkan bahwa 100% dari memori swap digunakan. Menggunakan "hdparm --read-sector" Saya memeriksa konten mentah dari sektor partisi swap dan semua byte diatur ke "4141", notasi heksadesimal yang sesuai untuk karakter "A", semuanya berfungsi seperti yang diharapkan. Ini adalah contoh skrip untuk membaca konten dari partisi swap sektor per sektor:

    #!/bin/bash
    
    for sector in `seq 194560 4100095` ; do
        hdparm --read-sector $sector /dev/sda
    done
    

CATATAN: Anda bisa mendapatkan sektor awal / akhir dari partisi swap menggunakan parted, cfdisk, dll.

Ketika saya menghentikan skrip, ia melepaskan semua memori termasuk alokasi swap, "swapon -s" tidak mengembalikan penggunaan swap dalam sistem. Pada titik ini, diharapkan bahwa Linux mulai membuang konten partisi swap di latar belakang, tetapi tidak berfungsi , konten sektor ini masih "4141", bahkan beberapa jam kemudian.

Saya telah melakukan beberapa tes dan sepertinya Linux hanya melakukan discard penuh ketika partisi diaktifkan menggunakan swapon()system call, tetapi tidak pernah di latar belakang, meskipun opsi mount "discard" diaktifkan di / etc / fstab.

Penelitian lebih lanjut: blkdev_issue_discard () adalah fungsi kernel yang bertugas mengirim perintah TRIM ke perangkat SSD yang mendasarinya, ada dua referensi unik untuk fungsi ini pada mm/swapfile.c:

  • discard_swap() itu disebut selama proses swapon (), jika opsi mount “discard” diaktifkan, ia membuang semua konten, ini berfungsi seperti yang diharapkan.
  • discard_swap_cluster() itu harus membuang konten swap cluster, tetapi tampaknya itu tidak pernah melakukan perintah TRIM.

Pertanyaan: apa perilaku yang diharapkan dari Linux pada perangkat swap + SSD? Itu harus membuang semua sektor bebas / halaman atau hanya mengeluarkan full-discard awal ketika partisi diaktifkan selama proses boot up? Terima kasih.

santisaez
sumber
4
Apa gunanya? RAM murah, karena Anda cukup membuktikan dengan memiliki 32 yang besar di server Anda. Matikan Swap, gunakan SSD Anda untuk sesuatu yang bermanfaat, dan berhentilah melakukan sesuatu.
Tom O'Connor
3
Swap tidak dapat dinonaktifkan pada server-server itu dan mereka memiliki disk SSD yang unik, tidak ada opsi untuk meng-host partisi swap pada HDD tradisional. Saya sadar bahwa menempatkan swap pada disk SSD bukanlah pilihan terbaik, tetapi saya bertanya-tanya apakah saya dapat mencapai perilaku ext4 "discard" yang sama pada partisi swap, untuk meningkatkan kinerja disk sebanyak mungkin.
santisaez
2
Ini BENAR-BENAR terdengar seperti kasus optimasi prematur.
MikeyB
"Komentar hanya dapat diedit selama 5 menit" - melayani saya saat berada di SF saat bekerja .... seperti yang saya katakan; @ MikeyB Sebenarnya, saya sudah membaca tentang ini. Artikel wikipedia menyebutkan sesuatu yang tidak saya sadari. "Karena sifat operasi memori flash, data tidak dapat ditimpa secara langsung seperti dalam hard disk drive." Jadi masuk akal bahwa blok yang sebelumnya digunakan dalam swap akan kosong .... tetapi akankah mereka terlihat seperti "0000" ketika santisaez memeriksa konten swap?
Signal15
Itu semua terjadi pada lapisan di bawah sistem operasi. Sejauh menyangkut OS, data di blok ada sampai ditulis ulang. Adalah tanggung jawab drive untuk menangani siklus baca-hapus-tulis.
MikeyB

Jawaban:

1

Tampaknya discard_swap_cluster hanya dipanggil dari scan_swap_map yang pada gilirannya dipanggil dari get_swap_page atau get_swap_page_of_type . Jadi jika saya benar, membuang hanya terjadi ketika halaman swap baru akan dialokasikan, bukan ketika halaman dibebaskan.

lav
sumber
Itu terdengar seperti bug.
kasperd
2
Itu mungkin bukan bug. Dengan cara ini linux dapat membuang banyak halaman sekaligus alih-alih melakukannya satu per satu.
lav
1

Bisa jadi sistem Anda memiliki --discard=oncedefault. Sudahkah Anda mencoba memasang dengan opsi buangan tertentu?

# nano /etc/fstab
________________________________________________________________
...
/dev/sda2    none    swap    ..., --discard=pages,...    ...
...

dan memaksa seperti ini:

# swapon --discard=pages /dev/sda2

Anda juga dapat mencoba membuat fstrimlayanan, atau mengonfigurasinya jika sudah tersedia.

kgizdov
sumber
-1

Ketika saya menghentikan skrip, ia melepaskan semua memori termasuk alokasi swap, "swapon -s" tidak mengembalikan penggunaan swap dalam sistem. Pada titik ini, diharapkan bahwa Linux mulai membuang konten partisi swap di latar belakang, tetapi tidak berfungsi , konten sektor ini masih "4141", bahkan beberapa jam kemudian.

Isi swap secara efektif dibuang "ketika swapon -smengembalikan" tidak ada swap digunakan ". Sistem tidak akan menimpa isi blok (diisi dengan" 4141 ") karena merupakan SSD dan penulisan yang berlebihan akan mempersingkat masa pakai SSD. (Setidaknya, itulah yang saya ambil dari dokumentasi)

Sinyal15
sumber
5
Jika discardopsi mount digunakan, perintah TRIM harus dikirim ke solid-state drive yang mendasarinya untuk menghindari masalah penulisan amplifikasi pada disk SSD. Setidaknya, ini adalah cara di mana filesystem lain, seperti ext4.
santisaez
Untuk menjadi jelas, itu memang akan menghasilkan membaca hanya nol dengan perintah hdparm, tetapi hanya setelah pengumpul sampah SSD memiliki kesempatan untuk menjalankan ..
Halfgaar