зграя (2) проти fcntl (2) над NFS


19

Документація Perl 5.x вказує, що для його реалізації flock (..) буде використовуватися один із наступних нативних викликів, починаючи з 1 і працює до 3, якщо недоступний:

  1. зграя (2)
  2. fcntl (2)
  3. lockf (3)

Це чудово. Однак ви, можливо, помітили їх відмову в тому, що зграя (2) не повинна використовуватися над NFS. Документ пропонує використовувати прапор -Ud_flock, щоб змусити Perl використовувати flock (2). Сторінка людини flock (2) (на Redhat) заявляє про подібну відмову щодо проблем з NFS.

Моє запитання: чому!?!? Я, здається, не можу знайти глибоку статтю чи пояснення ЧОМУ зграї (2) небезпечно для NFS.

Я написав кілька тестових сценаріїв на C і Perl, як на Redhat (де використовується flock (2)), так і на Solaris (де використовується fcntl (2)). Я біг strace / truss щоб переконатися, що Perl справді використовував flock (2) та fcntl (2) відповідно. Я не міг повторити жодних питань, коли блокування не виконувались! Що дає ??

Відповіді:


3

Нещодавно Lennart Poettering робив деякі дії щодо блокування поведінки файлової системи Linux, яка не малює особливо ружової картини для блокування через NFS (особливо це стосується подальших дій, на які він посилається внизу публікації).

http://0pointer.de/blog/projects/locking.html


1
Це саме той тип інформації, який я шукав. Дякую! Після декількох тижнів розслідування я прийшов до дуже подібної резолюції, але мені чудово прочитати статтю, яка підтверджує мої підозри (і пропонує іншим). Посилання з коментарів цієї сторінки також було хорошим посиланням та хорошою статтею про POSIX та його історію): samba.org/samba/news/articles/low_point/tale_two_stds_os2.html
Jmoney38

15

Я майже впевнений, що ви дивитесь на спадщину. Нагадаємо, що посібник Perl5 був випущений у 1994 році і що це лише редагування посібника Perl4 з 1991 року. У ті часи можна було б сказати про часто названу файлову систему Nightmare, що "це не так добре, як ведмідь танцює, вражає, але що він взагалі танцює ".

NFS2 в епоху 1991 року повільно виповзав із Сонця на інші платформи і був відносно сильним. Модель безпеки була по суті неіснуючою (корінь на клієнтській машині міг прочитати повний вміст кріплення NFS), а блокування - через nfs.lockd - була цією стороною експериментальної. Вам було б нерозумно сподіватися, що семантика стада працює належним чином, якщо взагалі між двома різними нібито інтероперабельними реалізаціями. Coax був домінуючою Ethernet PHY в той час, коли багато користувачів мережі ніколи не мали задоволення від використання (що ви маєте на увазі, що забули поставити 50 the резистор закінчення?), Якщо це дає змогу краще зрозуміти стан інтрамереж.

У Ларрі Уолла та екіпажу були всі підстави робити песимістичні припущення щодо правильності блокування NFS у той час, і це такий тип оборонного програмування, який майбутні жокеї коду ненавидять видаляти, оскільки так важко довести відсутність дефекту шляхом видалення старого коду, який знову вводиться в сумісність зі застарілою системою, про яку ви ніколи навіть не чули.

З того часу NFS значно покращився, і lockd перейшов на час до функції ядра Linux 2.6. Для колекції систем 2003+, блокуванню файлів NFS, ймовірно, можна довіряти, особливо якщо він перевірений у вашій програмі на багатьох платформах, на яких він працює.

Все вищезазначене було сховано з пам'яті і, можливо, може бути обґрунтоване за допомогою досліджень (наприклад, http://nfs.sourceforge.net/ ), але доказ - як то кажуть - є в блокуванні, і якщо ви цього не перевіряли , він вважається порушеним.


Це чудовий аналіз. Насправді я поки що прийшов до такого ж висновку. Після того, як ви опублікували це посилання, я знову прочитав сторінку nfs sourceforge, і нарешті знайшов те, що шукаю! Ось глибокий аналіз прямо з вуст коня!
Jmoney38

2
oops, я натискаю Enter ... перейдіть на nfs.sourceforge.net , розділ D10 в нижній частині детально обговорює це питання.
Jmoney38

3

Ще один, прямо з Linux-NFS FAQ: nfs.sf.net

Я намагаюся використовувати блоки flock () / BSD для блокування файлів, які використовуються для декількох клієнтів, але файли пошкоджуються. Як це? A. блоки flock () / BSD діють лише локально на клієнтах Linux NFS до 2.6.12. Використовуйте блоки fcntl () / POSIX, щоб переконатися, що блокування файлів видимі інші клієнти.

Ось кілька способів серіалізації доступу до файлу NFS.

Використовуйте API блокування fcntl () / POSIX. Цей тип блокування забезпечує блокування байтового діапазону для декількох клієнтів через протокол NLM або через NFSv4. Використовуйте окремий файл блокування та створіть жорсткі посилання на нього. Ознайомтесь з описом у розділі O_EXCL сторінки man create (2). Варто відзначити, що до початку ядер 2.6 створені O_EXCL не були атомними для клієнтів Linux NFS. Не використовуйте O_EXCL створює і не очікуйте атомарної поведінки серед декількох клієнтів NFS, якщо ви не працюєте з ядром, що перевищує 2.6.5.

Відомо, що Perl використовує блокування flock () / BSD за замовчуванням. Це може порушити програми, перенесені з інших операційних систем, таких як Solaris, які очікують, що блоки flock / BSD працюватимуть як блоки POSIX.

В Linux використання блокування файлів замість жорсткого посилання має додаткову перевагу перевірки кеш-пам'яті клієнта на сервері. Після придбання блокування файлу клієнт буде промивати кеш сторінки для цього файлу, щоб наступні читання отримували нові дані від сервера. Коли випущено блокування файлу, будь-які зміни у файлі цього клієнта повертаються назад на сервер до випуску блокування, щоб інші клієнти, які очікують на блокування цього файла, побачили зміни.

Клієнт NFS в 2.6.12 забезпечує підтримку блоку flock () / BSD у файлах NFS шляхом емуляції замків у стилі BSD з точки зору блокування діапазонів байтів POSIX. Інші клієнти NFS, які використовують той самий механізм емуляції, або які використовують замки fcntl () / POSIX, побачать ті самі блоки, які бачить клієнт Linux NFS.

У локальних файлових системах Linux блоки POSIX та BSD-блоки не помітні один одному. Таким чином, завдяки цій емуляції програми, запущені на сервері Linux NFS, як і раніше, побачать файли, заблоковані клієнтами NFS, як заблоковані блокуванням fcntl () / POSIX, незалежно від того, чи програма на клієнті використовує BSD-стиль чи POSIX- замок стилю. Якщо серверне додаток використовує блоки BSD flock (), воно не побачить блокування, якими користуються клієнти NFS.


Тож два клієнти NFS, які працюють з ядром 3.13. * Бачать зграї () один одного?
reinierpost

Якщо я правильно розумію, відповідь - ні. Якщо я щось не пропустив, flockне має, не робить і не заблокує через кріплення nfs.
Даніель Фаррелл

Це робиться, принаймні, на NFS4.
rjh

3

Зараз це застаріло. NFS4 підтримує блокування всередині протоколу (не потрібно блокувати демон або механізм зворотного виклику RPC), а flock()метод Perl працює добре - ми використовуємо це у виробництві.

Дуже старі версії ядра, реалізовані flock(syscall) як неопераційні можливості для NFS, та інші речі, такі як блокування діапазону байтів, не підтримувалися належним чином. Звідси і походить істерика.


Дякую за підказку. Монтаж за допомогою NFS4 вирішив мою проблему. Слідом access.redhat.com/documentation/en-us/red_hat_enterprise_linux / ... отримати FSTAB конфігурації право.
maraspin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.