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?
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?
Jawaban:
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.
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.