tập tin tối đa cho mỗi thư mục trong ext4


16

Tôi quản lý một ứng dụng có chứa một filestore trong đó tất cả các tệp được lưu trữ với tên tệp bằng với tổng md5 của chúng. Tất cả các tập tin được lưu trữ trong một thư mục. Hiện tại có hàng ngàn, nhưng sẽ sớm có hàng triệu tệp trên máy chủ. Máy chủ hiện tại đang chạy Ubuntu 11.10 trên hệ thống tệp ext4.

Có người nói với tôi rằng không nên để nhiều tệp vào một thư mục, vì điều này sẽ tạo ra sự gia tăng đáng kể về thời gian tra cứu và độ tin cậy (anh ta có một câu chuyện về các tệp tối đa mà một thư mục duy nhất có thể trỏ đến, dẫn đến một danh sách liên kết lớn). Thay vào đó, ông đề nghị tạo các thư mục con với các chuỗi con của tên tệp. Tuy nhiên, điều này sẽ làm cho một số thứ trong ứng dụng của tôi trở nên cồng kềnh hơn nhiều.

Điều này vẫn đúng hay các hệ thống tập tin hiện đại (ví dụ ext4) có nhiều cách hiệu quả hơn để giải quyết vấn đề này và quy mô tự nhiên? Wikipedia có một số chi tiết về các hệ thống tệp, nhưng nó không thực sự nói gì về các tệp tối đa trên mỗi thư mục hoặc thời gian tra cứu.

Câu trả lời:


8

Các ext3hệ thống tập tin và sau này hỗ trợ lập chỉ mục thư mục B-cây băm . Điều này quy mô rất tốt miễn là các hoạt động duy nhất bạn làm là thêm, xóa và truy cập theo tên. Tuy nhiên, tôi vẫn sẽ khuyên bạn nên phá vỡ các thư mục. Nếu không, bạn tạo ra một cái bẫy mìn nguy hiểm cho các công cụ ( updatedb, ls, du, và vân vân) mà thực hiện các hoạt động khác trên các thư mục có thể nổ tung nếu thư mục có quá nhiều mục.


8

Cốt lõi của vấn đề là đào qua thư mục inode cho một tệp bạn muốn. Một số hệ thống tập tin làm điều này tốt hơn so với những người khác. Một số tỷ lệ gần hàng tỷ, nhưng nếu bạn chỉ có ... 20K tệp thì việc truy cập vào các tệp đó nhanh hơn rõ rệt. Ngoài ra, số lượng tệp lớn tạo ra sự cố cho một số công cụ nhất định và có thể khiến việc sao lưu / khôi phục trở thành vấn đề khó khăn hơn nhiều.

Khi điều đó xảy ra, tôi gặp phải vấn đề chính xác trong quá trình phát triển của chúng tôi (md5sum là tên tệp, nhân rộng chúng). Những gì tôi khuyên các nhà phát triển của chúng tôi là cắt chuỗi thành từng mảnh. Họ đã đi với nhóm 4 người, nhưng trên hệ thống tập tin chúng tôi đã có mặt vào thời điểm đó thậm chí nhiều người sẽ chứng minh có vấn đề từ góc độ hiệu suất, vì vậy họ đã kết thúc việc chia thành nhóm 3 cho 6 bộ ba đầu tiên và để phần còn lại là tên tệp trong thư mục đầu cuối.

Nhóm 4: 4976/d70b/180c/6142/c617/d0c8/9d0b/bd2b.txt
Nhóm 3:497/6d7/0b1/80c/614/2c6/17d0c89d0bbd2b.txt

Điều này có lợi thế là giữ kích thước thư mục nhỏ và vì MD5sum khá ngẫu nhiên, nó sẽ tạo ra các cây thư mục cân bằng. Thư mục cuối cùng đó dường như không bao giờ nhận được nhiều hơn một vài tệp. Và không khó để làm việc với mã của chúng tôi. Chúng tôi làm việc với nhiều triệu dự án tệp, vì vậy việc nhân rộng là rất quan trọng đối với chúng tôi.


4
Chỉ cần thận trọng rằng nếu kẻ tấn công có tài nguyên tính toán, anh ta có thể cố tình tạo dữ liệu độc hại sẽ rơi vào cùng một thư mục. Kẻ tấn công có tài nguyên tốt và công nghệ ngày nay có thể tạo ra các giá trị băm có cùng 9 chữ số hex đầu tiên (và do đó va chạm trong ba cấp độ thư mục đầu tiên) với tốc độ khoảng một cứ sau mười phút. Và, tất nhiên, băm MD5 đầy đủ có thể được tạo ra ngày hôm nay.
David Schwartz

5

Các hệ thống tệp hiện đại xử lý các thư mục rất lớn rất tốt, thậm chí đến hàng triệu tệp. Nhưng các công cụ thông thường thì không. Ví dụ, việc liệt kê một thư mục lớn như vậy với "ls" sẽ mất khá nhiều thời gian vì nó thường sẽ đọc toàn bộ thư mục và sắp xếp nó (mặc dù bạn có thể sử dụng ls -f để tránh sắp xếp). Nó sẽ không bắt đầu hiển thị các tập tin cho đến khi tất cả được đọc. Việc tách tên giúp trong một số trường hợp, nhưng không phải tất cả (ví dụ, sao chép rsync vẫn có thể cần phải thu thập toàn bộ cây tên).


-1

Tôi có thể đề nghị sử dụng cơ sở dữ liệu SQL thay thế không? Điều này có thể sẽ biến điểm yếu nhận thức này trong ứng dụng của bạn thành một điểm mạnh.

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.