ไฟล์ระยะสั้นถูกฟลัชไปที่ดิสก์หรือไม่?


9

โปรแกรมของฉันสร้างไฟล์อายุสั้นขนาดเล็กจำนวนมาก โดยทั่วไปจะถูกลบภายในไม่กี่วินาทีหลังจากการสร้าง ไฟล์อยู่ในระบบไฟล์ ext4 ที่สำรองข้อมูลโดยฮาร์ดดิสก์จริง ฉันรู้ว่าลีนุกซ์ล้างpdflushหน้าสกปรกไปยังดิสก์เป็นระยะ ๆ pdflushเนื่องจากไฟล์ของฉันจะอายุสั้นส่วนใหญ่พวกเขาจะไม่เก็บไว้โดย คำถามของฉันคือโปรแกรมของฉันทำให้เขียนดิสก์จำนวนมากหรือไม่ ความกังวลของฉันคือชีวิตของฮาร์ดดิสก์ของฉัน

เนื่องจากไฟล์มีขนาดเล็กสมมติว่าผลรวมของขนาดของพวกเขามีขนาดเล็กกว่าและdirty_bytesdirty_background_bytes

Ext4 เปิดใช้งานสมุดรายวันเริ่มต้นเช่นสมุดรายวันเมตาดาต้า ฉันต้องการทราบด้วยว่าข้อมูลเมตาหรือข้อมูลถูกเขียนไปยังดิสก์หรือไม่


> โปรแกรมของฉันสร้างไฟล์สั้นขนาดเล็กจำนวนมากว่า 'มาก' หรือไม่ คุณลบไฟล์เหล่านี้หรือเขียนไฟล์ใหม่หรือไม่? > ฉันต้องการทราบว่าข้อมูลเมตาหรือข้อมูลถูกเขียนลงดิสก์หรือไม่ ฉันเชื่อว่ามีการเรียงลำดับโหมดเมทาดาทาเริ่มต้นซึ่งหมายถึงเมทาดาทาที่ทำไว้ก่อนที่ข้อมูลจะถูกเขียนลงดิสก์ แน่นอนว่ามีตัวเลือกการเมานท์ที่คุณสามารถเพิ่มเพื่อเปลี่ยนแปลงสิ่งนี้ได้ > คำถามของฉันคือโปรแกรมของฉันทำให้เขียนดิสก์จำนวนมากหรือไม่ เป็นการยากที่จะตอบสนองต่อการพิจารณาข้อมูลที่คุณให้ คุณเคยใช้เครื่องมือเช่นiotopและsysstatเพื่อตรวจสอบ disk IO หรือไม่?
AngryWombat

ReiserFS จะดีกว่าสำหรับไฟล์เล็ก ๆ หากคุณต้องการให้พวกเขาตีดิสก์ทุกครั้ง tmpfs นั้นใช้ได้ถ้าคุณไม่สนใจ
xenoterracide

คำอธิบายบางอย่าง: (1) ระบบไฟล์ ext4 ไม่ได้ถูกเมาท์พร้อมsyncตัวเลือก คุณสามารถพิจารณาค่าเริ่มต้นที่ติดตั้ง fedora, debian หรือ ubuntu คุณเลือกหนึ่งอัน (2) แต่ละไฟล์มีขนาดประมาณ 60KB (3) มีการสร้างและลบไฟล์ประมาณ 1,000 ไฟล์ต่อวินาที แต่ไม่เกิน 10 ไฟล์ทุกเวลา กล่าวอีกนัยหนึ่งปริมาณงาน I / O มีขนาดใหญ่ แต่พื้นที่ว่างมีขนาดเล็ก
Wu Yongzheng

คำตอบ:


5

การทดสอบอย่างง่ายโดยใช้ ext4:

สร้างภาพ 100MB ...

# dd if=/dev/zero of=image bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0533049 s, 2.0 GB/s

ทำให้เป็นอุปกรณ์ลูป ...

# losetup -f --show image
/dev/loop0

สร้างระบบไฟล์และเมานต์ ...

# mkfs.ext4 /dev/loop0
# mount /dev/loop0 /mnt/tmp

ทำให้บางชนิดทำงานด้วยไฟล์ระยะสั้น (เปลี่ยนเป็นวิธีใดก็ได้ที่คุณต้องการ)

for ((x=0; x<1000; x++))
do
    (echo short-lived-content-$x > /mnt/tmp/short-lived-file-$x
     sleep 1
     rm /mnt/tmp/short-lived-file-$x ) &
done

จำนวน, ซิงค์, เปิดใหม่

# umount /mnt/tmp
# sync
# losetup -d /dev/loop0

ตรวจสอบเนื้อหารูปภาพ

# strings image | grep short-lived-file | tail -n 3
short-lived-file-266
short-lived-file-895
short-lived-file-909
# strings image | grep short-lived-content | tail -n 3

ในกรณีของฉันมันแสดงชื่อไฟล์ทั้งหมด แต่ไม่มีเนื้อหาของไฟล์ ดังนั้นเนื้อหาจึงไม่ได้ถูกเขียนขึ้น


พยายามได้ดี. ตอนนี้ฉันมั่นใจ ฉันยังลอง ext2 และได้ผลลัพธ์เช่นเดียวกับคุณ ฉันเปลี่ยนเวิร์กโหลด I / O แบบขนานของคุณเป็นซีเควนเชียลลำดับต่อมาและได้หนึ่งไฟล์อายุสั้น 999 และ 8 อายุสั้นเนื้อหา - ไม่มีใครมีคำอธิบายใด ๆ ?
Wu Yongzheng

@msw: แก้ไขในกรณีที่ไม่ชัดเจน มิฉะนั้นโปรดอธิบายอย่างละเอียด
frostschutz

นั่นมันช่างงี่เง่า ไฟล์มีอยู่พร้อมกันไม่มีสิ่งใดที่จะเขียนทับและระบบไฟล์จะไม่เขียนทับไฟล์เนื้อหาที่ถูกลบเพราะการทำเช่นนั้นจะส่งผลเสียต่อประสิทธิภาพการทำงาน แต่โดยทั้งหมดแล้วให้ใช้nbdและบันทึกปริมาณการใช้งาน (หรือวิธีที่คล้ายกันในการติดตามการเขียนทั้งหมด)
frostschutz

7

นอกจากว่าคุณกำลังพูดถึงโซลิดสเตทไดรฟ์การเขียนดิสก์จำนวนมากจะไม่เป็นปัจจัยสำคัญในการยืดอายุของไดรฟ์

ถ้าคุณอยากจะหลีกเลี่ยงการเขียนดิสก์ที่ทุกคนมองเข้าไปในtmpfs ,


2
tmpfs เป็นแบบที่ดีในกรณีนี้ แต่ฉันยังต้องการที่จะรู้ว่าเป็นคำถามของระบบปฏิบัติการทั่วไปเป็นข้อมูลที่เขียนไปยังดิสก์ (ไม่จำเป็น)?
Wu Yongzheng

คำถามของคุณจะต้องเจาะจงมากขึ้นกว่าที่คุณสามารถกำหนดเพื่อรับคำตอบที่ชัดเจน บัฟเฟอร์แคชไกล่เกลี่ยการแลกเปลี่ยนที่ซับซ้อนระหว่างประสิทธิภาพและการคงอยู่ซึ่งไม่สามารถตอบได้ในนามธรรม การใช้เครื่องมือ @AngryWombat แสดงรายการคุณสามารถวัดการเขียนที่แท้จริงภายใต้แอปพลิเคชันเฉพาะของคุณได้ แต่มีหลายปัจจัยที่ทำให้แตกต่างจากการเรียกใช้
msw

ถ้า pdflush เกิดขึ้นหลังจากไฟล์ถูกลบ การเขียนมันจะไม่จำเป็น
Wu Yongzheng

1

ตามกฎทั่วไปแล้วจะไม่มีการเขียน นี่เป็นเพราะแคชล้างหน้าที่สกปรกเมื่อเงื่อนไขใดข้อหนึ่งในสองข้อ:

  1. ข้อมูลจะหมดอายุหลังจาก/proc/sys/vm/dirty_writeback_centisecsนั้นซึ่งมีค่าเริ่มต้นเป็น 5 วินาที

  2. มีหน่วยความจำน้อยเกินไปที่แคชจะเก็บข้อมูลมากกว่าdirty_ratioหน้าสกปรกในแคช (ค่าเริ่มต้นคือ 20%)

ดังนั้นในระบบที่มีหน่วยความจำว่างมากมายและทราฟฟิกการเขียนเพียงเล็กน้อยจากไฟล์เล็ก ๆ ของคุณที่ถูกลบในเวลาน้อยกว่า 5 วินาทีข้อมูลจะไม่ถูกลบทิ้ง


0

ไม่ว่าไฟล์อายุสั้นจะถูกเขียนไปยังดิสก์หรือไม่นั้นไม่เพียง แต่ขึ้นอยู่กับพฤติกรรมเริ่มต้นของแคชไฟล์เคอร์เนลเท่านั้น แต่ยังรวมถึงรายละเอียดของการติดตั้งไดรเวอร์ระบบไฟล์และตัวเลือกเมานต์ของระบบไฟล์ดังกล่าว เป็นไปได้ที่จะกำหนดค่าระบบในลักษณะที่ทุกอย่างจะถูกเขียนลงในดิสก์ทันที (โดยทั่วไปคือพฤติกรรมที่เหมือนดอส)

ระบบไฟล์เดียวซึ่งโดดเด่นด้วยพฤติกรรมที่คุณสนใจ (เรียกว่า "การจัดสรรล่าช้า") คือ XFS ด้วยคุณสามารถมั่นใจได้มากขึ้นหรือน้อยลง (ไม่มีตัวเลือกการกำหนดค่าตลก ๆ ) ที่บล็อกของไฟล์ที่ถูกลบเพียงแค่จะถูกนำมาใช้ใหม่ในหน่วยความจำโดยไม่ต้องเข้าถึงดิสก์ระดับกลาง XFS อาจยังต้องการอัปเดตสมุดรายวันเมตาดาต้า (ซึ่งจะถูกเขียนลงดิสก์ค่อนข้างบ่อยครั้ง แต่เนื่องจากสมุดรายวันของ XFS นั้นเป็นเมทาดาทาเท่านั้นจึงมีขนาดเล็กพอที่จะตั้งค่าบนอุปกรณ์อื่น ๆ ที่รวดเร็วเช่น RAM ที่สำรองแบตเตอรี่ บนตัวควบคุม RAID หลายตัว)

เนื่องจากลักษณะการทำงานนี้ไม่ใช่เรื่องแปลกที่จะพบศูนย์ทั้งหมด แต่ไฟล์การค้นหาที่ถูกต้องตามกฎหมาย (ขนาดและข้อมูลเมตาอื่น ๆ ไม่เป็นอันตราย) บนระบบไฟล์ XFS หลังจากการขัดจังหวะพลังงานอย่างกะทันหัน นี่เป็นต้นทุนในการสนับสนุนการทำงานของไฟล์ "กึ่งชั่วคราว" อย่างรวดเร็ว

ทฤษฎีบางอย่าง

โดยทั่วไปการเรียกระบบที่เข้าถึงระบบไฟล์จะสิ้นสุดลงอย่างรวดเร็วในวิธีการที่กำหนดไว้ในไดรเวอร์ระบบไฟล์ (แนบกับ "struct inode_operations" และ "struct file_operations" เมื่อลงทะเบียนไดรเวอร์ VFS) จะเกิดอะไรขึ้นหลังจากนั้นจะถูกพิจารณาตามความเหมาะสมของการนำระบบไฟล์ไปใช้ โดยทั่วไปแล้วจะใช้สิ่งที่คล้ายกับวิธีการต่อไปนี้ (ตัวอย่างง่ายๆนี้มาจากไดรเวอร์ Linux ของ FAT):

if (IS_DIRSYNC(dir))
    (void)fat_sync_inode(dir);
else
    mark_inode_dirty(dir);

หากระบบไฟล์ติดตั้งในโหมด "ซิงค์" การเปลี่ยนแปลงทั้งหมดจะไปที่ดิสก์ทันที (ผ่าน fat_sync_inode () ในกรณีนี้) มิฉะนั้นบล็อกจะถูกทำเครื่องหมายว่า "สกปรก" และยังคงอยู่ในหน่วยความจำแคชจนกว่าจะล้างด้วยโอกาสที่เหมาะสม

ดังนั้นจึงเป็นไปไม่ได้ที่จะทำนายพฤติกรรมของระบบเกี่ยวกับไฟล์ชั่วคราวโดยไม่พิจารณาตัวเลือกการเมาท์ระบบไฟล์และตรวจสอบซอร์สโค้ดของการใช้งาน (แน่นอนว่าส่วนใหญ่จะใช้กับระบบไฟล์แปลกใหม่ทุกชนิดที่พบในพื้นที่ฝังตัว) .


ขอบคุณสำหรับคำตอบ. ดูเหมือนว่า ext4 จะมีการจัดสรรล่าช้า นั่นหมายความว่าคำตอบของฉันคือไม่? (ไม่มีตัวเลือกการกำหนดค่าที่ตลกที่อื่น) นั่นหมายความว่าคำตอบของฉันคือใช่ถ้าใช้ ext2 หรือไม่
Wu Yongzheng

ฉันคิดว่าแม้จะมี ext2 บนเคอร์เนลที่ทันสมัยคำตอบจะไม่ ปัญหานี้ได้รับการกล่าวถึงเป็นอย่างมากและจากภาพรวมสั้น ๆ ที่เคอร์เนลซอร์สแสดงว่าไดรเวอร์ ext2 ส่วนใหญ่อาศัยการทำงานของเคอร์เนล "เริ่มต้น" ในการทำสิ่งต่าง ๆ (ดังนั้นทุกอย่างจะล่าช้าโดยแคชบล็อก) ฉันคิดว่าฉันควรปรับปรุงคำตอบของฉันเพื่อรวมข้อมูลพิเศษบางอย่าง
oakad

เห็นได้ชัดว่า ext4 ของฉันไม่ได้ติดตั้งพร้อมsyncตัวเลือก ฉันจะไม่ทำอย่างนั้น
Wu Yongzheng

เมื่อทำเครื่องหมาย inode สกปรกฉันถือว่าระบบไฟล์มีหน้าที่ทำเครื่องหมายหน้าที่เกี่ยวข้องสกปรก หลังจากนั้นเมื่อ inode ถูกลบระบบไฟล์จะล้างหน้าที่สกปรกหรือไม่? หากไม่มีข้อมูลจะถูกฟลัชไปยังดิสก์โดยไม่จำเป็น
Wu Yongzheng

2
บล็อกข้อมูลที่ไม่ได้ใช้จะ "ปล่อย" ดังนั้นพวกเขาจึงหยุดความสกปรก หากคุณเขียนบางสิ่งลงไฟล์แล้วตัดทอนก่อนที่จะล้างข้อมูลขยะที่ผ่าน EOF จะหายไป (เรียงลำดับ) ด้วยข้อมูลเมตาอาจไม่ง่ายอย่างนั้นเพราะอาจมีข้อเสียมากมายเกี่ยวกับความสมบูรณ์ของโครงสร้างข้อมูลระบบไฟล์ ยังไม่ชัดเจนจากคำถามของคุณที่คุณคาดหวังว่าจะสามารถควบคุมแพลตฟอร์มของคุณได้อย่างสมบูรณ์ - แอพพลิเคชั่นส่วนใหญ่มักจะจบลงด้วยการทำงานบนเครื่องที่มีการกำหนดค่าที่ไม่รู้จัก
oakad
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.