GNU/Linux >> Belajar Linux >  >> Linux

mengapa output dari `du` seringkali sangat berbeda dari `du -b`

Bandingkan (misalnya) du -bm ke du -m .

-b menetapkan --apparent-size --block-size=1 , tetapi kemudian m mengganti ukuran blok menjadi 1M .

Mirip dengan -bh versus -h :-bh berarti --apparent-size --block-size=1 --human-readable , dan lagi h menimpa ukuran blok itu.


Ukuran yang terlihat adalah jumlah byte yang menurut aplikasi Anda ada di dalam file. Ini adalah jumlah data yang akan ditransfer melalui jaringan (tidak termasuk header protokol) jika Anda memutuskan untuk mengirim file melalui FTP atau HTTP. Ini juga merupakan hasil dari cat theFile | wc -c , dan jumlah ruang alamat yang akan digunakan file jika Anda memuat semuanya menggunakan mmap .

Penggunaan disk adalah jumlah ruang yang tidak dapat digunakan untuk hal lain karena file Anda menempati ruang tersebut.

Dalam kebanyakan kasus, ukuran yang terlihat lebih kecil daripada penggunaan disk karena penggunaan disk menghitung ukuran penuh dari blok terakhir (sebagian) file, dan ukuran yang terlihat hanya menghitung data yang ada di blok terakhir itu. Namun, ukuran yang terlihat lebih besar ketika Anda memiliki file jarang (file jarang dibuat ketika Anda mencari di suatu tempat melewati akhir file, dan kemudian menulis sesuatu di sana - OS tidak repot-repot membuat banyak blok yang diisi dengan nol - - itu hanya membuat blok untuk bagian dari file yang Anda putuskan untuk menulis).


Contoh perincian blok minimal

Mari bermain sedikit untuk melihat apa yang terjadi.

mount memberi tahu saya bahwa saya menggunakan partisi ext4 yang dipasang di / .

Saya menemukan ukuran bloknya dengan:

stat -fc %s .

yang memberikan:

4096

Sekarang mari buat beberapa file dengan ukuran 1 4095 4096 4097 :

#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
  dd if=/dev/zero of=f bs=1 count="${size}" status=none
  echo "size     ${size}"
  echo "real     $(du --block-size=1 f)"
  echo "apparent $(du --block-size=1 --apparent-size f)"
  echo
done

dan hasilnya adalah:

size     1
real     4096   f
apparent 1      f

size     4095
real     4096   f
apparent 4095   f

size     4096
real     4096   f
apparent 4096   f

size     4097
real     8192   f
apparent 4097   f

Jadi kita melihat bahwa apa pun di bawah atau sama dengan 4096 menggunakan 4096 sebenarnya byte.

Lalu, segera setelah kita melewati 4097 , naik menjadi 8192 yaitu 2 * 4096 .

Maka jelaslah bahwa disk selalu menyimpan data pada batas blok 4096 byte.

Apa yang terjadi pada file jarang?

Saya belum menyelidiki apa sebenarnya representasi itu, tetapi jelas bahwa --apparent tidak mempertimbangkannya.

Hal ini dapat menyebabkan ukuran yang terlihat lebih besar dari penggunaan disk yang sebenarnya.

Misalnya:

dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f

memberikan:

8192    f
1073741825      f

Terkait:Cara menguji apakah file jarang didukung

Apa yang harus dilakukan jika saya ingin menyimpan banyak file kecil?

Beberapa kemungkinannya adalah:

  • gunakan database sebagai ganti sistem file:Database vs Penyimpanan sistem file
  • gunakan sistem file yang mendukung suballokasi blok

Bibliografi:

  • https://serverfault.com/questions/565966/which-block-sizes-for-millions-of-small-files
  • https://askubuntu.com/questions/641900/how-file-system-block-size-works

Diuji di Ubuntu 16.04.


Linux
  1. Mengapa pr_debug dari kernel Linux tidak memberikan hasil apa pun?

  2. Mengapa ukuran direktori selalu 4096 byte di unix?

  3. Mengapa output dari openssl passwd berbeda setiap kali?

  1. Mengapa saya beralih dari Mac ke Linux

  2. Grep – Mengapa Kurung Dalam Pola Grep Menghapus Proses Grep Dari Hasil Ps?

  3. Bagaimana Cara Membuat `date` Menghasilkan Waktu Dari Zona Waktu yang Berbeda?

  1. Linux – Kolom Buffer Di Keluaran Dari Gratis?

  2. Mengapa Ls -l Menghasilkan Ukuran Yang Berbeda Dari Ls -s?

  3. Dapatkan 4 karakter keluaran terakhir dari keluaran standar