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:
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
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()
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.
Jawaban:
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.
sumber
Bisa jadi sistem Anda memiliki
--discard=once
default. Sudahkah Anda mencoba memasang dengan opsi buangan tertentu?dan memaksa seperti ini:
# swapon --discard=pages /dev/sda2
Anda juga dapat mencoba membuat
fstrim
layanan, atau mengonfigurasinya jika sudah tersedia.sumber
Isi swap secara efektif dibuang "ketika
swapon -s
mengembalikan" 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)sumber
discard
opsi 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.