ในเอกสารสำหรับสั่งเอกสาร Nginx กล่าวว่าaccess_log
ขนาดบัฟเฟอร์ต้องไม่เกินขนาดของการเขียนอะตอมไปยังดิสก์ไฟล์
ฉันจะกำหนดขนาดนี้ในระบบของฉันได้อย่างไร?
ในเอกสารสำหรับสั่งเอกสาร Nginx กล่าวว่าaccess_log
ขนาดบัฟเฟอร์ต้องไม่เกินขนาดของการเขียนอะตอมไปยังดิสก์ไฟล์
ฉันจะกำหนดขนาดนี้ในระบบของฉันได้อย่างไร?
คำตอบ:
มาสายดีกว่าไม่มาเลย :)
คำตอบอย่างรวดเร็วคือ: "2,147,479,552 ไบต์หากรุ่นเคอร์เนลคือ 3.14 หรือใหม่กว่า"
คำตอบโดยละเอียด:
เท่าที่ฉันเข้าใจมันเป็นเรื่องเกี่ยวกับการเขียน syscall:
http://man7.org/linux/man-pages/man2/write.2.html
1) ระบบ POSIX ใด ๆ (linux, bsd, unix ทั้งหมด) รับประกันว่าจะสามารถเขียนได้สูงสุด MAX_SSIZE ไบต์
ตาม POSIX.1 หากจำนวนมากกว่า SSIZE_MAX ผลลัพธ์จะถูกกำหนดตามการนำไปใช้ ดูหมายเหตุสำหรับขีด จำกัด บนบน Linux
# getconf SSIZE_MAX
32767
2) linux รับประกันว่าจะสามารถเขียนได้มากถึง 1.99 GiB (และเป็นการทำงานแบบปรมาณูสำหรับเคอร์เนล linux รุ่น 3.14 และใหม่กว่า)
บน Linux เขียน () (และการเรียกระบบที่คล้ายกัน) จะถ่ายโอนได้สูงสุด 0x7ffff000 (2,147,479,552) ไบต์ส่งคืนจำนวนไบต์ที่ถ่ายโอนจริง (สิ่งนี้เป็นจริงทั้งในระบบ 32- บิตและ 64- บิต)
แต่มันเป็นการทำงานที่เป็นธรรมจากลินุกซ์เคอร์เนล 3.14 เท่านั้น
อ้างอิงจาก POSIX.1-2008 / SUSv4 ส่วน XSI 2.9.7 ("การโต้ตอบเธรดกับการใช้งานไฟล์ปกติ"):
ฟังก์ชั่นทั้งหมดต่อไปนี้จะต้องเป็นปรมาณูที่เกี่ยวกับซึ่งกันและกันในลักษณะพิเศษที่ระบุใน POSIX.1-2008 เมื่อทำงานกับไฟล์ปกติหรือลิงก์สัญลักษณ์: ...
ในบรรดา APIs ที่แสดงรายการนั้นคือ write () และ writev (2) และในบรรดาเอฟเฟ็กต์ที่ควรมีอะตอมมิกข้ามเธรด (และกระบวนการ) เป็นการอัปเดตของไฟล์ออฟเซต อย่างไรก็ตามบน Linux ก่อนเวอร์ชัน 3.14 นี่ไม่ใช่กรณี: หากสองกระบวนการที่แชร์คำอธิบายไฟล์แบบเปิด (ดู open (2)) ทำการเขียน () (หรือ writev (2)) ในเวลาเดียวกันดังนั้น I การดำเนินการ / O ไม่ใช่อะตอมมิกที่เกี่ยวกับการอัปเดตไฟล์ออฟเซ็ตด้วยผลลัพธ์ที่บล็อกของเอาต์พุตข้อมูลโดยทั้งสองกระบวนการอาจทับซ้อนกัน (ไม่ถูกต้อง) ปัญหานี้ได้รับการแก้ไขใน Linux 3.14
คำตอบ Superuser นี้มีคำจำกัดความที่ดีว่าขนาดการเขียนของอะตอมคืออะไร
นี่เป็นอย่างน้อยใหญ่เท่ากับขนาดของเซ็กเตอร์ฮาร์ดแวร์ซึ่งเป็นขนาดการอ่าน / เขียนอะตอม