2016-01-08 5 views
1

я прочитал следующее на https://blogs.oracle.com/roch/entry/does_zfs_really_use_moreиспользование памяти для ZFS отображенных файлов

Существует одна своеобразная нагрузка, которая делает привести ZFS потреблять больше памяти: запись (с помощью системных вызовов) для страниц, которые также mmaped. ZFS не использует систему регулярного подкачки для управления данными, которые проходят посредством чтения и записи системных вызовов. Однако mmaped I/O, который находится близко к , связанный с подсистемой виртуальной памяти, по-прежнему проходит через обычный код подкачки . Таким образом, вырезание syscall на mmaped-страницы означает, что мы сохраним 2 копии связанных данных, по крайней мере, пока нам не удастся получить данные на диск. Мы не ожидаем, что этот тип нагрузки обычно используется большим количество бара

Что это значит? означает ли это, что zfs будет «бесполезно» дублировать любую область памяти, которая поддерживается файлом с отображением памяти? или «использование системных вызовов» означает запись с использованием другого метода написания, с которым я не знаком. Если это так, мне лучше сохранить рабочие каталоги файлов, написанных таким образом на разделе ufs?

+0

Я голосующий, чтобы закрыть этот вопрос не по теме, потому что этот вопрос принадлежит [Unix.SE] (http://unix.stackexchange.com/), поскольку он не является разработкой, а связан с операциями. – Cactus

ответ

2

Означает ли это, что zfs будет «бесполезно» дублировать любую область памяти, которая поддерживается файлом с отображением памяти?

Надеюсь, нет.

или «использование системных вызовов» означает запись с использованием другого метода письма, с которым я не знаком.

Этот метод просто регулярно низкий уровень write(fd, buf, nbytes) системные вызовы и похожести, а не то, что файлы, отображенные на память предназначены для поддержки: доступ к содержимому файла только с чтения/записи памяти с помощью указателей, используя данные файла в виде массива байтов или что-то еще.

Если это так, мне лучше хранить рабочие каталоги файлов, написанных таким образом на разделе ufs?

Нет, если файлы с отображением памяти, которые также записываются на использование системных вызовов, составляют значительную часть рабочей нагрузки вашей ОЗУ, что маловероятно.

PS: Обратите внимание, что этому блогу почти десять лет. С тех пор произошли изменения в реализации.

+1

Итак, вы говорите, что это двойное кэширование произойдет, если я буду использовать write (или fwrite) в базовом файле страницы, которая уже была отображена? что, поскольку нет гарантии того, когда страница будет записана в базовый файл, мне всегда казалось, что это будет неопределенное поведение, так как не было бы способа узнать порядок написания. – camelccc

+1

В какое время данные сбрасываются на диск, не связаны с проблемой двойной буферизации, описанной в блоге (или даже тройной буферизацией, если вы используете fwrite и, следовательно, кеш libc). В любом случае Solaris сохраняет синхронизацию страниц и zfs, чтобы избежать неопределенного поведения.Если ваше приложение сильно использует mmapped файлы, на которых он пишет syscalls, вы можете настроить файловую систему на то, чтобы кэшировать только метаданные (primarycache = metadata), а затем избегать двойного кэширования. – jlliagre

+0

@jlliagre «Вы можете настроить файловую систему» ​​- как? –