Сетевые файловые системы предварительно выбираются?(Или: оптимизируйте ли файловую систему Интернета, чтобы уменьшить количество обращений) - PullRequest
4 голосов
/ 20 марта 2011

Возьмите следующий фрагмент кода:

 f = open("/mnt/remoteserver/bar/foo.bin", O_RDONNLY);
 while (true)
 {
       byteseread = read(f, buffer, 1000);
       if (bytesread > 0)
           ProcessBytes(buffer, bytesread);
       else
           break;
  }

Если в приведенном выше примере, скажем, удаленный файл, foo.bin, составляет 1 МБ, и клиент никогда ранее не обращался к нему.Таким образом, это примерно 1000 вызовов «read» для получения всего файла.

Далее, скажем, сервер с каталогом, установленным на клиенте, подключен к Интернету, а не локально.Быстрая пропускная способность для клиента, но с большой задержкой.

Каждый ли вызов "read" вызывает возврат к серверу и обратно для запроса дополнительных данных?Или протокол клиент / сервер распознает, что последующие чтения в удаленном файле часто являются последовательными, и, как таковые, последующие блоки выталкиваются вниз, прежде чем приложение фактически вызовет для него вызов read ().Следовательно, последующие вызовы чтения возвращаются быстрее, потому что данные были предварительно извлечены и кэшированы.

Проводят ли какие-либо оптимизации подобные протоколы современных сетевых файловых систем (NFS, SMB / Samba, другие?Существуют ли сетевые протоколы файловой системы, настроенные для Интернета, которые имеют такие оптимизации?

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

1 Ответ

3 голосов
/ 20 марта 2011

Это будет зависеть от реализации протокола.В целом, я не думаю, что большинство клиентских реализаций выполняют предварительную выборку, но большинство опытных администраторов хранилищ используют большие размеры блоков (32 + kb, см. Параметры монтирования rsize / wsize), что фактически приводит к тому же результату.Сетевые файловые системы, как правило, также будут кэшироваться через системный буферный кеш, поэтому вы определенно не будете переводить вызовы read () непосредственно в сетевой ввод-вывод.

Мой совет - написать вашу программунаивно (или простой тестовый пример) и получите удобство чтения сетевой статистики через nfsstat и т. д., а затем оптимизируйте оттуда.Слишком много переменных, чтобы получить ответ любым другим способом.

Я не эксперт, но из того, что я могу сказать, NFS4 имеет больше оптимизаций WAN, чем старые протоколы (nfs2,3, cifs), поэтому я 'Я определенно включу это в ваш микс.Тем не менее, большинство протоколов удаленных файловых систем на самом деле не предназначены для доступа с высокой задержкой, поэтому мы в конечном итоге получаем системы типа S3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...