Поддерживает ли NFS и SMB разреженные файлы?

18

Этот вопрос ранее задавался при переполнении стека, но хорошие люди там рекомендовали вместо этого попробовать сообщество.

Я исследую разреженные файлы в отношении различных файловых систем и пытаюсь найти что-то конкретное, в котором говорится, что разреженные файлы поддерживаются сетевыми файловыми системами (NFS) или блоком сообщений сервера (SMB).

Я понимаю, что SMB широко используется в Windows и что согласно этой записи сервер SMB может поддерживать разреженный файл, даже если основная файловая система этого не делает. Однако, если я прав, файловая система, которая не поддерживает разреженные файлы, просто заполнит «дыры» нулями, и это может привести к проблемам с производительностью.

Что касается NFS, я не смог ничего узнать об использовании NFS, поддерживающей разреженные файлы.

Следовательно, мои вопросы,

Поддерживаются ли разреженные файлы в NFS и SMB?

winhung
источник

Ответы:

12

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

cd /mnt/nfs
truncate test.img -s 1G
ls -lh test.img

-rw-р - r--. 1 root root 1.0G 26 октября 11:29 test.img

du -hs test.img

0 test.img

Как видите, файл test.img имеет размер на диске 0 байт. Тем не менее, читая его обратно, используя dd if=test.img of=/dev/null bs=1M iflag=directшоу

1024 + 0 записей в
1024 + 0 записей из
1073741824 байт (1,1 ГБ) скопировано, 10,2269 с, 105 МБ / с

Понятно, что при передаче разреженного файла он расширяется и включает все нули.

NFSv4.2 будет расширена за счет включения специальной обработки для сетевой передачи разреженных файлов. Другими словами, с NFSv4.2 вышесказанное ddбудет выполнено почти мгновенно.

SMB: он работает так же, как NFS , по крайней мере в моих тестовых средах, используя сервер Samba v3.6.x с CIFS v1 и клиент Linux с использованием mount.cifs. Может под виндой ведёт себя по другому ...

shodanshok
источник
Может ли NFS поддерживать разреженные файлы, если базовая файловая система сервера NFS не поддерживает разреженные файлы?
Эндрю Хенле
2
@shodanshok: ваш тест недействителен. Выполнение тех же команд в файловой системе, которая поддерживает разреженные файлы, дает тот же результат. ddчитает блок за блоком, и независимо от того, поддерживает ли базовая файловая система разреженные файлы или нет, ОС превращает дырки в нули. Попробуйте на ext4, и вы увидите те же цифры.
abligh
@AndrewHenle, если базовая FS не поддерживает разреженный файл, как NFS может предоставить несуществующую поддержку? В любом случае, в настоящее время довольно сложно найти файловую систему без разреженной поддержки файлов, поскольку все последние (ext3 / 4, xfs и т. Д.) Файловые системы Linux поддерживают эту функцию.
Шоданшок
1
@abligh Вы не правы. Выполнение ddкоманды над локальным разреженным файлом даст гораздо более быстрые результаты. Смотрите здесь пример :, root@hubble:~# truncate -s 1G test.img root@hubble:~# dd if=test.img of=/dev/null bs=1M iflag=direct 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 0.10478 s, 10.2 GB/sКак вы можете видеть, чтение локального разреженного файла дает скорость ввода-вывода к северу от 10 ГБ / с
shodanshok
2
@shodanshok - О, я вижу, вы смотрите на скорость, а не на сумму перевода. Возможно, уточнение, что в вашем ответе будет полезно. Канонический тест для файла, хранимого разреженным способом, du -svs ls -l, но вы правы, что не помогает с передачей по сети; но в любом случае (как straceподтвердит) ddсчитывает весь файл, включая «дыры» как нули, разница только в том, где возникают «нули» (на стороне сервера или клиента). Тем не менее , обратите внимание (как на мой ответ) , что NFS 4,2 делает полностью поддерживает разреженные файлы.
abligh
10

NFS

Да, NFS 4.2 полностью поддерживает разреженные файлы (см. Этот канонический документ и эту презентацию ).

До NFS 4.2 модель клиент / сервер NFS поддерживала разреженные файлы в том смысле, что API поддерживал все файловые операции POSIX. Это означало, что запись разреженных файлов на сервер, который поддерживал разреженные файлы в резервной файловой системе, приводила к созданию разреженного файла (а не к хранению большого количества нулей). Но чтение файла приведет к передаче множества нулей для разреженного элемента. IE ответ «частично».

NFS 4.2 добавляет возможность для клиента «видеть» дыры в файлах, и поэтому серверу не нужно передавать все эти нули. Из удостоверения личности:

1.4.3.  Sparse Files

Sparse files are ones which have unallocated or uninitialized data
blocks as holes in the file.  Such holes are typically transferred as
0s during I/O. READ_PLUS (see Section 15.10) allows a server to send
back to the client metadata describing the hole and DEALLOCATE (see
Section 15.4) allows the client to punch holes into a file.  In
addition, SEEK (see Section 15.11) is provided to scan for the next
hole or data from a given location.

Несмотря на то, что спецификация поддерживает разреженные файлы, ленивый разработчик может избежать реализации поддержки разреженных файлов на клиенте или сервере.

SMB

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

abligh
источник