Лучше использовать локальный запуск rm -rf вместо nfs?

10

Будет ли иметь большую разницу во времени, чтобы войти в систему на компьютере, на котором есть каталог, перед тем как делать это rm -rfв каталоге, или только rm -rfв каталоге через NFS?

steviekm3
источник

Ответы:

11

Конечно, ssh - лучше.

Nfs использует сложный сетевой протокол с различными удаленными вызовами процедур и временем ожидания синхронизации данных. В случае с ssh они не применяются.

Кроме того, есть много замков. Удаление файла в NFS работает следующим образом:

  1. ваша rmкоманда дает unlink()системный вызов
  2. Драйвер NFS преобразует его в запрос Sunrpc, отправляет его на сервер NFS
  3. NFS-сервер преобразует этот запрос Sunrpc обратно в unlink()вызов
  4. выполняет этот unlink()вызов на удаленной стороне
  5. после того, как это успешно, возвращает клиенту ответное сообщение rpc, эквивалентное «все в порядке, это сделано» клиенту
  6. драйвер ядра на стороне клиента преобразует это обратно в код завершения 0 unlink()вызова вашего оригиналаrm
  7. rm переходит к следующему файлу, перейти к 1

Теперь главное: между 2-7, rmприходится ждать. Он может отправлять следующий unlink()вызов асинхронно, но это однопоточный, не ориентированный на события инструмент. Даже если бы он мог, он все равно потребовал бы хитрых флагов монтирования nfs. Пока не получится результат, он ждет.

Nfs - и любая сетевая файловая система - всегда намного медленнее.


Во многих случаях вы можете сделать рекурсивные удаления квази-бесконечной скоростью с помощью хитрости:

  1. Сначала переместите каталог на другое имя ( mv -vf oldfilms oldfilms-)
  2. Удалить в фоновом режиме ( rm -rf oldfilms- &)

Из многих (но не всех) аспектов это удаление каталога будет выглядеть так, как если бы оно произошло практически за нулевое время.


Расширение: как @ el.pascado упоминает в своем превосходном комментарии, фактически 2-7 должно запускаться 3x для любых файлов:

  • определить, является ли это файл или каталог (с помощью lstat()системного вызова),
  • тогда делай соответственно. В случае обычных файлов, unlink()в случае каталогов, opendir()рекурсивное удаление всех файлов / каталогов в нем, а затем closedir(), наконец rmdir().
  • наконец, перейдите к следующей записи каталога с помощью readdir()вызова.

Для этого требуется 3 RPC-команды nfs для файлов и дополнительные 3 для каталогов.

Петер - Восстановить Монику
источник
2
Дело NFS еще хуже. Поскольку вопрос упоминает -rфлаг, rmон должен сначала проверить, является ли файл каталогом ( lstatчерез nfs), открыть его ( opendirчерез nfs), прочитать его содержимое ( readdirчерез nfs), и только затем выполнить фактическое удаление, как описано в ответе для каждого файла, найденного внутри, и вернувшись в подкаталоги, закройте каталог ( closedirчерез nfs), а затем повторите для каждого найденного каталога .
el.pescado
5

Да. Хорошо, может быть. По-разному. Для небольшого количества файлов и каталогов это не будет иметь большого значения.

Массовое выполнение файловых операций в подключенном каталоге NFS. Если у вас есть возможность войти на сам сервер NFS и выполнить их в реальном каталоге, то это будет быстрее.

Давайте проверим это, удалив коллекцию портов OpenBSD, которую я извлек из CVS и смонтировал поверх NFS:

На сервере 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

На клиенте (после восстановления исходных файлов из резервной копии):

$ time rm -rf /usr/ports/*
6m49.73s real     0m01.55s user     1m08.96s system
Кусалананда
источник