Hệ thống tập tin số lượng lớn các tập tin trong một thư mục


29

OK, không quá lớn nhưng tôi cần sử dụng một cái gì đó trong đó khoảng 60.000 tệp có kích thước trung bình 30kb được lưu trữ trong một thư mục (đây là một yêu cầu để không thể đơn giản xâm nhập vào các thư mục con với số lượng tệp nhỏ hơn).

Các tệp sẽ được truy cập ngẫu nhiên, nhưng một khi được tạo sẽ không có ghi vào cùng một hệ thống tệp. Tôi hiện đang sử dụng Ext3 nhưng thấy nó rất chậm. Bất kỳ đề xuất?


3
Tại sao họ phải ở trong một thư mục?
Kyle Brandt

1
Tôi cũng quan tâm đến câu trả lời cập nhật cho câu hỏi ban đầu, được cung cấp đủ các cải tiến trong xfs và ext4.

Câu trả lời:


15

Bạn nên xem xét XFS. Nó hỗ trợ một số lượng lớn các tệp cả ở hệ thống tệp và ở cấp thư mục và hiệu suất vẫn tương đối phù hợp ngay cả với một số lượng lớn các mục nhập do cấu trúc dữ liệu cây B +.

Có một trang trên wiki của họ cho một số lượng lớn các bài báo và ấn phẩm mô tả chi tiết thiết kế. Tôi khuyên bạn nên dùng thử và đánh giá nó so với giải pháp hiện tại của bạn.


theo các slide trong câu trả lời của @ nelaar, ext4 sẽ vượt trội hơn xfs cho nhiệm vụ này.
mulllhausen

13

Một tỷ tệp trên Linux

Tác giả của bài viết này đào sâu vào một số vấn đề về hiệu năng trên các hệ thống tệp có số lượng tệp lớn và thực hiện một số so sánh tốt về hiệu suất của các hệ thống tệp khác nhau ext3, ext4 và XFS. Điều này được thực hiện như là một trình chiếu. http://events.linuxfoundation.org/slides/2010/linuxcon2010_wheeler.pdf

thời gian để chạy mkfs Thời gian để tạo các tệp 1M 50kb Thời gian sửa chữa hệ thống tập tin xóa tập tin 1m


2
Chúng tôi thực sự thích câu trả lời chứa nội dung không phải con trỏ đến nội dung. Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
user9517 hỗ trợ GoFundMonica

@ Tôi hy vọng điều đó tốt hơn, vì chỉ cần tải xuống bản PDF, sẽ cung cấp cho bạn thông tin tương tự.
nelaaro

19
wow đây là một số đồ thị đặc biệt khó đọc. ~
ThorSummoner

8

Nhiều tệp trong một thư mục trên ext3 đã được thảo luận về chiều dài tại trang web chị em stackoverflow.com

Theo tôi, 60 000 tệp trong một thư mục trên ext3 là không lý tưởng nhưng tùy thuộc vào các yêu cầu khác của bạn, nó có thể đủ tốt.


5

ĐƯỢC. Tôi đã thực hiện một số thử nghiệm sơ bộ bằng cách sử dụng ReiserFS, XFS, JFS, Ext3 (bật dir_hash) và Ext4dev (kernel 2.6.26). Ấn tượng đầu tiên của tôi là tất cả đều đủ nhanh (trên máy trạm mạnh mẽ của tôi) - hóa ra máy sản xuất từ ​​xa có bộ xử lý khá chậm.

Tôi đã trải nghiệm một số điều kỳ lạ với ReiserFS ngay cả khi thử nghiệm ban đầu để loại trừ điều đó. Có vẻ như JFS có yêu cầu CPU ít hơn 33% so với tất cả những cái khác và do đó sẽ kiểm tra điều đó trên máy chủ từ xa. Nếu nó hoạt động đủ tốt, tôi sẽ sử dụng nó.


5

Tôi đang viết một ứng dụng cũng lưu trữ rất nhiều tập tin mặc dù của tôi lớn hơn và tôi có 10 triệu trong số chúng sẽ được chia trên nhiều thư mục.

ext3 chậm chủ yếu là do triển khai "danh sách liên kết" mặc định. Vì vậy, nếu bạn có nhiều tệp trong một thư mục, điều đó có nghĩa là mở hoặc tạo tệp khác sẽ ngày càng chậm hơn. Có một thứ gọi là chỉ số htree có sẵn cho ext3 giúp cải thiện mọi thứ rất nhiều. Nhưng, nó chỉ có sẵn khi tạo hệ thống tập tin. Xem tại đây: http://lonesysadmin.net/2007/08/17/use-dir_index-for-your-new-ext3-filesystems/

Vì dù sao bạn cũng sẽ phải xây dựng lại hệ thống tập tin và do những hạn chế của ext3, nên tôi khuyên bạn nên sử dụng ext4 (hoặc XFS). Tôi nghĩ ext4 nhanh hơn một chút với các tệp nhỏ hơn và được xây dựng lại nhanh hơn. Chỉ số Htree được mặc định trên ext4 theo như tôi biết. Tôi thực sự không có bất kỳ kinh nghiệm nào với JFS hoặc Reiser nhưng tôi đã nghe mọi người khuyên điều đó trước đây.

Trong thực tế, tôi có thể kiểm tra một số hệ thống tập tin. Tại sao không thử ext4, xfs & jfs và xem cái nào cho hiệu suất tổng thể tốt nhất?

Một cái gì đó mà một nhà phát triển nói với tôi rằng có thể tăng tốc mọi thứ trong mã ứng dụng không phải là thực hiện cuộc gọi "stat + open" mà là "open + fstat". Cái thứ nhất chậm hơn đáng kể so với cái thứ hai. Không chắc chắn nếu bạn có bất kỳ kiểm soát hoặc ảnh hưởng về điều đó.

Xem bài viết của tôi ở đây trên stackoverflow. Lưu trữ và truy cập tới 10 triệu tệp trong Linux, có một số câu trả lời và liên kết rất hữu ích ở đó.


3

Sử dụng Tune2fs để kích hoạt dir_index có thể giúp ích. Để xem nếu nó được kích hoạt:

sudo tune2fs -l /dev/sda1 | grep dir_index

Nếu nó không được kích hoạt:

sudo umount /dev/sda1   
sudo tune2fs -O dir_index /dev/sad1
sudo e2fsck -D /dev/sda1
sudo mount /dev/sda1

Nhưng tôi có cảm giác bạn có thể đang đi sai đường ... tại sao không tạo ra một chỉ mục phẳng và sử dụng một số mã để chọn ngẫu nhiên dựa trên đó. Sau đó, bạn có thể sử dụng các thư mục con cho cấu trúc cây được tối ưu hóa hơn.


1
đã /dev/sad1cố ý để ngăn chặn lỗi sao chép / mì ống?
Anwar

2

ext3 trở xuống hỗ trợ tối đa 32768 tệp cho mỗi thư mục. ext4 hỗ trợ tới 65536 số lượng tệp thực tế, nhưng sẽ cho phép bạn có nhiều hơn (nó sẽ không lưu trữ chúng trong thư mục, điều này không quan trọng đối với hầu hết các mục đích của người dùng).

Ngoài ra, cách các thư mục được lưu trữ trên hệ thống tập tin ext * về cơ bản là một danh sách lớn. Trên các hệ thống tệp hiện đại hơn (Reiser, XFS, JFS), chúng được lưu trữ dưới dạng cây B, hiệu quả hơn nhiều đối với các bộ lớn.


2
hỗ trợ số lượng tệp trong thư mục không giống như thực hiện ở tốc độ hợp lý. Tôi vẫn chưa biết liệu ext4 có tốt hơn không, nhưng ext3 chậm đi rất nhiều khi nó có hơn một vài nghìn tệp trong một thư mục, ngay cả khi dir_index được bật (nó giúp, nhưng không loại bỏ hoàn toàn vấn đề).
cas

1

Bạn có thể lưu trữ tệp inode thay vì tên tệp: truy cập số inode sẽ nhanh hơn nhiều khi giải quyết tên tệp


Bây giờ nói với tôi. Làm thế nào để bạn mở một tập tin bằng số inode?
Matt

1
@Matt, Có vẻ như câu hỏi đã thay đổi sau khi tôi trả lời. Hoặc tôi đã ngu ngốc hơn nhiều 1,5 năm trước :)))
kolypto

0

Bạn không muốn nhồi nhét nhiều tệp trong một thư mục, bạn muốn một số loại cấu trúc. Ngay cả khi đó là một cái gì đó đơn giản như có các thư mục con bắt đầu bằng ký tự đầu tiên của tệp có thể cải thiện thời gian truy cập của bạn. Một mẹo ngớ ngẩn khác mà tôi muốn sử dụng, đó là buộc hệ thống cập nhật bộ đệm của nó với siêu dữ liệu là chạy updateb thường xuyên. Trong một cửa sổ chạy slabtop, và trong một lần chạy khác được cập nhật và bạn sẽ thấy nhiều bộ nhớ sẽ được phân bổ vào bộ nhớ đệm. Cách này nhanh hơn nhiều.


-1

Bạn đã không chỉ định loại dữ liệu trong các tệp này. Nhưng từ âm thanh của nó, bạn nên sử dụng một số loại cơ sở dữ liệu với lập chỉ mục để tìm kiếm nhanh.


-1

Hệ thống tập tin có lẽ không phải là lưu trữ lý tưởng cho yêu cầu như vậy. Một số loại lưu trữ cơ sở dữ liệu là tốt hơn. Tuy nhiên, nếu bạn không thể giúp nó, thì hãy thử chia nhỏ các tệp trong một số thư mục và sử dụng unionfs để gắn kết (liên kết) các thư mục đó trên một thư mục mà bạn muốn tất cả các tệp xuất hiện. Tôi chưa sử dụng kỹ thuật này để tăng tốc chút nào, nhưng nó đáng để thử.

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.