Красноглазый блог

Тогда твоих зрачков опалы,
Как два фонарика, горят,
И ты во мгле в мой взгляд усталый
Свой пристальный вперяешь взгляд.
© Шарль Бодлер
      ____,,,,,,,,,,,,,,,__                                                                                                    __,,,,,,,,,,,,,,,____      
_,,ooOO@@@@@O***OO@@@@@@@@@@@Ooo,,,                                                                                    ,,,ooO@@@@@@@@@@@OO***O@@@@@OOoo,,_
@''`` /''```      ```''''@@@@@@@@@@Ooo,,                                                                          ,,ooO@@@@@@@@@@''''```      ```''\ ``''@
`@,  /                     ____...'@@@@@Ooo,,                                                                ,,ooO@@@@@'...____                     \  ,@`
 `@o,|                  ,`xxxxxxxxxxxxxo@@@@@Oo,,                                                        ,,oO@@@@@oxxxxxxxxxxxxx`,                  |,o@` 
  `@@,                ,`xxxxxxxxxxxxxxxxxx\'o@@@@Oo,,                                                ,,oO@@@@o'/xxxxxxxxxxxxxx###x`,                ,@@`  
   `@@o,             /xxxxxxxxxxxxxxxxx###x\ '`o@@@@@Oo,                                          ,oO@@@@@o`' /xxxxxxxxxxxxxx#####xx\             ,o@@`   
    `@@@o,          /xxxxxxxxx      xx#####x\   '`o@@@@@Oo,                                    ,oO@@@@@o`'   /xxxxxxxx      xx###xxxx\          ,o@@@`    
     `@@@@o,       |xxxxxxxx       #  x###xxx|       `o@@@@o,                                ,o@@@@o`       |xxxxxxx      #   xxxxxxxx|       ,o@@@@`     
       `@@@@o,     |xxx#xxxx  ,       xxxxxxx|          `o@@@o,                            ,o@@@o`          |xxx#xxx  ,       xxxxxxxx|     ,o@@@@`       
         '@@@@@@o, ,xxx##xxxxx `    xxxxxxxxx|             `o@@o,                        ,o@@o`             |xx###xxxx `    xxxxxxxxxx, ,o@@@@@@'         
           '@@@@@@@@@@xx####xxxxxxxxxxxxxxxx/                 'o@o,                    ,o@o'                 \xx####xxxxxxxxxxxxxxxx@@@@@@@@@@'           
              `'@@@@@@@@@@@@##xxxxxxxxxxxx/                   | `oo,                  ,oo` |                   \xx#####xxxxxxx@@@@@@@@@@@@'`              
                   `''@@@@@@@@@@@@@xxxxx,'                   /    `o,                ,o`    \                   ',xxxxx@@@@@@@@@@@@@''`                   
                         ```''''@@@@@@@@@@@@oo,,,        ,,,oooo@@@@@                @@@@@oooo,,,        ,,,oo@@@@@@@@@@@@''''```                         
                                    ```''''@@@@@@@@@@@@@@@@@@''```                      ```''@@@@@@@@@@@@@@@@@@''''```                                    

Сентябрь 1, 2009

Оптимизация NFSv3

Filed under: Без рубрики — Livid @ 08:56

В основном смысл статьи в том, чтобы оптимизировать производительность NFS. Однако, некоторые описываемые вещи не имеют к задаче прямого отношения, хотя и улучшают ощущения от работы с NFS в целом.
Использованы следующие предположения: канал между клиентом и сервером не хуже 100M, не имеет заметных потерь (пинги идут яки часы), и ни клиент, ни сервер не имеют привычки ВНЕЗАПНО перезагружаться. В общем сферический клиент-сервер в ваккууме.
В оптимизации помогут опции монтирования со стороны клиента.

Итак, по порядку:

  • async — вообще стоит по умолчанию, но мало ли. Улучшает отзывчиваость системы, хотя если клиент или сервер имеет привычку ВНЕЗАПНО уходить в ребут, может привести к потере данных.
  • noatime — применимо не только к НФС. Не обновляет время доступа к файлу при, собственно, доступе. Под доступом имеется ввиду даже просто ls, поэтому вещь полезная. Если, конечно, не нужно знать, когда на файл смотрели/читали последний раз. По моему опыту, это обычно не нужно.
  • udp — заставляет NFS использовать udp-транспорт. В общем случае при малых потерях пакетов udp быстрее, чем tcp за счет того, что udp не проверяет целостность цепочки пакетов. Следует заметить, однако, что при плохом соединении (с сильно плавающей скоростью или потерями) лучше использовать tcp — в таких условиях он быстрее.
  • hard,intr — это рекомендованные для всех NFS-маунтов опции, регулирующие поведение системы при потере сервера (упал/ребутнулся сервер, накрылось соединение и тп). Вообще, существует два варианта поведения. Hard подвешивает операцию ввода-вывода, пока сервер снова не появится. Soft сообщает об ошибке и дальше считает, что это не проблема подсистемы NFS. К сожаленью, как часто бывает, не все приложения корректно обрабатывают возвращаемую ошибку, что черевато потерей данных. Поэтому в общем случае рекомендуется hard. soft можно попробовать, если ФС примонтирована только для чтения. Intr нужно для того, чтобы в случае подвешивания операции ввода-вывода была возможность «убить» подвешенный процесс. Без нее процесс проявляет удивительную жизнестойкость и только жестокий kill -SIGKILL поможет окончить его муки. В присутствии soft, intr игнорируется
  • rsize=%d,wsize=%d, где %d — число — регулирует размеры сетевого буфера при чтении и записи соответсвенно. На ядрах 2.4 и выше, максимальное значение 32768 (32К). Общие рекомеднации по конкретным цифрам дать сложно, потому ограничусь утверждением, что наилучший результат на моем гигабитном канале с полным дуплексом был получен при максимальном размере буферов. Официально рекомендованно 8192, так что можно использовать это значение в качестве fail-safe default (особенно, учитывая, что это максимум для старых ядер с NFSv2).

Итак, суммируя все вышесказанное, в более-менее общем случае имеет смысл монтировать NFS-шару со следующими параметрами:

mount -t nfs -o rw,async,noatime,udp,hard,intr,rsize=8192,wsize=8192

или, если нужна отзывчивость при падении сервера, но не нужна возможность записи

mount -t nfs -o ro,async,noatime,udp,soft,rsize=8192,wsize=8192

или, если нужна надежность записи (т.е. сервер и/или клиент склонен к падениям, а канал — к обрывам)

mount -t nfs -o rw,sync,noatime,udp,hard,intr,rsize=8192,wsize=8192

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

Те же самые параметры монтирования с успехом записываются в fstab.

Нет связанных постов.

Комментарии (2) »

  1. Всё довольно очевидно, но ты почему то не указываешь версию протокола при монтировании, вернее не прояснил момент номерами версий протокола
    откуда я могу точно знать, что используется именно 3 версия NFS

    Комментарий by ffsdmad — Сентябрь 1, 2009 @ 12:53

  2. Замечание принято. Хотя, вообще, вопрос немного выходит за рамки заметки.

    Проясняю ситуацию.
    Поддержка NFS-клиента третьей версии есть в ядре уже в безнадежно устаревшей версии 2.2, поэтому молчаливо предполагается, что у пользователя оно есть.
    mount -t nfs же, если не указано иное (читай: не задан параметр nfsvers={2,3}) из двух возможных версий (вторая или третья, почему не четвертая смотри ниже) выбирает старшую, поддерживаемую сервером.

    Теперь что касается сервера. Опять же, молчаливо предполагается, что читатель имеет представление, что это такое. Я не задавался целью написать гайд по НФСу, их, слава Богу, хватает. Так вот. С версии 2.4 в ядре есть, не знаю как правильно перевести, NFSv3 kernel server, который, с той же версии, является предпочтительным. Если читатель вдруг работает с ядром 2.2 и соответственно с NFSv2 kernel server, я считаю, он лучше меня знает, как оно работает и что с ним делать. То же касается userspace-демонов, которые к 2.4 ядру как-то стали внезапно непопулярны. Да и все современные успешно держат NFSv3.

    Четвертая же версия протокола NFS не является обратно-совместимой, использует отличный от 2 и 3 версий синтаксис экспортов, и даже имеет отдельный маунт-хелпер: mount -t nfs4

    Суммируя все вышесказанное, на современных системах, вернее даже, на современных ядрах, если явно не указано иное, однозначно используется именно третья версия протокола. Если хочется уверенности, то добавить в список опций еще и nfsvers=3, что, однако, уже избыточно.

    Комментарий by Livid — Сентябрь 1, 2009 @ 13:30

RSS-лента комментариев к этой записи.

Оставить комментарий

Spam protection by WP Captcha-Free

Powered by WordPress
Creative Commons License
Krasnoglazy Blog by Nikolay "Livid" Yakimov is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.