เหตุผลที่มันเกิดขึ้นแบบนั้นคือโปรแกรมบอกว่า "เขียนข้อมูลนี้" และเคอร์เนล linux จะคัดลอกมันลงในบัฟเฟอร์หน่วยความจำที่เข้าคิวเพื่อไปยังดิสก์จากนั้นบอกว่า "ตกลงเสร็จแล้ว" ดังนั้นโปรแกรมจึงคิดว่ามันได้คัดลอกทุกอย่างแล้ว จากนั้นโปรแกรมจะปิดไฟล์ แต่ในทันใดเคอร์เนลจะทำให้มันรอในขณะที่บัฟเฟอร์นั้นถูกส่งออกไปยังดิสก์
ดังนั้นน่าเสียดายที่โปรแกรมไม่สามารถบอกคุณได้ว่าต้องใช้เวลานานแค่ไหนในการล้างบัฟเฟอร์เนื่องจากไม่รู้
หากคุณต้องการลองใช้เล่ห์เหลี่ยมผู้ใช้ระดับสูงคุณสามารถลดขนาดของบัฟเฟอร์ที่ Linux ใช้โดยการตั้งค่าพารามิเตอร์เคอร์เนลvm.dirty_bytes
เป็นขนาดเช่น15000000
(15 MB) ซึ่งหมายความว่าแอปพลิเคชันไม่สามารถรับได้เกินกว่า 15MB ก่อนความคืบหน้าจริง (คุณสามารถเปลี่ยนพารามิเตอร์เคอร์เนลได้ทันทีด้วยsudo sysctl vm.dirty_bytes=15000000
แต่การทำให้พารามิเตอร์เหล่านั้นอยู่ในการรีบูตต้องเปลี่ยนไฟล์กำหนดค่า/etc/sysctl.conf
ซึ่งอาจเฉพาะเจาะจงกับ distro ของคุณ)
ผลข้างเคียงคือคอมพิวเตอร์ของคุณอาจมีการรับส่งข้อมูลที่ต่ำกว่าด้วยการตั้งค่านี้ แต่โดยรวมแล้วฉันคิดว่ามันมีประโยชน์ที่จะเห็นว่าโปรแกรมทำงานเป็นเวลานานในขณะที่มันเขียนข้อมูลจำนวนมากและความสับสนของการมี โปรแกรมดูเหมือนว่าจะทำกับงาน แต่ระบบล่าช้าอย่างไม่ดีเท่าที่เคอร์เนลทำงานจริง การตั้งค่าdirty_bytes
ให้มีขนาดเล็กพอสมควรสามารถช่วยป้องกันระบบของคุณไม่ตอบสนองเมื่อคุณมีหน่วยความจำว่างเหลือน้อยและรันโปรแกรมที่เขียนข้อมูลจำนวนมากในทันที
แต่อย่าตั้งมันเล็กเกินไป! ฉันใช้ 15MB เป็นค่าคร่าวๆที่เคอร์เนลสามารถล้างบัฟเฟอร์ไปยังฮาร์ดไดรฟ์ปกติใน 1/4 ของวินาทีหรือน้อยกว่า มันทำให้ระบบของฉันไม่รู้สึก "ล้าหลัง"