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.