Số lượng tệp tối đa trong một thư mục ext3 trong khi vẫn có hiệu suất chấp nhận được?


25

Tôi có một ứng dụng ghi vào thư mục ext3 mà theo thời gian đã tăng lên khoảng ba triệu tệp. Không cần phải nói, đọc danh sách tập tin của thư mục này là chậm không thể chịu được.

Tôi không đổ lỗi cho ext3. Giải pháp thích hợp sẽ là để mã ứng dụng ghi vào các thư mục con, ./a/b/c/abc.extthay vì chỉ sử dụng ./abc.ext.

Tôi đang thay đổi cấu trúc thư mục con như vậy và câu hỏi của tôi chỉ đơn giản là: tôi nên lưu trữ bao nhiêu tệp trong một thư mục ext3 trong khi vẫn đạt được hiệu suất chấp nhận được? Kinh nghiệm của bạn là gì?

Hay nói cách khác; giả sử rằng tôi cần lưu trữ ba triệu tệp trong cấu trúc, cấu trúc nên sâu bao nhiêu cấp ./a/b/c/abc.ext?

Rõ ràng đây là một câu hỏi không thể trả lời chính xác, nhưng tôi đang tìm kiếm một ước tính công viên bóng.

Câu trả lời:


12

Miễn là bạn có một bản phân phối hỗ trợ dir_indexkhả năng thì bạn có thể dễ dàng có 200.000 tệp trong một thư mục. Tôi sẽ giữ nó ở mức khoảng 25.000, để đảm bảo an toàn. Không có dir_index, cố gắng giữ nó ở mức 5.000.


10

Hãy RẤT cẩn thận với cách bạn chọn chia thư mục. "A / b / c" nghe có vẻ như là một công thức cho thảm họa đối với tôi ...

Đừng chỉ mù quáng thực hiện một cấu trúc thư mục sâu, nói 100 mục ở cấp đầu tiên, 100 mục ở cấp thứ hai, 100 mục trong cấp thứ ba. Tôi đã ở đó, đã làm điều đó, có chiếc áo khoác và phải cơ cấu lại nó khi hiệu suất đi vào crapper với vài triệu tệp. :-)

Chúng tôi có một khách hàng thực hiện bố cục "nhiều thư mục" và cuối cùng chỉ đưa một đến năm tệp cho mỗi thư mục và điều này đã giết chết chúng. 3 đến 6 giờ để thực hiện "du" trong cấu trúc thư mục này. Vị cứu tinh ở đây là SSD, họ không sẵn lòng viết lại phần này của ứng dụng của họ và một ổ SSD đã làm mất thời gian này từ vài giờ đến vài phút.

Vấn đề là mỗi cấp độ tìm kiếm thư mục cần tìm kiếm, và tìm kiếm là cực kỳ tốn kém. Kích thước của thư mục cũng là một yếu tố, vì vậy có nó nhỏ hơn thay vì lớn hơn là một chiến thắng lớn.

Để trả lời câu hỏi của bạn về số lượng tệp trên mỗi thư mục, 1.000 tôi đã nghe nói là "tối ưu" nhưng hiệu suất ở mức 10.000 dường như vẫn ổn.

Vì vậy, những gì tôi muốn giới thiệu là một cấp độ thư mục, mỗi cấp độ là một thư mục dài 2 ký tự, bao gồm các chữ cái viết hoa và viết thường và các chữ số, cho khoảng 3800 thư mục ở cấp cao nhất. Sau đó, bạn có thể giữ các tệp 14M với các thư mục con chứa 3800 tệp hoặc khoảng 1.000 tệp cho mỗi thư mục con cho các tệp 3M.

Tôi đã thực hiện một thay đổi như thế này cho một khách hàng khác và nó đã tạo ra một sự khác biệt lớn.


6

Tôi khuyên bạn nên thử kiểm tra các kích cỡ thư mục khác nhau bằng một công cụ đo điểm chuẩn như dấu bưu điện , bởi vì có rất nhiều biến số như kích thước bộ đệm (cả trong HĐH và trong hệ thống con đĩa) phụ thuộc vào môi trường cụ thể của bạn.

Nguyên tắc cá nhân của tôi là nhắm đến kích thước thư mục <= 20k tệp, mặc dù tôi đã thấy hiệu suất tương đối tốt với tối đa 100k tệp / thư mục.


3

Tôi có tất cả các tập tin đi thư mục như:

tải lên / [ngày] / [giờ] /yo.png

và không có bất kỳ vấn đề hiệu suất.


4
Và bạn nhận được bao nhiêu tập tin mỗi giờ?
Cascabel


2

Tôi có thể xác nhận trên một máy chủ khá mạnh với nhiều bộ nhớ trong một tải khá tốt rằng 70.000 tệp có thể gây ra tất cả các loại tàn phá. Tôi đã xóa một thư mục bộ đệm với 70k tệp trong đó và nó khiến apache bắt đầu sinh ra các thể hiện mới cho đến khi nó đạt tối đa 255 và hệ thống sử dụng tất cả bộ nhớ trống (16gb mặc dù thể hiện ảo có thể thấp hơn). Dù bằng cách nào, giữ nó dưới 25.000 có lẽ là một động thái rất thận trọng


1

Theo kinh nghiệm của tôi, cách tiếp cận tốt nhất là không thiết kế quá mức cấu trúc tệp trước. Như đã đề cập trong ít nhất một câu trả lời khác, có các phần mở rộng hệ thống tập tin liên quan đến kết thúc vấn đề hiệu năng.

Vấn đề mà tôi đã gặp phải thường xuyên hơn là khả năng sử dụng vào cuối hành chính. Số lượng công việc ít nhất bạn có thể làm để giảm số lượng tệp trong một thư mục có lẽ là cách tiếp cận bạn cần ngay bây giờ.

sqrt (3_000_000) == 1732

Một vài ngàn tệp trong một thư mục nghe có vẻ hợp lý với tôi. Hãy là thẩm phán của riêng bạn cho tình huống của riêng bạn. Để đạt được điều này, hãy thử chia các tệp thành một cấp thư mục băm duy nhất sao cho số lượng tệp trung bình trên mỗi thư mục gần bằng với số lượng thư mục.

Với ví dụ của bạn này sẽ là ./a/abc.ext, ./ab/abc.ext, ./abc/abc.ext, ....

Sự lây lan của các tập tin sẽ phụ thuộc rất nhiều vào tên tập tin thực tế. Hãy tưởng tượng áp dụng kỹ thuật này vào một thư mục gồm một triệu tệp được đặt tên foobar???.txt. Có nhiều cách để đạt được mức chênh lệch cao hơn, như băm dựa trên giá trị của một số bit cụ thể từ tổng MD5 của mỗi tên tệp, nhưng tôi sẽ dám đoán rằng sẽ quá mức cho những gì bạn đang cố gắng thực hiện.


1

Hmm, tôi đọc bài viết này gần đây . Về cơ bản, bạn tận dụng việc phân phối thuật toán băm yêu thích của mình. Tôi bắt đầu chơi với các số, một INT có chữ ký MySQL có giá trị tối đa là 2147483647. Bạn cũng có thể thay đổi số lượng tệp mong muốn cho mỗi thư mục và số thư mục con để xử lý số thư mục / tệp phụ cuối cùng- phân chia theo thư mục cho một tập dữ liệu nhất định, nhưng thật khó để tìm thấy bằng chứng thực nghiệm về các tổ chức thư mục / tệp tối ưu. Bài viết này cung cấp một số cái nhìn sâu sắc về sự khác biệt hiệu suất giữa các hệ thống tập tin (một số số liệu thú vị), nhưng không có gì về các tổ chức tối ưu.


0

Tôi nghĩ rằng bạn đang suy nghĩ quá nhiều về điều này. Nếu bạn thậm chí đã chọn một cấp độ thư mục bổ sung duy nhất và có thể cân bằng mọi thứ một cách đồng đều, bạn sẽ có 1732 * thư mục và 1732 tệp cho mỗi thư mục.

Trừ khi bạn có kế hoạch cần hàng chục tỷ tệp, bạn có thể chọn một số từ 1000 đến 100.000 và nhận được kết quả tốt.

* căn bậc 3 triệu.

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.