2008-11-03 31 views
7

Tôi có một máy chủ web lưu tệp bộ nhớ cache và giữ chúng trong 7 ngày. Tên tệp là băm md5, tức là chính xác 32 ký tự hex và được giữ trong cấu trúc cây trông như sau:xử lý nhiều tệp tạm thời nhỏ

00/ 
    00/ 
    00000ae9355e59a3d8a314a5470753d8 
    . 
    . 
00/ 
    01/ 

Bạn hiểu ý tưởng.

Vấn đề của tôi là xóa tệp cũ mất nhiều thời gian. Tôi có một công việc cron hàng ngày chạy

find cache/ -mtime +7 -type f -delete 

mất hơn nửa ngày để hoàn thành. Tôi lo lắng về khả năng mở rộng và hiệu ứng này có trên hiệu suất của máy chủ. Ngoài ra, thư mục bộ nhớ cache hiện là một lỗ đen trong hệ thống của tôi, thường xuyên bị bẫy du hoặc find vô tội.

Giải pháp chuẩn cho bộ nhớ cache LRU là một số loại đống. Có cách nào để mở rộng quy mô này đến mức hệ thống tập tin không? Có cách nào khác để thực hiện điều này theo cách giúp dễ quản lý hơn không?

Dưới đây là ý tưởng tôi coi:

  1. Tạo 7 thư mục hàng đầu, một cho mỗi ngày trong tuần, và trống rỗng một thư mục mỗi ngày. Điều này làm tăng thời gian tìm kiếm cho một tập tin bộ nhớ cache 7 lần, làm cho nó thực sự phức tạp khi một tập tin được ghi đè, và tôi không chắc chắn những gì nó sẽ làm gì để xóa thời gian.
  2. Lưu tệp dưới dạng bảng màu trong bảng MySQL có chỉ mục về tên và ngày tháng. Điều này có vẻ hứa hẹn, nhưng trong thực tế nó luôn luôn chậm hơn nhiều so với FS. Có lẽ tôi không làm đúng.

Bất kỳ ý tưởng nào?

Trả lời

15

Khi bạn lưu trữ tệp, hãy tạo liên kết tượng trưng đến cấu trúc thư mục thứ hai được sắp xếp theo ngày, không theo tên.

Truy xuất tệp của bạn bằng cấu trúc "tên", xóa chúng bằng cấu trúc "ngày".

+0

Bugger :) Bạn đánh tôi với nó. +1 câu trả lời này. –

+0

Chỉ cần chắc chắn xóa cả tệp gốc và liên kết. Bạn không muốn có nhiều liên kết chết ở đó và cũng dễ dàng xóa liên kết và không xóa tệp gốc. –

0

Cách có bảng trong cơ sở dữ liệu sử dụng hàm băm làm khóa. Trường khác sau đó sẽ là tên của tệp. Bằng cách đó, tệp có thể được lưu trữ trong một thời trang liên quan đến ngày để xóa nhanh và cơ sở dữ liệu có thể được sử dụng để tìm vị trí của tệp dựa trên băm theo cách nhanh chóng.

1

Reiserfs tương đối hiệu quả trong việc xử lý các tệp nhỏ. Bạn đã thử Linux khác nhau file systems? Tôi không chắc chắn về hiệu suất xóa - bạn có thể xem xét định dạng (mkfs) như là một thay thế cho xóa tập tin cá nhân. Ví dụ, bạn có thể tạo một hệ thống tệp khác (cache1, cache2, ...) cho mỗi ngày trong tuần.

1

Làm thế nào về điều này:

  • Có một thư mục có tên, nói rằng, "ToDelete"
  • Khi bạn thêm một mục mới, có được ngày hôm nay và tìm kiếm một thư mục con trong "ToDelete" rằng có một cái tên dấu hiệu của ngày hiện tại
  • Nếu nó không có ở đó, tạo ra nó
  • Thêm một liên kết tượng trưng đến mục mà bạn đã tạo ra trong thư mục hiện nay
  • tạo một công việc định kỳ mà đi vào thư mục trong "ToDelete", đó là của cor rect ngày và xóa tất cả các thư mục được liên kết.
  • Xóa thư mục chứa tất cả các liên kết.
4

Giả sử đây là ext2/3 bạn đã thử thêm vào các thư mục được lập chỉ mục chưa? Khi bạn có một số lượng lớn các tệp trong bất kỳ thư mục cụ thể nào, việc tra cứu sẽ rất chậm để xóa một số thứ.
sử dụng tune2fs -o dir_index để bật tùy chọn dir_index.
Khi lắp đặt hệ thống tệp, hãy đảm bảo sử dụng tùy chọn noatime, điều này sẽ dừng HĐH cập nhật thông tin thời gian truy cập cho các thư mục (vẫn cần sửa đổi chúng).
Nhìn vào bài đăng gốc, có vẻ như bạn chỉ có 2 cấp độ gián tiếp đối với các tệp, có nghĩa là bạn có thể có một số lượng lớn tệp trong các thư mục lá. Khi có hơn một triệu mục trong các mục này, bạn sẽ thấy rằng các tìm kiếm và thay đổi rất chậm. Cách khác là sử dụng phân cấp thư mục sâu hơn, giảm số lượng mục trong bất kỳ thư mục cụ thể nào, do đó giảm chi phí tìm kiếm và cập nhật cho thư mục riêng lẻ cụ thể.

Các vấn đề liên quan