Làm thế nào để lưu trữ bộ đệm hoặc tăng tốc tóm tắt `du`?


33

Chúng tôi có một hệ thống tệp lớn, trong đó một dubản tóm tắt (sử dụng đĩa) đầy đủ mất hơn hai phút. Tôi muốn tìm cách tăng tốc tóm tắt sử dụng đĩa cho các thư mục tùy ý trên hệ thống tệp đó.

Đối với các nhánh nhỏ, tôi nhận thấy rằng các dukết quả dường như được lưu trong bộ nhớ cache bằng cách nào đó, vì các yêu cầu lặp lại nhanh hơn nhiều, nhưng trên các nhánh lớn, tốc độ tăng lên không đáng kể.

Có cách nào đơn giản để tăng tốc duhoặc kết quả bộ nhớ đệm mạnh hơn cho các nhánh chưa được sửa đổi kể từ lần tìm kiếm trước không?

Hoặc có một lệnh thay thế có thể cung cấp tóm tắt sử dụng đĩa nhanh hơn?


8
Hai phút dường như không dài đối với tôi. Nhưng câu hỏi thực sự là: "Bạn có thực sự muốn du cache không?" Không nên cung cấp cho bạn số lượng khối đĩa chính xác, như hiện tại, có thể?
Bruce Ediger

Tôi đồng ý rằng việc thay thế dusẽ là xấu, nhưng một kịch bản trình bao bọc nhanh hơn với giao diện giống hệt nhau sẽ rất hữu ích cho chúng tôi. Hơn nữa, tôi hy vọng rằng kết quả bộ nhớ đệm phụ thuộc vào thời gian sửa đổi lần cuối (và giả sử không có hoạt động trên toàn bộ đĩa, ví dụ như chống phân mảnh) sẽ cho kết quả kích thước chính xác: tôi có thiếu gì không?
Ian Mackinnon

2
Nếu bạn lo lắng về việc sử dụng đĩa quá nhiều, bạn có thể cân nhắc thực hiện hạn ngạch.
pyasi

2
Bruce - bạn có thể hỏi cùng một câu hỏi về find. Nhưng sau đó có locate.
Yuval

Nếu bạn đang dùng Android , hãy xem StatFsước tính siêu nhanh về kích thước thư mục. Nó nhanh hơn gần 1000 lần đối với các thư mục lớn, phức tạp, so với du.
Joshua Pinter

Câu trả lời:


21

Những gì bạn đang thấy khi bạn chạy lại một lệnh du là hiệu ứng của bộ đệm đĩa. Khi bạn đọc một khối, bộ đệm đĩa của nó được giữ trong bộ đệm bộ đệm cho đến khi khối đó là cần thiết. Đối với du bạn cần đọc thư mục và inode cho mỗi tệp trong thư mục. Các kết quả du không được lưu trong bộ nhớ cache trong trường hợp này, nhưng có thể được dẫn xuất với IO đĩa ít hơn nhiều.

Mặc dù có thể buộc hệ thống lưu trữ thông tin này, nhưng hiệu năng tổng thể sẽ bị ảnh hưởng vì không gian bộ đệm cần thiết sẽ không có sẵn cho các tệp được truy cập tích cực.

Bản thân thư mục không biết một tệp lớn đến mức nào, do đó, mỗi nút của tệp cần được truy cập. Để luôn cập nhật giá trị được lưu trong bộ nhớ cache mỗi khi tệp thay đổi kích thước, giá trị được lưu trong bộ nhớ cache sẽ cần được cập nhật. Vì một tệp có thể được liệt kê trong 0 hoặc nhiều thư mục, điều này sẽ yêu cầu mỗi nút của tệp để biết thư mục nào được liệt kê. Điều này sẽ làm phức tạp đáng kể cấu trúc inode và làm giảm hiệu suất IO. Ngoài ra, vì du cho phép bạn nhận được kết quả giả định các kích thước khối khác nhau, dữ liệu được yêu cầu trong bộ đệm sẽ cần tăng hoặc giảm giá trị được lưu trong bộ đệm cho mỗi kích thước khối có thể làm chậm hiệu suất.


7

Nếu bạn có thể sắp xếp các cấu trúc phân cấp khác nhau của các tệp thuộc về các nhóm khác nhau, bạn có thể thiết lập hạn ngạch đĩa . Đừng đưa ra giới hạn trên (hoặc đặt kích thước của đĩa) trừ khi bạn muốn. Bạn vẫn có thể cho biết ngay lập tức bao nhiêu hạn ngạch (có hiệu quả vô hạn) mà nhóm đang sử dụng.

Điều này không yêu cầu hệ thống tập tin của bạn hỗ trợ hạn ngạch cho mỗi nhóm. Linux của Ext [234] và zfs của Solaris / * BSD / Linux. Sẽ tốt cho trường hợp sử dụng của bạn nếu hạn ngạch nhóm đưa ACL vào tài khoản, nhưng tôi không nghĩ họ làm vậy.


7

Việc sử dụng phổ biến ducó thể được tăng tốc rất nhiều bằng cách sử dụng ncdu.

ncdu - NCurses Disk Usage

thực hiện du, lưu trữ các kết quả và hiển thị chúng trong gui dòng lệnh tốt, có thể so sánh với du -hc -d 1 | sort -h. Việc lập chỉ mục ban đầu mất nhiều thời gian như nhau du, nhưng tìm kiếm "thủ phạm" thực sự lấp đầy không gian quý giá được tăng tốc, vì tất cả các thư mục con đều có sẵn thông tin được lưu trong bộ nhớ cache.

Nếu các thư mục con cần thiết có thể được làm mới bằng cách nhấn [r] và các tệp / thư mục có thể bị xóa bằng cách nhấn [d], cả hai đều cập nhật số liệu thống kê cho tất cả các thư mục mẹ. Xóa yêu cầu xác nhận.

Nếu không cần thiết, có thể tăng tốc hơn nữa bằng cách đặt trước ncdu -1xo- / | gzip >export.gzmột cronjob và sau đó truy cập nó zcat export.gz | ncdu -f-, nhưng rõ ràng cung cấp nhiều thông tin lỗi thời hơn.


7

Tôi thích sử dụng ageu

Agedu là một phần mềm cố gắng tìm các tệp cũ và được sử dụng không thường xuyên với giả định rằng các tệp này hầu như không muốn. (ví dụ: Tải xuống chỉ được xem một lần.)

Về cơ bản, nó thực hiện cùng một kiểu quét đĩa du, nhưng nó cũng ghi lại lần truy cập cuối cùng của mọi thứ mà nó quét. Sau đó, nó xây dựng một chỉ mục cho phép nó tạo ra các báo cáo một cách hiệu quả, tóm tắt các kết quả cho mỗi thư mục con, và sau đó nó tạo ra các báo cáo đó theo yêu cầu.


4
Không trả lời câu hỏi, nhưng vẫn +1. Mẹo hay.
0xC0000022L

Tôi đã chỉnh sửa câu hỏi để làm rõ hơn rằng điều này thực sự trả lời câu hỏi (từ lâu chỉ số sử dụng đĩa cũng như thời gian truy cập).
Anthony G - công lý cho Monica

5

Như được đề cập bởi SHW, ageduthực sự đã tạo ra một chỉ mục. Tôi nghĩ rằng tôi sẽ chia sẻ một cách khác để tạo một chỉ mục, sau khi đọc về locatedb. Bạn có thể tạo phiên bản của riêng bạn locatedbtừ duđầu ra:

du | awk '{print $2,$1}' | /usr/lib/locate/frcode > du.locatedb

awksắp xếp lại đầu ra du để có tên tệp trước, để nó frcodehoạt động đúng. Sau đó sử dụng locatevới cơ sở dữ liệu này để nhanh chóng báo cáo việc sử dụng đĩa:

locate --database=du.locatedb pingus

Bạn có thể mở rộng điều này cho phù hợp với nhu cầu của bạn. Tôi nghĩ rằng đó là một cách sử dụng tốt của locb.


3
duc

(xem https://duc.zevv.nl ) có thể là những gì bạn đang tìm kiếm.

Đức lưu trữ việc sử dụng đĩa trong cơ sở dữ liệu được tối ưu hóa, dẫn đến giao diện người dùng nhanh. Không có thời gian chờ đợi khi chỉ số hoàn thành.

Cập nhật chỉ mục rất nhanh đối với tôi (dưới 10 giây cho khoảng 950k tệp trong thư mục 121k, 2,8 TB). Có GUI và giao diện người dùng cũng như vậy.

Cách sử dụng, vd:

duc index /usr
duc ui /usr

Từ trang web:

Duc được xây dựng để mở rộng quy mô thành các hệ thống tập tin khổng lồ: nó sẽ lập chỉ mục và hiển thị hàng trăm triệu tệp trên petabyte lưu trữ mà không gặp vấn đề gì.


2

Tôi có một cronjob được thiết lập để chạy updateb cứ sau 10 phút. Giữ cho tất cả các bộ đệm hệ thống tập tin tốt đẹp và tươi. Cũng có thể sử dụng RAM giá rẻ cho một cái gì đó tốt. Sử dụng slabtop xem 'trước' và 'sau'.


Tôi không hiểu câu trả lời của bạn liên quan đến câu hỏi như thế nào. updatedbkhông nói gì về việc sử dụng đĩa. Nếu bạn đang làm điều đó chỉ để vượt qua đĩa, bạn sẽ làm giảm hiệu suất tổng thể.
Gilles 'SO- ngừng trở nên xấu xa'

3
Đếm kích thước tệp cho duchậm vì bạn phải truy cập siêu dữ liệu của một số lượng lớn tệp có khả năng, nằm rải rác xung quanh đĩa. Nếu bạn chạy updateb một cách mạnh mẽ, siêu dữ liệu cho tất cả các tệp sẽ bị buộc phải được lưu trữ trong RAM. Lần tới khi bạn chạy bất kỳ hoạt động nặng siêu dữ liệu nào khác, thay vì thực hiện hàng ngàn lần tìm kiếm trên các đĩa, bạn sử dụng bộ đệm. Thông thường, bạn có một cơ hội nhỏ để lưu trữ phần siêu dữ liệu cụ thể của cây đó. Với 'mồi bộ đệm siêu dữ liệu' của tôi, rất có thể dữ liệu bạn muốn được lưu trữ mới. Không tìm kiếm vật lý == NHANH CHÓNG.
Marcin

2

Nếu bạn chỉ cần biết kích thước của thư mục, bạn có thể tăng tốc nó lên rất nhiều bằng cách tránh ghi thông tin lên màn hình. Vì tổng số lớn là dòng cuối cùng của dulệnh, bạn chỉ cần đặt nó vào tail.

du -hc | tail -n 1

Cấu trúc thư mục 2GB chiếm hơn một giây cho danh sách đầy đủ nhưng chưa đến 5 giây với biểu mẫu này.


2
Tôi nghĩ du -hslà thuận tiện hơn cho mục đích đó.
Lepe

cũng--max-depth 1
stevesliva
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.