Các tập tin được lưu trên đĩa tuần tự?


22

Theo tôi hiểu, "tệp thưa" có nghĩa là tệp có thể có 'khoảng trống' nên dữ liệu được sử dụng thực tế có thể nhỏ hơn kích thước tệp logic.

Làm thế nào để hệ thống tập tin Linux lưu tập tin trên đĩa? Tôi chủ yếu quan tâm đến ext4. Nhưng:

  1. Một tập tin có thể được lưu không tuần tự trên đĩa? Do đó, ý tôi là một phần của tệp được đặt tại địa chỉ vật lý X và phần tiếp theo tại địa chỉ vật lý Y không gần với bù X +).
  2. Tôi có thể bằng cách nào đó kiểm soát tuần tự tập tin?
    Tôi muốn phân bổ một tệp 10GB. Tôi muốn nó được tuần tự trên đĩa và không được phân chia giữa các độ lệch khác nhau.
  3. Nó có hành động khác nhau giữa các loại khác nhau?

Bạn có thể muốn đọc ext4.wiki.kernel.org/index.php/Main_Page
roaima

1
Có lẽ, nếu tôi hiểu chính xác ý định của bạn, bạn sẽ quan tâm nhiều hơn đến API cấp thấp hơn, nơi bạn làm việc với các thiết bị lưu trữ mà không phải trải qua lớp hệ thống tệp. Điểm vào của bạn sau đó có thể là dmsetupchương trình, giao diện cho trình ánh xạ thiết bị. Đây có thể là một lựa chọn tốt nếu bạn đang lập kế hoạch lưu trữ giống như cơ sở dữ liệu.
wvxvw

4
Đây là một chi tiết thực hiện của hệ thống tập tin. Hầu như tất cả các hệ thống tập tin làm các tập tin phân đoạn theo mặc định; chỉ iso9660romfskhông có khả năng thực hiện điều đó và yêu cầu lưu trữ liên tục (trong số này tôi có thể liệt kê ra khỏi đầu).
mirabilos

2
cho dù tệp có liền kề trên đĩa hay không, dữ liệu đọc / ghi sẽ luôn liền kề trừ khi bạn tìm kiếm một phần khác của tệp. Vậy tại sao bạn quan tâm đến điều này? Trừ khi phân mảnh là một vấn đề nghiêm trọng ảnh hưởng đến hiệu suất
phuclv

3
@hudac một điều cần lưu ý là tiếp giáp không phải là tất cả hữu ích trong thực tế. Điều dễ dàng là flash trong đó phân mảnh không phải là vấn đề lớn, nhưng trên một đĩa quay, bạn vẫn có thể không được hưởng lợi từ dữ liệu liền kề. Trên một đĩa quay, bạn cần suy nghĩ về các mẫu truy cập của bạn và vị trí của dữ liệu. Nếu bạn cần khu vực vừa trôi qua dưới đầu, bạn phải đợi nó xuất hiện trở lại. Để có kết quả tốt nhất, bạn muốn sắp xếp lại dữ liệu sao cho nó "đóng" khi cần đọc. Tăng kích thước bộ đệm dễ dàng hơn ;-)
Ukko

Câu trả lời:


41

Một tập tin có thể được lưu không tuần tự trên đĩa? Ý tôi là, một phần của tệp nằm dưới địa chỉ vật lý X và phần khác dưới địa chỉ vật lý Y không gần với bù X +).

Vâng; điều này được gọi là phân mảnh tệp và không phải là hiếm, đặc biệt là với các tệp lớn hơn. Hầu hết các hệ thống tệp phân bổ không gian khi cần, ít nhiều theo tuần tự, nhưng chúng không thể đoán được hành vi trong tương lai - vì vậy nếu bạn viết 200MiB vào một tệp, sau đó thêm 100MiB, có khả năng cả hai bộ dữ liệu sẽ không được lưu trữ trong các khu vực khác nhau của đĩa (về cơ bản, bất kỳ ghi nào khác cần thêm dung lượng trên đĩa, xảy ra sau lần ghi đầu tiên và trước lần thứ hai, có thể ở giữa hai lần này). Nếu một hệ thống tệp gần đầy, tình huống thường sẽ tồi tệ hơn: có thể không có một vùng tiếp giáp không gian trống đủ lớn để chứa một tệp mới, do đó nó sẽ phải bị phân mảnh.

Tôi có thể bằng cách nào đó kiểm soát tuần tự tập tin? Tôi muốn phân bổ tệp lớn 10GB. Tôi muốn nó được tuần tự trong đĩa và không được phân chia giữa các độ lệch khác nhau.

Bạn có thể nói với hệ thống tệp về kích thước mục tiêu của tệp khi nó được tạo; điều này sẽ giúp hệ thống tập tin lưu trữ nó tối ưu. Nhiều hệ thống tệp hiện đại sử dụng một kỹ thuật được gọi là phân bổ trễ, trong đó bố cục trên đĩa của một tệp mới được tính càng muộn càng tốt, để tối đa hóa thông tin có sẵn khi tính toán được thực hiện. Bạn có thể giúp quá trình này bằng cách sử dụng posix_fallocate(3)hàm để cho hệ thống tập tin biết tổng phân bổ không gian đĩa. Các hệ thống tập tin hiện đại sẽ cố gắng thực hiện việc phân bổ này một cách tuần tự.

Nó có hành động khác nhau giữa các loại khác nhau?

Hệ thống tập tin khác nhau hành xử khác nhau, có. Các hệ thống tệp dựa trên nhật ký như NILFS2 không phân bổ dung lượng lưu trữ giống như các hệ thống tệp dựa trên phạm vi như Ext4 và đó chỉ là một ví dụ về biến thể.


1
Sẽ sử dụng fallocate(3)đảm bảo tuần tự tập tin? hoặc sẽ chỉ gợi ý hệ thống tập tin? Tôi không thể hiểu nó hoàn toàn từ các trang nam.
hudac

6
Nó không thể đảm bảo phân bổ tuần tự, nó chỉ là một gợi ý. Nhưng bạn chắc chắn nên sử dụng nó nếu bạn đang viết các tệp 10GiB!
Stephen Kitt

6
Về cơ bản, tất cả các hệ thống tệp tinh vi hơn FAT - điều này hoàn toàn quay trở lại Berkeley UFS ban đầu - sẽ cố tình phá vỡ các tệp lớn và trải rộng chúng trên nhiều "nhóm phân bổ"; điều này giúp họ giảm thiểu sự phân mảnh tổng thể của đĩa. Có thể có một cách để điều chỉnh cách thức hoạt động của nó, nhưng có nhiều khả năng bạn phải tạo lại hệ thống tập tin từ đầu để làm điều đó và có lẽ không có cách nào để tắt hoàn toàn.
zwol

2
@hudac Không thể đảm bảo tính tuần tự trong mọi trường hợp (xem trường hợp có ổ đĩa gần đầy) và thành thật với sự gia tăng của SSD, nó ít quan trọng hơn (đối với những người có khả năng chi trả cho chúng ít nhất ).
Muzer

1
Cũng lưu ý rằng có những tình huống, như hệ thống RAID, nơi có các tệp liền kề sẽ kém hiệu quả hơn, thậm chí nếu có thể. Tôi nghĩ đó thực sự là mục đích của bộ điều khiển hệ thống lưu trữ đĩa / lưu trữ: để giảm tải tất cả công việc lưu trữ tệp một cách tối ưu nhất có thể được mong đợi.
jamesqf

17

Lệnh filefrag sẽ cho bạn biết cách tệp của bạn được lưu trữ trên thiết bị của bạn:

# filefrag -v /var/log/messages.1 
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  2130567               1 
   1       1 15907576  2130568      1 
   2       2 15910400 15907577      1 
   3       3 15902720 15910401      7 
   4      10  2838546 15902727      1 eof
/var/log/messages.1: 5 extents found

Nếu bạn viết tệp của mình trong một lần, tôi đoán là tệp của bạn sẽ không bị phân mảnh.

Trang người đàn ông của fallocate(1) khá rõ ràng:

fallocate được sử dụng để preallocate khối vào một tập tin. Đối với các hệ thống tập tin hỗ trợfallocate cuộc gọi hệ thống, việc này được thực hiện nhanh chóng bằng cách phân bổ các khối và đánh dấu chúng là chưa được khởi tạo, không yêu cầu IO cho các khối dữ liệu. Điều này nhanh hơn nhiều so với việc tạo một tệp bằng cách điền vào nó bằng số không.

Kể từ Linux Kernel v2.6.31, lệnh fallocategọi hệ thống được hỗ trợ bởi các hệ thống tệp btrfs, ext4, ocfs2 và xfs.

Có tuần tự không? Hệ thống trước tiên sẽ cố gắng phân bổ các khối liên tục. Nếu không thể, nó sẽ không cảnh báo bạn.


Loại 'ef53' là gì. Tôi thấy nó cũng trên các tập tin của tôi. Nhưng loại FS của tôi là ext4.
hudac

2
EF53 là số "SUPER_MAGIC" của ext2, ext3 và ext4. Tìm trong "include / uapi / linux / magic.h" trong các nguồn kernel cho tất cả các số ma thuật của mọi hệ thống tệp.
Vouze

Trên Debian, filefragđược ẩn trong /usr/sbin. Nhưng nó dường như hoạt động cho người dùng thông thường (ít nhất là trên ext4). Nó có thể được hướng dẫn cho stracehoạt động của nó để xem làm thế nào để đo lường sự phân mảnh cho chính mình, nếu việc thiếu cảnh báo là một trở ngại đối với bạn.
Toby Speight

6

Bạn đề cập đến các tệp thưa thớt và không có câu trả lời nào khác đề cập đến chúng.

Hầu hết các tập tin không thưa thớt. Cách phổ biến nhất để tạo một tệp là viết tất cả trong một lần, từ đầu đến cuối. Không có lỗ ở đó.

Tuy nhiên, bạn được phép nói "di chuyển đến vị trí 1.000.000.000.000 và viết một byte ở đó." Điều này sẽ tạo ra một tệp trông giống như một etabyte lớn, nhưng thực sự chỉ sử dụng (có thể) 4k trên đĩa. Đây là một tập tin thưa thớt.

Bạn có thể làm điều này nhiều lần cho cùng một tệp, để lại một lượng nhỏ dữ liệu nằm rải rác trong sự trống rỗng rộng lớn.

Trong khi điều này có thể hữu ích, có hai nhược điểm.

Đầu tiên là tập tin sẽ bị phân mảnh, đó là điều bạn lo lắng.

Thứ hai là không phải tất cả các chương trình đều xử lý tốt các tệp này. Ví dụ, một số phần mềm sao lưu sẽ cố gắng sao lưu sự trống rỗng và từ đó tạo ra một bản sao lưu lớn hơn nhiều so với mức cần thiết, có thể quá lớn đối với phương tiện sao lưu.


Nhưng ngay cả một tệp không thưa thớt thường sẽ không được tiếp giáp trên đĩa.
Barmar

2

Tôi có thể bằng cách nào đó kiểm soát tuần tự tập tin? Tôi muốn phân bổ một tệp 10GB. Tôi muốn nó được tuần tự trên đĩa và không được phân chia giữa các độ lệch khác nhau.

Có ít nhất một vài cách để đạt được điều này.

  1. Sử dụng một hệ thống tệp có nhiều dung lượng dự phòng và phân bổ không gian (ví dụ: sử dụng điểm đánh dấu cuối dữ liệu cụ thể của ứng dụng và nối thêm dữ liệu ngẫu nhiên cho đến khi kích thước tệp đạt 10GB). Điều này không được đảm bảo dẫn đến dữ liệu không bị phân mảnh.

  2. Sử dụng một hệ thống tập tin thô (chưa được xử lý) thay vì ext4, vv DBMS đôi khi làm điều này vì lý do hiệu suất. Sự đánh đổi là bạn phải thực hiện bộ nhớ đệm / nhật ký / khôi phục của riêng bạn, vv nếu cần.

Những trường hợp bạn đạt được nhiều từ việc này là tương đối hiếm - trước tiên tôi sẽ tìm nơi khác để tối ưu hóa hiệu suất.


Xem thêm

Có đúng là các hệ thống quản lý cơ sở dữ liệu thường bỏ qua các hệ thống tệp?


-1

Nếu đây chỉ là một lần duy nhất và việc lưu trữ tệp ban đầu không quan trọng, chỉ là kết quả quan trọng, thì bạn có thể lưu tệp bình thường và sau đó chạy trình chống phân mảnh của hệ điều hành. Sau đó, bạn có thể kiểm tra với câu trả lời này nếu tệp của bạn nằm trong một mảnh, nếu không, lặp lại. Đây là cách dễ nhất để làm điều đó, không cần sử dụng các lệnh hoặc chương trình bên ngoài, nhưng chắc chắn đây không phải là phương pháp nhanh nhất, vì nó chống phân mảnh toàn bộ đĩa của bạn.


1
"Chạy trình chống phân mảnh"? Có một chương trình như vậy? Điều duy nhất tìm thấy khi tôi tìm kiếm aptitude search ~ddefragddrescueviewnidsthư viện sắp xếp lại phân đoạn TCP. Câu trả lời của bạn sẽ không hữu ích nếu bạn không nói chương trình được gọi là gì, hoặc những đối số nào cần được thông qua.
Toby Speight

1
@TobySpeight - vâng, có một trình chống phân mảnh; e4defrag.
ravery
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.