ฉันจะส่งออก“ กระจาย” ไฟล์ได้อย่างไร


15

ฉันจะส่งออกขนาดข้อมูลระบุขนาดไฟล์ที่เต็มไปด้วยข้อมูลจริงได้อย่างไร กด Like vmtouchแสดงจำนวนไฟล์ในหน่วยความจำในปัจจุบัน ...

ฉันคาดว่าเวิร์กโฟลว์จะเป็นเช่นนี้:

$ fallocate -l 1000000 data 
$ measure_sparseness data
100%
$ fallocate -p -o 250000 -l 500000  data
$ measure_sparseness
50%

การแก้ปัญหา: การใช้งานdu -bshและdu -shและเปรียบเทียบ


1
เกี่ยวข้อง: filefragสำหรับระบบไฟล์ใด ๆ และxfs_bmap -vplสำหรับ XFS เป็นเครื่องมือสำคัญสำหรับการแสดงว่าข้อมูลอยู่ที่ไหน (และที่ส่วนขยายที่ไม่ได้ถูกเขียนไว้ล่วงหน้า) เมื่อเล่นกับไฟล์ที่กระจัดกระจายและการเจาะรู
Peter Cordes

filefrag data-> หลายรายการFIBMAP: Invalid argument-> data: 1 extent found...
Vi

ในระบบไฟล์อะไร filefrag -eทำงานอย่างสมบูรณ์บน XFS และ ext4 อย่างน้อย ฉันไม่ได้ทดสอบกับคนอื่น มันใช้ FIEMAP (แผนที่ขอบเขต) พร้อมทางเลือกกลับสู่ FIBMAP หากสิ่งเหล่าioctlนี้ไม่ได้ผลก็จะไม่มีประโยชน์
Peter Cordes

บน tmpfs ฉันfilefragไม่มี-eตัวเลือก
วิ

คุณอายุเท่าe2fsprogsไหร่ ฉันค่อนข้างแน่ใจว่ามันไม่ใช่คุณสมบัติล่าสุด นอกจากนี้ยังมี-vตัวเลือกที่พิมพ์ข้อมูล verbose เดียวกัน (รวมถึงบรรทัดส่วนหัวพิเศษบางอย่าง) บางทีคุณfilefragจะมีอย่างนั้น ซึ่งแตกต่างจากxfs_bmapแม้ว่าจะไม่ได้ระบุหลุมที่มีเส้นแยกอย่างชัดเจน แต่ก็มีความไม่ต่อเนื่องในตำแหน่งไฟล์ อย่างไรก็ตามฉันไม่แปลกใจที่tmpfsไม่สนับสนุน FIEMAP เนื่องจากไม่มีอุปกรณ์บล็อกเป็นที่เก็บข้อมูลสำรองดังนั้นจึงไม่มีคุณค่าที่เหมาะสมสำหรับตำแหน่งของขอบเขต
Peter Cordes

คำตอบ:


19

findมีตัว%Sระบุรูปแบบซึ่งแม้แต่ชื่อ "sparseness"

         %S     File's  sparseness.   This  is  calculated as (BLOCKSIZE*st_blocks / st_size).  The exact value you will get for an ordinary file of a certain
                 length is system-dependent.  However, normally sparse files will have values less than 1.0, and files which use indirect  blocks  may  have  a
                 value which is greater than 1.0.   The value used for BLOCKSIZE is system-dependent, but is usually 512 bytes.   If the file size is zero, the
                 value printed is undefined.  On systems which lack support for st_blocks, a file's sparseness is assumed to be 1.0.
$ fallocate -l 1000000 data
$ find data -printf '%S\n'
1.00352
$ fallocate -p -o 250000 -l 500000  data
$ find data -printf '%S\n'
0.507904

น่าสนใจ ไฟล์ปกติส่วนใหญ่ในระบบจะมีความกว้างมากกว่า 1.0 ไดเรกทอรีซอฟต์ลิงค์และซ็อกเก็ตจะมี 1.0 เสมอ
grochmal

ระบบบางระบบไม่บันทึก (สั้น) symlink โดยตรงใน inode โดยไม่ต้องใช้ data block เลย? สงสัยว่าความกระจัดกระจายของสิ่งที่ควรจะเป็น นอกจากนี้คำจำกัดความนั้นไม่ใช่วิธีที่ผิด ๆ แน่นอนไฟล์ธรรมดา (เช่นที่ไม่มีการกระจาย) ควรมีความเป็นศูนย์หรือไม่ :)
ilkkachu

@grochmal, บน ext4 (Linux):, "sparseness ln -s foo link" ของlink: 0 Sockets และ FIFO มีความยาวเป็นศูนย์ดังนั้นfindแสดงการ
กระจาย

1

หากfindไม่มีตัวเลือกของคุณวิธีการที่ใช้ได้กับ UNIX ตั้งแต่ยุค 70 คือ:

ls -ls file

ซึ่งจะพิมพ์จำนวนบล็อกที่ใช้จริงและไบต์สูงสุดที่เคยเขียน จากนั้นคุณสามารถคำนวณจำนวนบล็อกที่ยังไม่ได้รับการจัดสรรได้อย่างง่ายดาย


0

ในขณะที่find's%Sจะพิมพ์เอาท์พุทสั้น ๆ เพื่อดูรายละเอียดเพิ่มเติมที่คุณอาจต้องการที่จะดูที่sparsetestซึ่งผมเขียน - เปิดแหล่งที่มาและใน GitHub ที่นี่ อย่าลังเลที่จะแก้ไขหากคุณต้องการพิมพ์ (เช่น) ทุกหลุม

บทความบล็อกแสดงปัญหาเกี่ยวกับการจัดสรรแบบกระจายที่นี่sparsetestเพื่อใช้ในการดีบักปัญหา


มันสามารถพิมพ์ "แผนที่" ของส่วนขยายในไฟล์เช่นvmtouch -vพิมพ์แผนที่ของพื้นที่แคชในไฟล์ได้หรือไม่?
วิ

@Vi เมื่อไม่นานมานี้ฉันเขียนมันได้ดีและลืมรายละเอียดบางอย่าง - สิ่งที่ทำอยู่คือการสร้างไฟล์แบบเบาบางเขียนข้อมูลลงไปแล้วพิมพ์สถิติ คุณแค่อยากให้สถิติการสร้างบิต หากต้องการพิมพ์หลุมที่คุณจะต้องlseekมีและSEEK_HOLE SEEK_DATAง่ายต่อการทำ
abligh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.