Bagaimana cara meng-cache atau mempercepat ringkasan `du`?

33

Kami memiliki sistem file besar di mana duringkasan (penggunaan disk) penuh memakan waktu lebih dari dua menit. Saya ingin menemukan cara untuk mempercepat ringkasan penggunaan disk untuk direktori arbitrer pada sistem file itu.

Untuk cabang-cabang kecil saya perhatikan bahwa duhasilnya tampaknya di-cache entah bagaimana, karena permintaan ulang jauh lebih cepat, tetapi pada cabang-cabang besar kecepatan menjadi diabaikan.

Apakah ada cara sederhana untuk mempercepat du, atau hasil cache yang lebih agresif untuk cabang yang belum dimodifikasi sejak pencarian sebelumnya?

Atau adakah perintah alternatif yang dapat memberikan ringkasan penggunaan disk lebih cepat?

Ian Mackinnon
sumber
8
Dua menit sepertinya tidak lama bagi saya. Tetapi pertanyaan sebenarnya adalah: "Apakah Anda benar-benar ingin du melakukan cache sesuatu?" Bukankah du seharusnya memberi Anda jumlah blok disk nyata, tepat saat ini mungkin?
Bruce Ediger
Saya setuju bahwa mengganti duakan menjadi buruk, tetapi skrip pembungkus yang lebih cepat dengan antarmuka yang identik akan sangat berguna bagi kami. Lebih lanjut, saya akan berharap bahwa hasil caching tergantung pada waktu yang dimodifikasi terakhir (dan dengan asumsi tidak ada operasi disk-lebar, misalnya defragmentasi) akan memberikan hasil ukuran yang tepat: apakah saya kehilangan sesuatu?
Ian Mackinnon
2
Jika Anda khawatir tentang terlalu banyak penggunaan disk, Anda mungkin mempertimbangkan untuk menerapkan kuota.
pyasi
2
Bruce - Anda bisa menanyakan pertanyaan yang sama tentang find. Tapi kemudian ada locate.
Yuval
Jika Anda menggunakan Android , lihat StatFsperkiraan ukuran direktori super cepat. Itu hampir 1000x lebih cepat untuk direktori besar dan kompleks, dibandingkan dengan du.
Joshua Pinter

Jawaban:

21

Apa yang Anda lihat ketika Anda menjalankan kembali perintah du adalah efek buffering disk. Setelah Anda membaca blok, buffer disknya disimpan di cache buffer hingga blok itu diperlukan. Untuk du Anda perlu membaca direktori dan inode untuk setiap file di direktori. Hasil du tidak di-cache dalam kasus ini, tetapi dapat diturunkan dengan IO disk yang jauh lebih sedikit.

Meskipun dimungkinkan untuk memaksa sistem untuk menyimpan informasi ini, kinerja keseluruhan akan berkurang karena ruang buffer yang diperlukan tidak akan tersedia untuk file yang diakses secara aktif.

Direktori itu sendiri tidak tahu seberapa besar suatu file, sehingga setiap inode file perlu diakses. Untuk menjaga agar nilai cache di-up to date setiap kali file berubah ukuran, nilai yang di-cache perlu diperbarui. Karena sebuah file dapat dicantumkan dalam 0 atau lebih direktori, ini membutuhkan setiap inode file untuk mengetahui direktori mana yang terdaftar. Ini akan sangat menyulitkan struktur inode dan mengurangi kinerja IO. Juga karena du memungkinkan Anda untuk mendapatkan hasil dengan asumsi ukuran blok yang berbeda, data yang diperlukan dalam cache perlu menambah atau mengurangi nilai yang di-cache untuk setiap ukuran blok yang mungkin semakin memperlambat kinerja.

BillThor
sumber
7

Jika Anda dapat mengatur hierarki file yang berbeda untuk menjadi milik grup yang berbeda, Anda dapat mengatur kuota disk . Jangan berikan batas atas (atau jadikan ukuran disk) kecuali Anda menginginkannya. Anda masih dapat mengetahui secara instan berapa banyak kuota (efektif tak terbatas) yang digunakan grup.

Ini memang mengharuskan sistem file Anda mendukung kuota per-grup. Ext Linux [234] dan Solaris / * BSD / Linux's zfs lakukan. Akan lebih baik untuk kasus penggunaan Anda jika kuota grup memperhitungkan ACL, tapi saya rasa tidak.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
7

Penggunaan umum dudapat sangat dipercepat dengan menggunakan ncdu.

ncdu - NCurses Disk Usage

melakukan du, cache hasil dan menunjukkannya dalam gui baris perintah yang bagus, agak sebanding dengan du -hc -d 1 | sort -h. Pengindeksan awal memakan waktu yang sama du, tetapi mencari "pelakunya" yang mengisi ruang berharga dipercepat, karena semua subdirektori memiliki informasi cache yang awalnya di-cache tersedia.

Jika subdirektori yang diperlukan dapat di-refresh dengan menekan [r] dan file / folder dapat dihapus dengan menekan [d], yang keduanya memperbarui statistik untuk semua direktori induk. Penghapusan meminta konfirmasi.

Jika perlu, percepatan lebih lanjut dapat dicapai dengan berkhotbah ncdu -1xo- / | gzip >export.gzdi cronjob dan kemudian mengaksesnya zcat export.gz | ncdu -f-, tetapi jelas memberikan informasi yang lebih usang.

DennisH
sumber
7

Saya lebih suka menggunakan agedu

Agedu adalah bagian dari perangkat lunak yang mencoba mencari file yang lama dan tidak digunakan dengan anggapan bahwa file-file ini kemungkinan besar tidak diinginkan. (mis. Unduhan yang hanya dilihat sekali.)

Ini pada dasarnya melakukan pemindaian disk yang sama du, tetapi juga mencatat waktu akses terakhir dari semua yang dipindai. Kemudian ia membangun indeks yang memungkinkannya secara efisien menghasilkan laporan yang memberikan ringkasan hasil untuk setiap subdirektori, dan kemudian menghasilkan laporan tersebut sesuai permintaan.

SHW
sumber
4
Tidak menjawab pertanyaan, tetapi tetap memberi +1. Tip yang bagus.
0xC0000022L
Saya telah mengedit pertanyaan untuk membuatnya lebih jelas bahwa ini benar-benar menjawab pertanyaan (agedu indeks penggunaan disk serta waktu akses).
Anthony G - keadilan untuk Monica
5

Seperti yang disebutkan oleh SHW, agedumemang membuat indeks. Saya pikir saya akan berbagi cara lain untuk membuat indeks, setelah membaca tentang locatedb. Anda dapat membuat versi Anda sendiri locatedbdari dukeluaran:

du | awk '{print $2,$1}' | /usr/lib/locate/frcode > du.locatedb

awkmengatur ulang du output untuk memiliki nama file terlebih dahulu, sehingga frcodeberfungsi dengan benar. Kemudian gunakan locatedengan database ini untuk melaporkan penggunaan disk dengan cepat:

locate --database=du.locatedb pingus

Anda dapat mengembangkan ini sesuai dengan kebutuhan Anda. Saya pikir ini adalah penggunaan yang bagus dari locatedb.

Yuval
sumber
3
duc

(lihat https://duc.zevv.nl ) mungkin yang Anda cari.

Duc menyimpan penggunaan disk dalam basis data yang dioptimalkan, menghasilkan antarmuka pengguna yang cepat. Tidak ada waktu tunggu setelah indeks selesai.

Memperbarui indeks sangat cepat bagi saya (kurang dari 10 detik untuk sekitar 950k file dalam direktori 121k, 2,8 TB). Memiliki GUI dan UI ncurses juga.

Penggunaan misalnya:

duc index /usr
duc ui /usr

Dari situs web:

Duc dibangun untuk menskalakan sistem file besar: ia akan mengindeks dan menampilkan ratusan juta file pada penyimpanan petabyte tanpa masalah.

Peter
sumber
2

Saya memiliki cronjob yang diatur untuk menjalankan updatedb setiap 10 menit. Membuat semua buffer filesystem tetap bagus dan segar. Mungkin juga gunakan RAM murah itu untuk sesuatu yang baik. Gunakan slabtop, lihat 'sebelum' dan 'setelah'.

Marcin
sumber
Saya tidak mengerti bagaimana jawaban Anda terkait dengan pertanyaan itu. updatedbtidak mengatakan apa pun tentang penggunaan disk. Jika Anda melakukannya hanya untuk melintasi disk, Anda akan merusak kinerja secara keseluruhan.
Gilles 'SANGAT berhenti menjadi jahat'
3
Menghitung ukuran file dulambat karena Anda harus mengakses metadata dari sejumlah besar file yang berpotensi, tersebar di sekitar disk. Jika Anda menjalankan updatedb secara agresif, metadata untuk semua file terpaksa disimpan dalam RAM. Lain kali Anda menjalankan operasi metadata-berat lainnya, alih-alih melakukan ribuan pencarian di disk, Anda menggunakan cache. Biasanya Anda memiliki peluang kecil untuk menyimpan bagian tertentu dari metadata pohon itu di-cache. Dengan 'metadata cache priming' saya, sangat mungkin bahwa data yang Anda inginkan baru di-cache. Tidak ada pencarian fisik == CEPAT.
Marcin
2

Jika Anda hanya perlu mengetahui ukuran direktori, Anda dapat mempercepatnya dengan hanya menghindari menulis informasi ke layar. Karena grand total adalah baris terakhir dari duperintah, Anda bisa langsung mengirimnya tail.

du -hc | tail -n 1

Struktur direktori 2GB membutuhkan waktu lebih dari satu detik untuk daftar lengkap tetapi kurang dari seperlima dari itu dengan formulir ini.

jujur
sumber
2
Saya pikir du -hslebih nyaman untuk tujuan itu.
Lepe
1
juga--max-depth 1
stevesliva