Tốt hơn để sử dụng rm -rf chạy cục bộ thay vì trên nfs?


10

Nó sẽ làm cho nhiều sự khác biệt về thời gian để đăng nhập vào máy có thư mục trước khi thực hiện một rm -rfthư mục, hoặc chỉ rm -rfthư mục trên NFS?

Câu trả lời:


11

Tất nhiên ssh là tốt hơn.

Nfs sử dụng một giao thức mạng phức tạp với nhiều cuộc gọi thủ tục từ xa và thời gian chờ đồng bộ hóa dữ liệu. Trong trường hợp của ssh, những điều này không áp dụng.

Hơn nữa, có nhiều ổ khóa. Xóa tệp trong nfs hoạt động theo cách này:

  1. bạn rmlệnh cho các unlink()syscall
  2. Trình điều khiển nfs chuyển đổi nó thành một yêu cầu sunrpc, gửi nó đến máy chủ nfs
  3. máy chủ nfs chuyển đổi yêu cầu sunrpc này trở lại unlink()cuộc gọi
  4. thực hiện unlink()cuộc gọi này ở phía xa
  5. sau khi thành công, trả lại thông điệp trả lời rpc tương đương với "được rồi, xong rồi" cho khách hàng
  6. trình điều khiển hạt nhân của phía máy khách chuyển đổi mã này trở lại mã thoát 0 của unlink()cuộc gọi ban đầu của bạnrm
  7. rm Lặp lại tập tin tiếp theo, goto 1

Bây giờ, điều quan trọng là: giữa 2-7, rmphải chờ. Nó có thể gửi unlink()cuộc gọi tiếp theo không đồng bộ, nhưng nó là một công cụ đơn luồng, không hướng sự kiện. Ngay cả nếu có thể, nó vẫn sẽ yêu cầu các cờ gắn nfs khó khăn. Cho đến khi nó không nhận được kết quả, nó chờ đợi.

Nfs - và bất kỳ hệ thống tập tin mạng nào - luôn chậm hơn nhiều.


Trong nhiều trường hợp, bạn có thể thực hiện xóa đệ quy tốc độ vô hạn bằng một mẹo:

  1. Đầu tiên di chuyển thư mục đến một tên khác ( mv -vf oldfilms oldfilms-)
  2. Xóa trong nền ( rm -rf oldfilms- &)

Từ nhiều khía cạnh (nhưng không phải tất cả), việc loại bỏ thư mục này sẽ trông như thể nó đã xảy ra trong thời gian thực tế bằng không.


Tiện ích mở rộng: Như @ el.pascado đề cập trong nhận xét xuất sắc của mình, thực sự 2-7 phải chạy 3x cho bất kỳ tệp nào:

  • để xác định xem đó là một tập tin hay một thư mục (với một lstat()tòa nhà chọc trời),
  • sau đó làm theo. Trong trường hợp của các tệp thông thường unlink(), trong trường hợp của các thư opendir()mục closedir(), cuối cùng sẽ xóa tất cả các tệp / thư mục trong đó rmdir().
  • cuối cùng, lặp lại mục nhập thư mục tiếp theo với một readdir()cuộc gọi.

Điều này, nó yêu cầu 3 lệnh NPC RPC cho các tệp và thêm 3 cho các thư mục.


2
Các trường hợp nfs thậm chí còn tồi tệ hơn. Vì câu hỏi đề cập đến -rcờ, rmtrước tiên phải kiểm tra xem tệp có phải là thư mục ( lstatqua nfs) không, mở tệp ( opendirqua nfs), đọc nội dung của nó ( readdirqua nfs) và sau đó chỉ thực hiện xóa thực tế như được mô tả trong câu trả lời trên mỗi tệp được tìm thấy bên trong và đệ quy vào thư mục con, đóng thư mục ( closedirthông qua nfs) và sau đó lặp lại, cho mỗi thư mục tìm thấy.
el.pescado

5

Đúng. Vâng, có lẽ. Nó phụ thuộc. Đối với một số lượng nhỏ tệp và thư mục, nó sẽ không có nhiều khác biệt.

Thực hiện thao tác tệp hàng loạt trên một thư mục được gắn NFS là chậm. Nếu bạn có cơ hội đăng nhập vào máy chủ NFS và thực hiện chúng trên thư mục thực tế, thì việc này sẽ nhanh hơn.

Hãy kiểm tra nó bằng cách xóa bộ sưu tập cổng OpenBSD mà tôi đã kiểm tra từ CVS và gắn trên NFS:

Trên máy chủ NFS:

$ cd /export/shared/ports

$ du -hs .
2.6G    .

$ find . | wc -l
  179688

$ time rm -rf /export/shared/ports/*
0m20.87s real     0m00.12s user     0m04.62s system

Trên máy khách (sau khi khôi phục các tệp gốc từ bản sao lưu):

$ time rm -rf /usr/ports/*
6m49.73s real     0m01.55s user     1m08.96s system
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.