Могу ли я заставить сигнализацию fcntl и Perl сотрудничать? - PullRequest
5 голосов
/ 23 сентября 2010

Я нахожусь на Linux, NFS, с участием нескольких машин.

Я пытаюсь использовать fcntl для реализации блокировки файлов. Я использовал flock, пока не обнаружил, что он работает только между процессами на одной машине.

Теперь, когда я вызываю fcntl с помощью F_SETLKW, тревоги perl (для добавления тайм-аута) не работают, как раньше. Обычно это нормально, но ctrl-c тоже не работает.

Я считаю, что происходит то, что fcntl проверяет только сигналы каждые 30 секунд или около того. Тревога возвращается в конце концов. Ctrl-C пойман, ... в конце концов.

Что я могу сделать, чтобы настроить частоту, с которой fcntl проверяет эти сигналы?

1 Ответ

1 голос
/ 30 октября 2010

Я определенно не эксперт в этом вопросе, но я знаю, что fcntl, как вы также заявили, не сработает в вашем случае.Консультативные блокировки fcntl имеют смысл только в пределах одной машины.

Так что забудьте меня, если это не по теме.Я использовал File :: NFSLock для решения проблемы кеша / собачьей кучи / штамповки.Несколько серверов приложений считывали и записывали файлы кэша на томе NFS (не очень хорошая идея, но именно с этого мы и начали).

Я подклассифицировал / обернул File :: NFSLock, чтобы изменить его поведение.В частности, мне нужно:

  • постоянные блокировки, которые не исчезают, когда объект File :: NFSLock выходит из области видимости.Используя обычный File :: NFSLock, ваша блокировка исчезнет, ​​когда объект выйдет из области видимости.Это было не то, что мне было нужно.
  • , что фактические файлы блокировки также содержат имя машины , которая получила блокировку.Идентификатора процесса явно недостаточно, чтобы решить, завершен ли процесс, поэтому я могу безопасно украсть файл блокировки.Поэтому я изменил код так, чтобы записывать файлы блокировки как machine:pid вместо просто pid.

Это прекрасно работало в течение пары лет.

Пока объем запросов не увеличилсяувеличение в 10 раз.То есть в прошлом месяце у меня начались первые проблемы, когда два бэкэнда записывали действительно занятый файл кэша в в то же время , оставляя после себя мертвые блокировки.Это произошло для меня, когда мы достигли примерно 9-10 миллионов просмотров страниц в день, просто чтобы дать вам представление.

Окончательный битый файл кэша выглядел так:

<!-- START OF CACHE FILE BY BACKEND b1 -->
... cache file contents ...
<!--   END OF CACHE FILE BY BACKEND b1 -->
... more cache file contents ... wtf ...
<!--   END OF CACHE FILE BY BACKEND b2 -->

Это может произойти толькоесли два бэкэнда пишут в один и тот же файл одновременно ... Пока не ясно, вызвана ли эта проблема File :: NFSLock + нашими модами или какой-то ошибкой в ​​приложении.

В заключение, если вашприложение не очень загружено и переправлено, затем выберите File :: NFSLock, я думаю, это ваш лучший выбор.Вы уверены, что все еще хотите использовать NFS?

...