Краще використовувати локальний rm -rf замість nfs?


10

Чи має велику різницю час увійти на машину, у якій є каталог, перш ніж робити в rm -rfкаталозі, або просто rm -rfна каталог через NFS?

Відповіді:


11

Звичайно, ssh - тим краще.

Nfs використовує складний мережевий протокол з різними віддаленими викликами процедур та синхронізацією даних. Що стосується ssh, вони не застосовуються.

Крім того, є багато замків. Видалення файлу в nfs працює таким чином:

  1. ваша rmкоманда дає unlink()syscall
  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 має працювати 3 рази для будь-яких файлів:

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

Для цього потрібні 3 nfs команди RPC для файлів та додаткові 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.