2.9. Блокировка узлов GFS2

Прежде чем приступить к созданию плана оптимизации производительности файловой системы, важно понимать принципы ее организации. При развертывании файловой системы на одном узле также будет создан кэш, где будут размещаться наиболее часто используемые данные. Скорость доступа к кэшу намного выше по сравнению с обращением к диску.
В GFS2 каждый узел использует собственный кэш страниц, в который подкачиваются данные с диска. Согласование кэша между узлами осуществляется с помощью механизма glocks, использующего функции менеджера распределенных блокировок (DLM, Distributed Lock Manager).
В glocks блокирование данных осуществляется на основе индексных дескрипторов — каждый дескриптор блокируется отдельно. Если блокировка была сделана в разделяемом режиме (DLM-режим: PR), заблокированные данные могут одновременно кэшироваться на других узлах, то есть они будут доступны локально на каждом узле.
Монопольный режим (DLM-режим: EX) означает, что только блокирующий узел сможет кэшировать данные. Этот режим используется операциями модификации данных, такими как write.
Если узел запрашивает glock, который не может быть сразу освобожден, DLM отправит блокирующим узлам запрос освобождения. По меркам быстродействия файловых систем освобождение блокировки занимает довольно много времени, в то время как освобождение совместной блокировки требует лишь сброса состояния кэша, что происходит гораздо быстрее и напрямую зависит от объема данных в кэше.
При освобождении монопольной блокировки изменения в журнале и модифицированные данные будут записаны на диск, после чего состояние кэша будет аннулировано.
Главное отличие распределенной файловой системы от обычной состоит в наличии отдельного кэша на каждом узле. Степень задержки при обращении к кэшу в обоих случаях сравнима, но задержка доступа к данным на диске значительно выше в GFS2, и эффективность падает, если другой узел уже кэшировал те же самые данные.

Примечание

В силу особенностей кэширования в GFS2, для достижения наилучшей производительности следует придерживаться следующих правил:
  • обращаться к inode с разных узлов только в режиме чтения или
  • производить запись в inode только с одного узла.
Так как операции создания и удаления файлов из каталога вносят изменения в его дескриптор, они рассматриваются как операции записи.
В редких случаях допускается отклонение от перечисленных правил, но во избежание неоправданного снижения производительности не следует этим злоупотреблять.
Если вы используете mmap() для отображения файла в память с разрешениями чтения и записи, но при этом выполняются только операции чтения, в GFS2 это будет восприниматься как чтение, а в GFS — как запись. Таким образом, возможности масштабирования GFS2 на уровне ввода-вывода значительно выше по сравнению с GFS.
Если при подключении файловой системы в строке mount не указан параметр noatime, то даже операции чтения будут обновлять время доступа к файлу. Поэтому при подключении GFS2 рекомендуется отключить эту функцию, добавив noatime.

2.9.1. Блокировка Posix

Особенности использования блокировок Posix:
  • Flocks намного эффективнее блокировок Posix.
  • Программы, использующие блокировки Posix, должны избегать вызова GETLK в кластерных окружениях, так как это может привести к тому, что идентификатор одного и того же процесса на разных узлах будет отличаться.