POSIX действительно не подходит для объектных хранилищ? – CodesCode
Mожет ли POSIX действительно быть непригодным для объектных хранилищ? Окунитесь в анализ данных MinIO, s3fs-fuse и JuiceFS, чтобы узнать.
Автор этого поста ставит под сомнение точку зрения, выдвинутую в статье MinIO, в которой утверждается, что POSIX не подходит для объектных хранилищ. Он провел обширное тестирование, включающее MinIO s3fs-fuse
и JuiceFS. Результаты показывают, что MinIO и JuiceFS демонстрируют отличную производительность, в то время как s3fs-fuse
отстает. В случае перезаписи небольших файлов, JuiceFS FUSE-POSIX показывает лучшую производительность по сравнению со всеми остальными решениями.
Недавно я наткнулся на статью на блоге MinIO под названием “Поместить файловую систему над хранилищем объектов – это плохая идея. Вот почему.” Автор использовал s3fs-fuse
в качестве примера, чтобы продемонстрировать проблемы с производительностью, с которыми сталкиваются при доступе к данным MinIO с использованием методов Portable Operating System Interface (POSIX), подчеркивая, что производительность значительно уступает прямому доступу к MinIO. Автор связывает эти проблемы производительности с врожденными недостатками POSIX. Тем не менее, наш опыт несколько отличается от данного вывода.
POSIX является полезным и широко применяемым стандартом. Разработка программного обеспечения в соответствии с POSIX гарантирует совместимость и переносимость на различные операционные системы. Большинство приложений в различных отраслях придерживаются стандарта POSIX. С развитием облачных вычислений, больших данных и технологий искусственного интеллекта, а также увеличением объема хранимых данных, возникает возросшая потребность в эластичных хранилищах, таких как объектные хранилища. Хотя объектные хранилища, такие как MinIO, предоставляют SDK на различных языках программирования, многие традиционные приложения испытывают трудности в адаптации своего кода для использования интерфейсов хранилища объектов. Это привело к тому, что различные продукты хранения реализовали интерфейсы POSIX над объектными хранилищами для удовлетворения этого неизменного спроса.
Многие продукты в этой отрасли, такие как Ceph, JuiceFS и Weka, успешно реализовали интерфейсы POSIX над объектными хранилищами. У этих решений есть большие пользовательские базы и множество примеров успеха, и они хорошо справляются с производительностью.
Хотя факт о том, что POSIX имеет значительную сложность, неоспорим, связанные с ним проблемы не являются непреодолимыми. С уважением и желанием проверить эти утверждения, я создал тестовую среду, использовал те же выборки данных и методы тестирования, что и в статье MinIO, и провел проверку.
Сравнение продуктов и цели тестирования
Чтобы предоставить всестороннюю оценку, я включил в сравнение JuiceFS.
JuiceFS – это распределенная файловая система, построенная на облачной основе. Она использует объектное хранилище в качестве слоя хранения данных и полагается на отдельную базу данных для хранения метаданных. Она предлагает различные способы доступа, включая API POSIX, API S3, драйвер CSI, API HDFS и WebDAV, а также уникальные механизмы фрагментации, кэширования и одновременного чтения/записи данных. JuiceFS – это файловая система, фундаментально отличная от инструментов, таких как s3fs-fuse
, которые просто преобразуют хранилище объектов в протоколы POSIX.
Включив JuiceFS в сравнение, я стремился объективно оценить преимущества и недостатки реализации протоколов, таких как POSIX, над объектными хранилищами.
Я провел следующие два теста на MinIO, JuiceFS и s3fs-fuse
:
- Запись файла размером 10 ГБ
- Перезапись небольших файлов с помощью Pandas
Все три решения использовали экземпляр MinIO, развернутый на отдельных серверах, в качестве базового хранилища. В качестве образцов для тестирования использовался файл размером 10 ГБ, который является тем же самым CSV-файлом, упомянутым в статье MinIO.
Все окружения, программное обеспечение, скрипты и образцы данных в этой статье поставляются с полным кодом и инструкциями, чтобы вы могли воспроизвести окружение и результаты тестирования.
Настройка сервера и тестового окружения
Два идентично настроенных облачных сервера:
- Система: Ubuntu 22.04 x64
- ЦПУ: 8 ядер
- ОЗУ: 16 ГБ
- SSD: 500 ГБ
- Сеть: VPC
Информация о каждом сервере:
Сервер | IP-адрес | Назначение |
---|---|---|
Сервер А | 172.16.254.18 | Развертывание экземпляра MinIO |
Сервер B | 172.16.254.19 | В качестве тестового окружения |
Подготовка сервера А
1. Я развернул MinIO на сервере А с использованием Docker с помощью следующих команд:
# Создаем отдельный каталог и переходим в него.mkdir minio && cd minio# Создаем файл конфигурации.mkdir configtouch config/minio
2. Я записал следующую информацию в файл config/minio
:
MINIO_ROOT_USER=adminMINIO_ROOT_PASSWORD=abc123abcMINIO_VOLUMES="/mnt/data"
3. Я создал контейнер MinIO:
sudo docker run -d --name minio \ -p 9000:9000 \ -p 9090:9090 \ -v /mnt/minio-data:/mnt/data \ -v ./config/minio:/etc/config.env \ -e "MINIO_CONFIG_ENV_FILE=/etc/config.env" \ --restart unless-stopped \ minio/minio server --console-address ":9090"
4. На веб-консоли MinIO я предварительно создал три бакета:
Имя бакета | Назначение |
---|---|
test-minio | Для тестирования MinIO |
test-juicefs | Для тестирования JuiceFS |
test-s3fs | Для тестирования s3fs-fuse |
Подготовка сервера Б
1. Я загрузил файл тестового образца размером 10 ГБ.
curl -LO https://data.cityofnewyork.us/api/views/t29m-gskq/rows.csv?accessType=DOWNLOAD
2. Я установил клиент mc
.
mc
– это командный файловый менеджер, разработанный проектом MinIO. Он позволяет выполнять операции чтения и записи как на локальном, так и на совместимом с S3 хранилище объектов в командной строке Linux. Команда mc cp
предоставляет информацию о прогрессе и скорости копирования данных в режиме реального времени, что облегчает наблюдение за различными тестами.
Примечание: Чтобы обеспечить честность тестирования, все три подхода используют
mc
для тестирования записи файлов.
# Загрузка mc.wget https://dl.min.io/client/mc/release/linux-amd64/mc# Проверка версии mc.mc -vmc version RELEASE.2023-09-20T15-22-31Z (commit-id=38b8665e9e8649f98e6162bdb5163172e6ecc187)Runtime: go1.21.1 linux/amd64# Установка mc.sudo install mc /usr/bin# Задание псевдонима для MinIO.mc alias set my http://172.16.254.18:9000 admin abc123abc
3. Я загрузил s3fs-fuse
.
sudo apt install s3fs# Проверка версии.s3fs --versionAmazon Simple Storage Service File System V1.93 (commit:unknown) with OpenSSL# Задание ключа доступа к хранилищу объектов.echo admin:abc123abc > ~/.passwd-s3fs# Изменение разрешений для ключевого файла.chmod 600 ~/.passwd-s3fs# Создание точки монтирования.mkdir mnt-s3fs# Монтирование хранилища объектов.s3fs test-s3fs:/ /root/mnt-s3fs -o url=http://172.16.254.18:9000 -o use_path_request_style
4. Я установил JuiceFS.
Я использовал официальный скрипт для установки последней версии JuiceFS Community Edition.
# Скрипт однократной установкиcurl -sSL https://d.juicefs.com/install | sh -# Проверка версии.juicefs versionjuicefs version 1.1.0+2023-09-04.08c4ae6
5. Я создал файловую систему. JuiceFS – это файловая система, которую необходимо создать перед использованием. Кроме хранилища объектов, она требует базу данных в качестве движка метаданных. Она поддерживает различные базы данных. Здесь я использовал распространенную Redis в качестве движка метаданных.
Примечание: Я установил Redis на сервере А, доступном по адресу
172.16.254.18:6379
без пароля. Процесс установки опущен здесь. Вы можете обратиться к документации Redis для получения подробной информации.
# Создание файловой системы.juicefs format --storage minio \--bucket http://172.16.254.18:9000/test-juicefs \--access-key admin \--secret-key abc123abc \--trash-days 0 \redis://172.16.254.18/1 \myjfs
6. Я получил доступ к JuiceFS, используя более распространенные методы API POSIX и S3 и протестировал их производительность.
# Создание каталогов для монтирования.mkdir ~/mnt-juicefs# Монтирование файловой системы в режиме POSIX.juicefs mount redis://172.16.254.18/1 /root/mnt-juicefs# Доступ к файловой системе с использованием метода API S3.export MINIO_ROOT_USER=adminexport MINIO_ROOT_PASSWORD=abc123abcjuicefs gateway redis://172.16.254.18/1 0.0.0.0:9000# Установка псевдонима для JuiceFS S3 API в mc.mc alias set juicefs http://172.16.254.18:9000 admin abc123abc
Примечание: Шлюз JuiceFS также может быть развернут на Сервере А или любом другом сервере с доступом в Интернет, так как он предоставляет сетевой S3 API.
Тесты и результаты
Вот краткое изложение моих тестов и результатов:
Тест | MinIO | S3FS-FUSE | JuiceFS(FUSE) | JuiceFS(S3 шлюз) |
---|---|---|---|---|
Запись файла размером 10 ГБ | 0м27.651с | 3м6.380с | 0м28.107с | 0м28.091с |
Перезапись небольших файлов с использованием Pandas | 0.83с | 0.78с | 0.46с | 0.96с |
Тест 1: Запись файла размером 10 ГБ
Этот тест был разработан для оценки производительности записи больших файлов. Чем меньше занимает время, тем лучше производительность. Я использовал команду time
для измерения длительности операций записи, предоставляя три метрики:
real
: Фактическое время от начала до конца выполнения команды. Включает все время ожидания, такие как ожидание завершения операций ввода-вывода, ожидание переключения процессов и ожидание ресурсов.user
: Время выполнения в пользовательском режиме, указывающее время ЦП, используемое для выполнения пользовательского кода. Обычно представляет вычислительную нагрузку команды.sys
: Время выполнения в режиме ядра, указывающее время ЦП, используемое для выполнения кода ядра. Обычно представляет рабочую нагрузку, связанную с системными вызовами, такими как ввод-вывод файлов и управление процессами.
MinIO
Я выполнил следующую команду для выполнения теста копирования:
time mc cp ./2018_Yellow_Taxi_Trip_Data.csv my/test-minio/
Результаты записи файла размером 10 ГБ напрямую в MinIO:
real 0м27.651сuser 0м10.767сsys 0м5.439с
s3fs-fuse
Я выполнил следующую команду для выполнения теста копирования:
time mc cp ./2018_Yellow_Taxi_Trip_Data.csv /root/mnt-s3fs/
Результаты записи файла размером 10 ГБ напрямую в s3fs-fuse
:
real 3м6.380сuser 0м0.012сsys 0м5.459с
Примечание: Хотя время записи составило 3 минуты и 6 секунд для
s3fs-fuse
, не было отказов при записи, как описано в статье MinIO.
JuiceFS
Я протестировал производительность JuiceFS для записи больших файлов с использованием методов API POSIX и S3:
# Тест записи POSIXtime mc cp ./2018_Yellow_Taxi_Trip_Data.csv /root/mnt-juicefs/# Тест записи S3 APItime mc cp ./2018_Yellow_Taxi_Trip_Data.csv juicefs/myjfs/
Результаты для JuiceFS при записи файла размером 10 ГБ в режиме POSIX:
real 0м28.107сuser 0м0.292сsys 0м6.930с
Результаты для записи 10-гигабайтного файла через API JuiceFS S3:
реальное время 0м28.091с, пользовательское время 0м13.643с, системное время 0м4.142с
Сводка результатов записи больших файлов
На следующей схеме показаны результаты теста:
Результаты теста показывают, что как прямая запись в MinIO, так и JuiceFS показывают сопоставимую производительность, выполняя задачу примерно за 30 секунд. В отличие от этого, s3fs-fuse
потребовало более 3 минут для записи 10-гигабайтного файла, что примерно в 6 раз медленнее, чем первые два варианта.
При записи больших файлов mc
использует метод Multipart API для загрузки файлов пакетами в интерфейс S3. В свою очередь, s3fs-fuse
может записывать только в POSIX в однопотоковом режиме. JuiceFS также автоматически разбивает большие файлы на фрагменты и одновременно записывает их в MinIO во время последовательной записи, обеспечивая производительность, сравнимую с прямой записью в MinIO. S3FS, с другой стороны, сначала записывает в кэширующий диск в одном потоке, а затем загружает файл пакетами в MinIO, что приводит к более длительному времени записи.
Исходя из расчета, что на запись 10-гигабайтного файла потребовалось 30 секунд, средняя скорость составляла 333 МБ/с. Это ограничено пропускной способностью SSD-дисков облачных серверов. Эти результаты тестов указывают на то, что как MinIO, так и JuiceFS могут максимально использовать пропускную способность локальных SSD, и их производительность улучшится с улучшением облачных дисков серверов и пропускной способности сети.
Тест 2: Перезапись маленьких файлов с помощью Pandas
Этот тест оценивал производительность систем хранения объектов в сценариях перезаписи маленьких файлов. Скрипты тестов для каждого программного обеспечения немного отличались. Вы можете найти весь код скрипта здесь.
MinIO
Я получил тестовый скрипт и запустил тест:
# Получить тестовый скрипт.curl -LO https://gist.githubusercontent.com/yuhr123/7acb7e6bb42fb0ff12f3ba64d2cdd7da/raw/30c748e20b56dec642a58f9cccd7ea6e213dab3c/pandas-minio.py# Выполнить тест.python3 pandas-minio.py
Результат был следующим:
Время выполнения: 0.83 секунды
s3fs-fuse
Я получил тестовый скрипт и запустил тест:
# Получить тестовый скрипт.curl -LO gist.githubusercontent.com/yuhr123/7acb7e6bb42fb0ff12f3ba64d2cdd7da/raw/30c748e20b56dec642a58f9cccd7ea6e213dab3c/pandas-s3fs.py# Выполнить тест.python3 pandas-s3fs.py
Результат теста был следующим:
Время выполнения: 0.78 секунды
JuiceFS POSIX
Я получил тестовый скрипт и запустил тест:
# Получить тестовый скрипт.curl -LO gist.githubusercontent.com/yuhr123/7acb7e6bb42fb0ff12f3ba64d2cdd7da/raw/30c748e20b56dec642a58f9cccd7ea6e213dab3c/pandas-juicefs-posix.py# Выполнить тест.python3 pandas-juicefs-posix.py
Результат теста был следующим:
Время выполнения: 0.43 секунды
JuiceFS S3 API
Я получил тестовый скрипт и запустил тест:
# Получить тестовый скрипт.curl -LO https://gist.githubusercontent.com/yuhr123/7acb7e6bb42fb0ff12f3ba64d2cdd7da/raw/30c748e20b56dec642a58f9cccd7ea6e213dab3c/pandas-juicefs-s3api.py# Выполнить тест.python3 pandas-juicefs-s3api.py
Результат теста был следующим:
Время выполнения: 0.86 секунды
Сводка по перезаписи малых файлов в Pandas
На следующей фигуре показаны результаты теста:
В этом тесте JuiceFS FUSE-POSIX продемонстрировал самую быструю скорость, почти вдвое быстрее других решений. MinIO, s3fs-fuse
и JuiceFS S3 Gateway обладают схожей производительностью. С точки зрения перезаписи малых файлов, интерфейс POSIX оказался более эффективным и обеспечил лучшую производительность по сравнению с интерфейсами объектного хранения.
Проблемы и анализ
Проблема 1: Почему S3FS работает так медленно?
Анализ: Из данных теста явно видно, что для записи одного и того же файла объемом 10 ГБ S3FS затратил 3 минуты, в то время как MinIO и JuiceFS выполнили задачу за примерно 30 секунд. Это значительная разница в производительности, вызванная в первую очередь различными техническими реализациями. При записи файла s3fs-fuse
сначала записывает его во временный локальный файл, а затем передает его в объектное хранилище порциями. Если места на локальном диске недостаточно, происходит синхронная передача. В этом случае требуется копирование данных между локальным диском и хранилищем S3. Поэтому при записи больших файлов или большого количества файлов производительность снижается.
Кроме того, S3FS полагается на возможности управления метаданными основного объектного хранилища. При работе с большим числом файлов частые взаимодействия с объектным хранилищем для получения метаданных значительно влияют на производительность. Проще говоря, чем больше размер файла и общее количество файлов, записанных в S3FS, тем больше пропорциональные накладные расходы на производительность.
Проблема 2: Почему JuiceFS работает быстрее?
Анализ: В тесте и JuiceFS, и S3FS использовали FUSE для чтения и записи. JuiceFS полностью использует пропускную способность диска, как и MinIO, но при этом не возникает проблем с производительностью, которые есть у S3FS.
Ответ кроется в их технической архитектуре. В то время как данные обрабатываются через слой FUSE во время записи файла, JuiceFS использует высокую параллельность, кэширование и технику фрагментирования данных для снижения накладных расходов на связь между слоем FUSE и основным объектным хранилищем. Это позволяет JuiceFS обрабатывать одновременно больше запросов на чтение и запись файлов, сокращая время ожидания и задержку передачи.
Кроме того, JuiceFS использует специализированную базу данных (в данном случае Redis) для управления метаданными. При работе с особенно большим количеством файлов независимый метаданный движок эффективно снимает нагрузку и позволяет быстрее выполнить поиск файлов.
Вывод
Вышеописанные тесты показывают, что использование объектного хранилища в качестве основы и реализация интерфейса POSIX повлекло лишь незначительное снижение производительности. Независимо от того, пишете ли вы большие или малые файлы, JuiceFS обладает производительностью сравнимой с напрямую записываемыми файлами в MinIO без какого-либо снижения производительности основного объектного хранилища из-за доступа через POSIX. Более того, в случае перезаписи таблиц Pandas производительность JuiceFS FUSE-POSIX остается стабильной и превосходит MinIO почти вдвое.
Результаты теста указывают на то, что некоторое программное обеспечение, такое как s3fs-fuse
, может иметь снижение производительности при конвертировании между интерфейсами S3 API и POSIX. В то время как это может быть удобным инструментом для временного доступа к S3, для стабильного и высокопроизводительного долгосрочного использования необходимо тщательное исследование и проверка для выбора более подходящих решений.
Для простого архивирования неструктурированных файлов хорошим выбором является прямое использование MinIO или облачного объектного хранилища. Однако для сценариев, которые включают хранение и обработку данных большого объема, таких как обучение моделей AI, анализ больших данных, сохранение данных в Kubernetes и другие частые операции чтения и записи, независимое управление метаданными JuiceFS, возможности параллельного чтения и записи, а также механизмы кэширования обеспечивают превосходную производительность. Это высокопроизводительное решение файловой системы, заслуживающее внимания.
Leave a Reply