ขนาดของอะตอมเขียนลงดิสก์ในระบบของฉันคือเท่าไหร่


10

ในเอกสารสำหรับสั่งเอกสาร Nginx กล่าวว่าaccess_log

ขนาดบัฟเฟอร์ต้องไม่เกินขนาดของการเขียนอะตอมไปยังดิสก์ไฟล์

ฉันจะกำหนดขนาดนี้ในระบบของฉันได้อย่างไร?


@mdpc จากเอกสารที่เชื่อมโยงมันค่อนข้างชัดเจนว่ามันไม่เกี่ยวกับขนาดเซกเตอร์ซึ่ง btw มีขนาด 512 ไบต์บนสื่อส่วนใหญ่ตั้งแต่ช่วงปลายยุค 80 จนถึงปัจจุบัน มีการย้ายไปสู่ขนาดเซกเตอร์ 4K บนไดรฟ์ใหม่
kasperd

ข้อกำหนดนี้อาจมีความเกี่ยวข้อง แม้ว่าดูเหมือนจะไม่ได้ให้คำตอบที่แน่นอนสำหรับคำถาม: pubs.opengroup.org/onlinepubs/7908799/xsh/write.html
kasperd

คำตอบ:


3

มาสายดีกว่าไม่มาเลย :)

คำตอบอย่างรวดเร็วคือ: "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


1

คำตอบ Superuser นี้มีคำจำกัดความที่ดีว่าขนาดการเขียนของอะตอมคืออะไร

นี่เป็นอย่างน้อยใหญ่เท่ากับขนาดของเซ็กเตอร์ฮาร์ดแวร์ซึ่งเป็นขนาดการอ่าน / เขียนอะตอม


1
ตกลงดังนั้นฉันจะทราบได้อย่างไรว่าเซกเตอร์ของดิสก์ใหญ่แค่ไหน
bdesham

9
เอกสาร nginx และคำตอบ superuser ไม่ได้พูดถึงเลเยอร์เดียวกันในสแตกที่จัดเก็บ เอกสาร nginx พูดถึงการเขียนอะตอมมิกที่ใหญ่ที่สุดที่เลเยอร์ระบบไฟล์ซึ่งขึ้นอยู่กับ OS และ FS คำตอบ superuser กำลังพูดถึงการเขียนอะตอมมิกที่ใหญ่ที่สุดที่ระดับบล็อกซึ่งขึ้นอยู่กับฮาร์ดแวร์
kasperd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.