fstrim memangkas lebih dari setengah ukuran partisi meskipun partisi dipasang dengan discard

8

Ketika saya menginstal SSD saya, saya baru saja mount dengan discarddan tidak berkeringat. Namun hari ini saya membaca tentang pro dan kontra dari penggunaan fstrimdan memutuskan untuk menjalankan program untuk mendapatkan ide berapa lama sebenarnya (masih dengan partisi saya terpasang discard). Perintah itu memakan waktu beberapa menit pada partisi root dan home saya. Untuk partisi rumah saya, saya menggunakan -vdan mendapatkan ini:

$ sudo fstrim -v /home
/home: 137494052864 bytes were trimmed

Ini lebih dari jumlah ruang kosong di partisi!

$ df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       206G   78G  118G  40% /home

Proses selanjutnya selesai dalam waktu kurang dari satu detik, misalnya:

$ sudo fstrim -v /home
/home: 0 bytes were trimmed

Tentunya jika saya selalu memiliki partisi yang terpasang discard, fstrimbukankah seharusnya memangkas sejumlah besar data seperti itu? The discardopsi pasti diaktifkan, di sini adalah relevan fstabbaris:

UUID=xxxxxxxx...    /          ext4   noatime,discard,errors=remount-ro  0      1
UUID=xxxxxxxx...    /home      ext4   noatime,discard,errors=remount-ro  0      2

Dan mountjalur output:

/dev/disk/by-uuid/xxxxxxxx... on / type ext4 (rw,noatime,discard,errors=remount-ro,stripe=128,data=ordered)
/dev/sda2 on /home type ext4 (rw,noatime,discard,errors=remount-ro,stripe=128,data=ordered)

SSD adalah TOSHIBA THNSNS256GMCP. Mengapa ini terjadi?

Graeme
sumber

Jawaban:

12

Dua hal di sini:

  1. fstrimmemangkas semua data yang tidak terisi dalam filesystem (well, tidak benar-benar semua data, hanya blok data yang tidak dialokasikan, saya tidak berpikir bagian yang tidak terpakai dari tabel inode atau bagian dari blok yang tidak sepenuhnya digunakan adalah dipangkas), terlepas dari apakah discarddigunakan atau tidak. fstrimtidak dapat mengetahui blok mana yang tidak terisi telah "dipangkas" atau belum di masa lalu, tetapi itu (sebenarnya kernel, semua fstrimpekerjaan dilakukan di FITRIM ioctl) namun tetap melacak kelompok blok mana yang telah dipangkas dan tidak akan memotongnya lagi jika belum ada alokasi di grup blok itu sejak saat itu, kecuali jika Anda meminta FITRIM dengan panjang batas minimum yang lebih kecil (dari memeriksa kode ext4, mungkin berbeda untuk yang lain sistem file) yang menjelaskan mengapa Anda mendapatkan 0 pada menjalankan berikutnya.

    Perhatikan bahwa tidak ada salahnya memotong blok yang sudah dipangkas. Itu hanya memberitahu SSD lagi bahwa ia dapat melakukan apa pun yang diinginkannya (seperti menghapusnya sehingga dapat siap digunakan lagi untuk hal lain).

  2. Dalam dfoutput, nilai "tersedia" tidak memperhitungkan ruang yang "dicadangkan" untuk root, Anda akan melihat bahwa 206 - 76 adalah 130G, bukan 118G. 12G (sekitar 5%) dicadangkan. Lihat tunefs -muntuk mengubah berapa banyak yang dipesan.
Stéphane Chazelas
sumber
1
Jadi jika fstrimtidak tahu apa yang sudah dipangkas, mengapa ia melaporkan 0 byte untuk kedua kalinya? Tentunya ini harus berasal dari disk, tetapi mengapa ia melaporkan trim sebesar itu pertama kali? Tentunya disk akan agnostik untuk apakah discardatau trimtelah digunakan.
Graeme
1
@Graeme, argh, poin bagus. fstrim, gunakan FITRIM ioctl, dan ini adalah kernel yang melakukan semua pekerjaan dan melaporkan hasilnya ke fstrim. Saya kira kernel melacak apa yang sudah dipangkas, tetapi hanya bisa melakukan itu sejak boot. Akan menyelidiki dan memperbarui jawabannya.
Stéphane Chazelas
1
Ok, ya kernel harus melacak apa yang sudah dipangkas sejak boot. Jika saya reboot dan melakukan yang lain fstrim, saya mendapatkan output yang kira-kira sama.
Graeme
@ Greme, lihat edit saya.
Stéphane Chazelas
1
fstrimhanya mengeluarkan yang sesuai ioctl, yang lainnya adalah keputusan filesystem, dan filesystem berperilaku sangat berbeda. ext4mencoba untuk menghindari pemangkasan hal yang sama berulang-ulang, xfstidak peduli dan memotong semua yang gratis, orang lain dapat melakukan hal-hal lain - jika mereka bahkan mendukungnya sama sekali ... jika tidak dapat diprediksi, komplain ke filesystem.
frostschutz