Общий storage для медиа — типовая задача: несколько веб- или приложенческих серверов должны одновременно читать и иногда писать изображения, видео, превью и вспомогательные файлы. Чаще всего админы колеблются между двумя относительно простыми решениями уровня файловой системы: NFS и SSHFS. В этой статье сравню их по ключевым осям — производительность, задержки, безопасность, устойчивость и операционная сложность — и дам практические рекомендации, какой вариант выбрать для каждого сценария.
Что сравниваем: краткая суть NFS и SSHFS
NFS — сетевой протокол общего доступа к файловым системам, поставляется в Linux-окружении десятилетиями, стабилен, широко поддерживается, хорошо интегрируется с ядром (клиент в kernel-space). Актуальны NFSv3 и NFSv4.x. Классически NFS не шифрует трафик, но поддерживает аутентификацию и, при желании, может использоваться с Kerberos (sec=krb5/krb5i/krb5p) или поверх защищенного туннеля.
SSHFS — пользовательская файловая система на базе FUSE, работающая поверх SFTP (SSH). Плюсы: простота, доступность по умолчанию почти везде, шифрование «из коробки», гибкая аутентификация SSH. Минусы: FUSE-оверход и особенности кэширования/метаданных, потенциально заметные задержки при большом количестве мелких операций.
Модель работы и семантика
NFS
NFS изначально спроектирован как общий доступ к каталогу/разделу. Он умеет эффективные операции с метаданными (особенно в NFSv4 с readdirplus), блокировки файлов, атрибутные кэши и согласование UID/GID. Клиент и сервер работают на уровне ядра, что снижает накладные расходы и улучшает предсказуемость поведения под нагрузкой. Классика эксплуатации — экспорт каталогов с политиками root_squash, no_root_squash, чтение/запись с параметрами rsize/wsize и жесткая политика повторов (hard, intr, таймауты).
SSHFS
SSHFS базируется на SFTP-протоколе. Все запросы идут через SSH-подключение, шифруются и проходят через FUSE в пространстве пользователя. Это упрощает безопасность на уровне транспорта и доступ по ключам, но добавляет накладные расходы контекстных переключений и иногда заметные задержки на операциях с метаданными (stat, readdir, getattr). Важную роль играют параметры кэширования атрибутов и содержимого, иначе система будет «бить в сеть» на каждую мелочь.

Производительность: пропускная способность и задержки
Крупные файлы (последовательное чтение/запись)
Если ваш медиапоток — в основном большие объекты (видео, архивы, крупные изображения), преимущество часто на стороне NFS. Клиент NFS в ядре умеет эффективную очередь запросов, поддержку нескольких TCP-соединений (nconnect в новых ядрах), большие размеры блоков (rsize/wsize) и асинхронную запись. Все это помогает приблизиться к пропускной способности сети, особенно на 10G и выше, при достаточной производительности дискового бэкенда.
SSHFS, хоть и может показывать приличные цифры на 1G-сетях, часто упирается в CPU из-за шифрования и FUSE-оверхода. На слабых CPU или при высоких скоростях сеть/диск вы увидите недогруз канала. Часть потерь можно компенсировать выбором современных шифров и отключением сжатия, но системных ограничений это не отменяет.
Мелкие файлы, превью и метаданные
Каталоги превью, иконок, обложек — это тысячи и сотни тысяч мелких файлов. Здесь на первый план выходят не мегабайты в секунду, а задержки на каждую файловую операцию. NFS обычно быстрее на массовых stat(), open(), readdir(), особенно при включенном и правильно настроенном кэше атрибутов. SSHFS без кэширования даст заметное «залипание» при обходе дерева; с кэшированием — станет быстрее, но рискует устаревшими атрибутами при активных конкурентных изменениях.
Если ваш рабочий процесс — «пишем один раз, потом только читаем», кэши и на стороне NFS, и на стороне SSHFS будут к месту. Если же вы часто модифицируете одни и те же каталоги на нескольких узлах, кэш лучше ужесточать (сокращать таймауты) или выбирать архитектуру с локальным кешированием и фоновыми синхронизациями.
Задержки и устойчивость к потере сети
У NFS есть два лагеря подключений: «мягкие» (soft) и «жесткие» (hard). Жесткий режим не срывает операции при кратковременной сетевой проблеме и повторяет запросы до восстановления связи, что полезно для целостности, но иногда приводит к «подвешенным» процессам на период сбоя. Мягкий режим быстрее сдается, но риск порчи данных при приложениях, не готовых к ошибкам, выше.
SSHFS по умолчанию зрелее ведет себя при обрывах канала благодаря механизмам SSH-переподключения (reconnect, keepalive). Но часть операций может возвращать ошибки быстрее, чем хотелось бы, если сессия не восстановилась. В целом оба решения при грамотных параметрах живут устойчиво, но характер ошибок различается — это важно под ваши приложения.
Безопасность: транспорт, доступ и изоляция
Главное отличие: SSHFS шифрует транспорт «из коробки» и аутентифицируется средствами SSH (ключи, алгоритмы, политики входа). NFS традиционно полагается на доверенную сеть и учет UID/GID, однако его можно усилить: sec=krb5p (Kerberos с шифрованием), а также размещение поверх защищенного канала. Если шифрование на канале обязательно, SSHFS победит по простоте запуска, тогда как NFS потребует дополнительной настройки инфраструктуры.
С точки зрения прав доступа NFS удобен для многопользовательских сред: сопоставление UID/GID, root_squash (защита от root-клиента), тонкая настройка экспорта. Это нативно и прозрачно для приложений. SSHFS проще для сценария «есть один системный пользователь, он и работает» — быстро, безопасно по каналу, но сложнее выстроить общую модель разделения прав для множества локальных UID.
Изоляция на клиентах: в обоих случаях имеет смысл монтировать каталоги с флагами nosuid, nodev, noexec (если это медиаконтент), ограничивать доступ только тем сервисам, которым он нужен, и держать файрвол по умолчанию закрытым.
Управляемость и эксплуатация
NFS хорошо интегрируется с systemd automount, поддерживает предварительную проверку зависимости от сети, опции _netdev, гибкие экспортные политики на сервере. Мониторинг понятен: можно смотреть RPC-метрики, задержки, очереди на сервере. Масштабирование — от одной экспортируемой ФС до пары NFS-серверов на разные наборы данных.
SSHFS прост в стартовой конфигурации: один ключ — один mount. Отлично подходит для случаев, когда серверов немного, а доступ нужен сразу и безопасно. Но масштабирование на десятки клиентов усложняет ротацию ключей, аудит и единообразие настроек. При высокой нагрузке сложнее отлаживать проблемные места, так как мы имеем FUSE и SSH-слой поверх SFTP.
Если сервисы крутите под systemd, пригодится материал про лимиты и QoS для юнитов — посмотрите разбор лимитов systemd в статье «Лимиты CPU и памяти в systemd» как настраивать лимиты systemd.

Типовые сценарии медиахранилищ и рекомендации
CDN-origin или веб-серверы читают большие файлы
Задача: большие медиа, интенсивное чтение, редкая запись. Здесь выиграет NFS благодаря низким задержкам ядра и высокой пропускной способности. Рекомендуется монтировать в ro на фронт-эндах (если приложение не пишет), включить большие rsize/wsize, подумать о nconnect на новых ядрах, отключить atime (noatime), чтобы не плодить лишние метаданные.
Небольшая команда, общий storage через SSH-ключи
Нужно быстро и безопасно «подмонтировать» удаленную медиа-папку на несколько хостов, без сложностей сетевой инфраструктуры и Kerberos. SSHFS здесь удобнее: один порт, знакомые ключи, шифрование из коробки. Учтите накладные расходы: если медиа в основном мелкие объекты и к ним часто обращаются, настраивайте кэш таймаутов атрибутов и содержимого, а облако мелких превью по возможности кешируйте локально на приложениях.
Генерация превью/эскизов, много мелких файлов
При массовой генерации миниатюр и статических артефактов часто выгоднее комбинировать локовый SSD-кеш (на каждом узле) с периодической синхронизацией в центральное хранилище, а не гонять каждую запись по сети. Если все же нужен общий storage в онлайне, NFS даст меньше задержек на метаданных. SSHFS может работать приемлемо, но только с агрессивным кэшированием и пониманием риска устаревания атрибутов.
Конкурентная запись с нескольких узлов
Для сценариев, где несколько приложений одновременно пишут/заменяют файлы, важна четкая семантика блокировок и согласование кэшей. NFS v4 с корректной настройкой блокировок предпочтительнее. SSHFS в таких режимах чаще проявляет проблемы с согласованностью при агрессивном кэшировании и может «кусаться» задержками.
Минимальные тюнинги для старта
NFS (клиент)
mount -t nfs -o vers=4.1,proto=tcp,rsize=1048576,wsize=1048576,nconnect=4,noatime,hard,timeo=600,retrans=2 server:/export/media /mnt/media
Комментарии по опциям:
vers=4.1: современная версия с улучшенной семантикой.rsize/wsize: крупные блоки для throughput на больших файлах.nconnect=4: несколько TCP-сессий на одном mount, снижает head-of-line blocking.noatime: убрать лишние записи времени доступа.hard,timeo,retrans: устойчивость к временным сбоям сети.
SSHFS (клиент)
sshfs user@server:/srv/media /mnt/media -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,follow_symlinks,cache_timeout=120,attribute_timeout=120,entry_timeout=120,compression=no,allow_other -o Ciphers=chacha20-poly1305@openssh.com
Комментарии по опциям:
reconnectи keepalive: стабильность при обрывах.cache_timeout,attribute_timeout,entry_timeout: снизить число сетевых «раунд-трипов» на метаданные.compression=no: для медиа сжатие редко полезно, экономит CPU.- Современный шифр снижает накладные расходы на CPU, при этом безопасность остается высокой.
allow_other: если несколько локальных процессов должны видеть файловую систему; проверяйте политику безопасности.
Тестирование перед продом
Прежде чем принять решение, смоделируйте «ваш» профиль нагрузки. Чего точно не хватает в абстрактных бенчмарках — это реализма. Набросайте простейший план:
- Пропускная способность больших файлов: последовательное чтение/запись нескольких файлов по 1–4 ГБ.
- Метаданные: обход каталога с сотнями тысяч имен, подсчет хешей, выборка первых N миниатюр.
- Конкуренция: параллельное чтение и запись с нескольких клиентов.
- Проверка восстановления после обрыва: временно ограничьте сеть и наблюдайте поведение приложений.
Следите за CPU (особенно на небольших виртуальных серверах), задержками на диске у сервера хранилища и за сетевой очередью. Важно выявить «бутылочное горлышко»: сеть, CPU (шифрование), FUSE-оверход, диск или приложение. Если работаете на небольших VDS, закладывайте запас по ядрам под шифрование и сетевые прерывания. Для планирования ресурсов пригодится материал как выбрать план VDS.
Стоимость и ресурсы
При равной сети и дисках NFS экономичнее по CPU у клиента благодаря реализации в ядре и отсутствию шифрования по умолчанию. SSHFS «ест» CPU за счет шифрования и контекстных переключений FUSE, особенно заметно на слабых ядрах. Если у вас общий storage на нескольких недорогих виртуальных машинах и трафик значительный, учтите бюджет CPU под SSHFS. В то же время шифрование «на халяву» упрощает комплаенс.
Плюсы и минусы в одном месте
NFS
- Плюсы: высокая производительность на больших файлах, низкие задержки метаданных, нужная семантика блокировок, зрелая интеграция с ядром, удобен для мультиюзерных прав.
- Минусы: без дополнительной настройки нет шифрования; требуется аккуратная сетевуха/фаервол; сложнее безопасно «пробрасывать» через недоверенные сети.
SSHFS
- Плюсы: шифрование и аутентификация по умолчанию, простота старта, единственный привычный порт, удобно для малых инсталляций и быстрого онбординга.
- Минусы: FUSE-оверход, более высокие задержки на метаданные, чувствительность к CPU, сложность масштабирования на десятки клиентов.
Коротко о безопасности на практике
- NFS: включайте
root_squashтам, где это возможно, экспортируйте минимально необходимый поднабор каталогов, на клиентах используйтеroдля потребителей контента, а на пишущих — ограничивайте доступ по адресу и правам. Флагиnosuid,nodev,noexec— по умолчанию для медиа. - SSHFS: ключи с ограничением, отдельный пользователь на сервере, продумывайте каталоги и разрешения. Для медиа-томов также используйте
nosuid,nodev,noexecна клиентах, контролируйте Ciphers и KexAlgorithms согласно политике.
Альтернативы в архитектуре
Бывает, что ни NFS, ни SSHFS не «садятся» идеально. Для массовой раздачи медиа популярны объектные хранилища с SDK/HTTP-доступом и локальным кешем в приложении или прокси-сервере. Или гибрид: генерация артефактов локально, фоновая репликация на центральный узел, а затем — раздача с локальных копий. Но если нужен именно POSIX-подобный общий файловый доступ, выбор все равно сведется к NFS или SSHFS.
Практический вывод
Если основной профиль — чтение больших файлов, минимальная задержка метаданных и предсказуемость под нагрузкой, берите NFS. Если важнее простота старта, шифрование на канале и малое число клиентов — SSHFS.
Решение упирается в ваш профиль I/O, чувствительность приложений к задержкам, требования к шифрованию и доступности. Не полагайтесь на «универсальные» советы — прогоните короткий бенч под вашу модель и посмотрите на реальные цифры CPU, RTT и IOPS.
Чеклист перед выбором
- Доля больших файлов против мелких объектов: что преобладает?
- Профиль доступа: WORM (write once, read many) или частые модификации?
- Требуется ли шифрование транспорта без отдельной инфраструктуры?
- Число клиентов сейчас и через год: как будете управлять ключами/правами?
- Сколько CPU вы готовы отдать на оверхед файловой системы и шифрования?
- Поведение при обрыве сети: приложение готово к ошибкам или нужна «жесткая» семантика?
- Насколько критичны задержки метаданных при обходе больших деревьев?
Итоги
NFS — рабочая лошадка для общего storage медиа с ориентиром на производительность и низкие задержки, особенно при больших файлах и интенсивном чтении. SSHFS — быстрый и безопасный по каналу старт без сложной сетевой инфраструктуры, хороший для небольших инсталляций и команд, где важна простота и предсказуемость доступа через SSH. Взвесьте ключевые параметры, прогоните короткое тестирование под ваш реальный ворклоад — и решение станет очевидным.


