Là các tập tin ngắn hạn được tuôn ra đĩa?


9

Chương trình của tôi tạo ra nhiều tập tin nhỏ ngắn. Chúng thường bị xóa trong vòng một giây sau khi tạo. Các tập tin nằm trong một hệ thống tập tin ext4 được hỗ trợ bởi một đĩa cứng thực sự. Tôi biết rằng Linux định kỳ xả ( pdflush) các trang bẩn vào đĩa. Vì các tệp của tôi tồn tại trong thời gian ngắn, nên nhiều khả năng chúng không được lưu trong bộ nhớ cache pdflush. Câu hỏi của tôi là, chương trình của tôi gây ra rất nhiều đĩa ghi? Mối quan tâm của tôi là cuộc sống đĩa cứng của tôi.

Vì các tệp nhỏ, nên giả sử tổng kích thước của chúng nhỏ hơn dirty_bytesdirty_background_bytes.

Ext4 có tạp chí mặc định được bật, tức là tạp chí siêu dữ liệu. Tôi cũng muốn biết liệu siêu dữ liệu hoặc dữ liệu được ghi vào đĩa.


> Chương trình của tôi tạo ra nhiều tệp có thời gian tồn tại nhỏ là 'rất nhiều'? Bạn đang xóa các tập tin này hoặc viết lại tập tin? > Tôi cũng muốn biết liệu siêu dữ liệu hoặc dữ liệu được ghi vào đĩa. Tôi tin rằng chế độ siêu dữ liệu mặc định được sắp xếp có nghĩa là siêu dữ liệu được cam kết trước khi dữ liệu được ghi vào đĩa. Tất nhiên có các tùy chọn gắn kết bạn có thể thêm để thay đổi điều này. > Câu hỏi của tôi là, chương trình của tôi có gây ra nhiều đĩa ghi không? điều này rất khó để đáp ứng với việc xem xét thông tin bạn đã cung cấp. Bạn đã cân nhắc sử dụng các công cụ như iotopsysstat để theo dõi IO đĩa chưa?
AngryWombat

ReiserFS tốt hơn cho các tệp nhỏ nếu bạn thực sự muốn chúng đánh đĩa bao giờ tmpfs vẫn ổn nếu bạn không quan tâm
xenoterracide

Một số làm rõ: (1). hệ thống tập tin ext4 không được gắn với synctùy chọn. Bạn có thể xem xét một fedora, debian hoặc ubfox được cài đặt mặc định. Bạn chọn một. (2). Mỗi tệp khoảng 60KB. (3). Khoảng 1000 tệp được tạo và xóa mỗi giây, nhưng không có hơn 10 tệp tồn tại bất kỳ lúc nào. Nói cách khác, thông lượng I / O lớn nhưng không gian chiếm dụng là nhỏ.
Wu Yongzheng

Câu trả lời:


5

Một thử nghiệm đơn giản sử dụng ext4:

Tạo hình ảnh 100 MB ...

# 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

Biến nó thành một thiết bị lặp ...

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

Tạo hệ thống tập tin và gắn kết ...

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

Thực hiện một số loại chạy với các tập tin sống ngắn. (Thay đổi điều này thành bất kỳ phương pháp nào bạn thích.)

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, đồng bộ hóa, unloop.

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

Kiểm tra nội dung hình ảnh.

# 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

Trong trường hợp của tôi, nó liệt kê tất cả các tên tệp, nhưng không có nội dung tệp nào. Vì vậy, chỉ có nội dung không được viết.


Cố gắng tốt đẹp. Bây giờ tôi đã bị thuyết phục. Tôi cũng đã thử ext2 và nhận được kết quả tương tự như bạn. Tôi đã thay đổi khối lượng công việc I / O song song của bạn thành một chuỗi tuần tự và có một tệp có thời gian tồn tại ngắn-999 và 8 nội dung có thời gian tồn tại ngắn- *. Có ai có bất kỳ lời giải thích?
Wu Yongzheng

@msw: chỉnh sửa trong trường hợp không rõ ràng. Nếu không xin vui lòng giải thích.
frostschutz

Điều đó thật ngớ ngẩn. Các tệp tồn tại đồng thời, không có gì để ghi đè và các hệ thống tệp không ghi đè lên nội dung tệp đã xóa vì làm như vậy sẽ gây hại cho hiệu suất. Nhưng bằng mọi cách, sử dụng nbdvà ghi lại lưu lượng truy cập (hoặc phương pháp tương tự để truy tìm tất cả ghi).
frostschutz

7

Trừ khi bạn đang nói về một ổ đĩa trạng thái rắn, một số lượng lớn đĩa ghi sẽ không phải là yếu tố chi phối trong tuổi thọ ổ đĩa.

Nếu bạn thực sự muốn tránh việc ghi đĩa, hãy nhìn vào tmpfs ,


2
tmpfs thực sự phù hợp trong trường hợp này, nhưng tôi vẫn muốn biết, như một câu hỏi chung của hệ điều hành, là dữ liệu được ghi vào đĩa (không cần thiết)?
Wu Yongzheng

Câu hỏi của bạn sẽ cần phải cụ thể hơn nhiều so với bạn có thể đặt ra để nhận được câu trả lời dứt khoát. Bộ đệm bộ đệm làm trung gian cho sự đánh đổi phức tạp giữa hiệu năng và tính bền bỉ không thể trả lời trong bản tóm tắt. Sử dụng các công cụ @AngryWombat được liệt kê, bạn có thể đo được ghi thực tế từ ứng dụng cụ thể của mình, nhưng có rất nhiều yếu tố có thể làm cho nó thay đổi từ chạy sang chạy.
msw

Vâng, nếu pdflush đến sau khi tập tin bị xóa. Viết nó sẽ là không cần thiết.
Wu Yongzheng

1

Theo nguyên tắc chung, không, chúng sẽ không được viết. Điều này là do bộ đệm xóa các trang bẩn khi một trong hai điều kiện được đáp ứng:

  1. Dữ liệu bị già đi sau /proc/sys/vm/dirty_writeback_centisecsđó, mặc định là 5 giây.

  2. Có quá ít bộ nhớ để bộ nhớ cache chứa dữ liệu, nhiều hơn dirty_ratiocác trang bẩn trong bộ đệm (mặc định là 20%).

Vì vậy, trên một hệ thống có nhiều bộ nhớ trống và ít lưu lượng ghi ngoài các tệp nhỏ của bạn bị xóa trong vòng chưa đầy 5 giây, dữ liệu sẽ không bị xóa.


0

Việc các tệp có thời gian sử dụng ngắn có được ghi vào đĩa hay không không chỉ phụ thuộc vào hành vi mặc định của bộ đệm của tệp kernel mà còn phụ thuộc vào chi tiết thực hiện trình điều khiển hệ thống tệp và các tùy chọn gắn kết của hệ thống tệp đã nói. Có thể cấu hình hệ thống theo cách mà mọi thứ sẽ luôn được ghi ngay vào đĩa (về cơ bản, hoạt động giống như DOS).

Một hệ thống tệp, nổi bật với hành vi mà bạn quan tâm (nên được gọi là "phân bổ chậm") là XFS. Với nó, bạn có thể chắc chắn ít nhiều (không có tùy chọn cấu hình hài hước nào ở nơi khác) rằng các khối thuộc về các tệp vừa bị xóa sẽ được sử dụng lại trong bộ nhớ, mà không cần truy cập đĩa trung gian. XFS có thể vẫn muốn cập nhật nhật ký siêu dữ liệu của mình (sẽ được ghi vào đĩa khá thường xuyên, tuy nhiên, do tạp chí của XFS chỉ là siêu dữ liệu, nó đủ nhỏ để đặt trên một số thiết bị nhanh khác, chẳng hạn như RAM được hỗ trợ bằng pin trên nhiều bộ điều khiển RAID).

Do hành vi này, không có gì lạ khi tìm thấy các tệp hoàn toàn bị loại trừ, nhưng các tệp tìm kiếm hợp pháp (kích thước và siêu dữ liệu khác vẫn còn nguyên vẹn) trên hệ thống tệp XFS sau khi bị gián đoạn nguồn đột ngột. Đó là một chi phí hỗ trợ các hoạt động tập tin "bán tạm thời" nhanh chóng.

Một số lý thuyết

Nói chung, một cuộc gọi hệ thống truy cập vào một hệ thống tệp kết thúc, khá nhanh chóng, trong phương thức xác định trình điều khiển hệ thống tệp (được đính kèm với "struct inode_operations" và "struct file_operations" khi trình điều khiển VFS được đăng ký). Điều gì xảy ra sau đó chỉ còn lại tùy theo việc thực hiện hệ thống tệp. Thông thường, một cái gì đó tương tự như cách tiếp cận sau đây được sử dụng (ví dụ đơn giản này là từ trình điều khiển linux linux):

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

Nếu hệ thống tệp được gắn ở chế độ "đồng bộ hóa", tất cả các thay đổi sẽ chuyển sang đĩa ngay lập tức (thông qua fat_sync_inode () trong trường hợp này). Mặt khác, khối được đánh dấu là "bẩn" và nằm trong bộ nhớ cache cho đến khi có cơ hội hợp lý.

Do đó, không thể dự đoán hành vi hệ thống đối với các tệp tạm thời mà không xem xét các tùy chọn gắn kết hệ thống tệp và kiểm tra mã nguồn thực hiện của nó (tất nhiên, điều này chủ yếu áp dụng cho tất cả các loại hệ thống tệp kỳ lạ chủ yếu được tìm thấy trong không gian nhúng) .


Cảm ơn câu trả lời của bạn. Có vẻ như ext4 cũng đã phân bổ chậm trễ. Điều đó có nghĩa là câu trả lời của tôi là KHÔNG? (không có tùy chọn cấu hình hài hước ở nơi khác). Điều đó cũng có nghĩa là câu trả lời của tôi là CÓ nếu ext2 được sử dụng?
Wu Yongzheng

Tôi nghĩ rằng ngay cả với ext2 trên kernel hiện đại, câu trả lời sẽ là KHÔNG. Vấn đề đặc biệt này đã được thảo luận rất nhiều và một cái nhìn thoáng qua về nguồn kernel cho thấy trình điều khiển ext2 chủ yếu dựa vào các hoạt động kernel "mặc định" để thực hiện công việc của nó (do đó, mọi thứ đều bị trì hoãn bởi bộ đệm khối). Tôi cho rằng, tôi nên cập nhật câu trả lời của mình, để bao gồm một số thông tin bổ sung.
Oakad

Ext4 của tôi rõ ràng là không gắn kết với synctùy chọn. Tôi sẽ không bao giờ làm điều đó.
Wu Yongzheng

Khi đánh dấu một nút bẩn, tôi giả sử hệ thống tệp chịu trách nhiệm đánh dấu trang bẩn tương ứng. Sau này khi inode bị xóa, hệ thống tập tin có làm sạch trang bẩn không? Nếu không, dữ liệu sẽ bị xóa vào đĩa một cách không cần thiết.
Wu Yongzheng

2
Các khối dữ liệu không sử dụng được "giải phóng", do đó chúng không bị bẩn. Nếu bạn đã viết một số nội dung để nộp và sau đó cắt ngắn nó trước khi xóa, thì rác qua EOF sẽ biến mất (sắp xếp). Với siêu dữ liệu có thể không đơn giản vì có thể có nhiều sự đánh đổi khác nhau liên quan đến tính toàn vẹn của cấu trúc dữ liệu hệ thống tệp. Nhân tiện, câu hỏi của bạn không rõ ràng là bạn luôn mong muốn được kiểm soát hoàn toàn nền tảng của mình - hầu hết các ứng dụng thường chạy trên các máy có cấu hình không xác định, cách xa nhà phát triển.
Oakad
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.