Berapa ukuran penulisan atom ke disk pada sistem saya?

10

Dalam dokumentasi untuk para access_logdirektif , dokumentasi nginx mengatakan

Ukuran buffer tidak boleh melebihi ukuran penulisan atom ke file disk.

Bagaimana saya bisa menentukan apa ukuran ini pada sistem saya?

bdesham
sumber
@ mdpc Dari dokumen yang ditautkan cukup jelas, bahwa ini bukan tentang ukuran sektor, yang btw. telah 512 byte pada sebagian besar media sejak akhir 80-an hingga sekarang. Ada langkah menuju ukuran sektor 4K pada drive baru.
kasperd
Spesifikasi ini mungkin relevan. Meskipun sepertinya tidak memberikan jawaban yang tepat untuk pertanyaan: pubs.opengroup.org/onlinepubs/7908799/xsh/write.html
kasperd

Jawaban:

3

lebih baik terlambat daripada tidak sama sekali :)

jawaban cepat adalah: "2.147.479.552 byte, jika versi kernel 3.14 atau lebih baru"

jawaban terinci:

Sejauh yang saya mengerti, ini tentang write syscall:

http://man7.org/linux/man-pages/man2/write.2.html

1) sistem POSIX (linux, bsd, all unix) dijamin dapat menulis hingga MAX_SSIZE byte

Menurut POSIX.1, jika jumlah lebih besar dari SSIZE_MAX, hasilnya ditentukan implementasi; lihat CATATAN untuk batas atas di Linux.

# getconf SSIZE_MAX
32767

2) linux dijamin dapat menulis hingga 1,99 GiB (dan itu operasi atom untuk linux kernel versi 3.14 dan yang lebih baru)

Di Linux, write () (dan panggilan sistem serupa) akan mentransfer paling banyak 0x7ffff000 (2.147.479.552) byte, mengembalikan jumlah byte yang sebenarnya ditransfer. (Ini berlaku untuk sistem 32-bit dan 64-bit.)

Tapi itu operasi atom yang adil hanya dari kernel linux 3.14

Menurut POSIX.1-2008 / SUSv4 Bagian XSI 2.9.7 ("Interaksi Thread dengan Operasi File Biasa"):

Semua fungsi berikut harus bersifat atomik sehubungan dengan satu sama lain dalam efek yang ditentukan dalam POSIX.1-2008 ketika mereka beroperasi pada file biasa atau tautan simbolis: ...

Di antara API yang selanjutnya terdaftar adalah write () dan writev (2). Dan di antara efek yang seharusnya menjadi atom di seluruh utas (dan proses) adalah pembaruan dari file offset. Namun, di Linux sebelum versi 3.14, ini tidak terjadi: jika dua proses yang berbagi deskripsi file terbuka (lihat open (2)) melakukan write () (atau writev (2)) pada saat yang sama, maka I / O operasi tidak atomik dengan hormat memperbarui file offset, dengan hasil bahwa blok-blok output data oleh dua proses mungkin (salah) tumpang tindih. Masalah ini diperbaiki di Linux 3.14.

Oleg Korchagin
sumber
1

Jawaban Superuser ini memiliki definisi yang baik tentang ukuran tulisan atom itu.

Ini setidaknya sebesar ukuran sektor perangkat keras, yang merupakan ukuran baca / tulis atom.

mlw4428
sumber
1
OK, jadi bagaimana cara menentukan seberapa besar sektor disk?
bdesham
9
Dokumentasi nginx dan jawaban pengguna super tidak berbicara tentang lapisan yang sama dalam tumpukan penyimpanan. Dokumentasi nginx berbicara tentang penulisan atom terbesar pada lapisan sistem file, yang bergantung pada OS dan FS. Jawaban superuser berbicara tentang penulisan atom terbesar di level blok, yang bergantung pada perangkat keras.
kasperd