English translation is not available yet. Showing Russian content.

Сравнить распределенные FS (Lustre, BeeGFS, JuiceFS)

ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Сравнить распределенные FS (Lustre, BeeGFS, JuiceFS)

1. Цель задачи

Провести бенчмаркинг производительности трёх распределённых файловых систем (Lustre, BeeGFS, JuiceFS) на кластере из 128 нод. Сравнить throughput (пропускную способность) при записи и чтении файлов, типичных для checkpoint'ов в ML-тренировках. Выбрать оптимальную файловую систему для хранения checkpoint'ов на основе полученных метрик и качественного анализа.

Ключевой результат Отчёт с результатами бенчмаркинга и обоснованный выбор оптимальной FS для checkpoint'ов.


2. Исходные данные

Перед началом необходимо иметь:

Что нужноОткуда взять
Кластер из 128 нод (физических или виртуальных)Облачный провайдер (AWS, GCP, Azure) или on-premise
Установленные и настроенные Lustre, BeeGFS, JuiceFSОфициальные руководства по установке
Инструмент для бенчмаркинга (IOR, mdtest)Репозитории GitHub, пакетные менеджеры
Данные для checkpoint'ов (синтетические)Сгенерировать скриптом (файлы размером 1-10 ГБ)
Мониторинг (dstat, iostat, nfsiostat)Встроенные утилиты Linux

Если нет реального кластера из 128 нод — симулируем:

  1. Использовать 4-8 мощных нод (каждая с 32 vCPU, 128 GB RAM, NVMe SSD).
  2. Запустить на каждой ноде по 16-32 контейнера (Docker), которые эмулируют ноды кластера.
  3. Использовать mpirun для параллельного запуска бенчмарков на всех контейнерах.
  4. Настроить сеть с задержкой 0.1-1 мс между контейнерами (через tc).

3. Технологический стек

КомпонентИнструментыНазначение
Операционная системаUbuntu 22.04 LTSБазовая ОС для всех нод
Распределённые FSLustre 2.15, BeeGFS 7.4, JuiceFS 1.1Тестируемые файловые системы
БенчмаркингIOR 3.4, mdtest 3.4Измерение throughput и IOPS
Параллельные вычисленияOpenMPI 4.1Запуск бенчмарков на всех нодах
Мониторингdstat, iostat, htopСбор метрик производительности
СкриптингPython 3.10, BashГенерация данных, анализ результатов
ВизуализацияMatplotlib, PandasПостроение графиков

4. Этапы выполнения

Этап 1: Подготовка окружения и установка FS (4-6 часов)

Действия

  1. Развернуть кластер из 128 нод

    • Если используете облако: создать 128 инстансов (тип: c5.4xlarge, диск: 100 GB gp3).
    • Если симуляция: настроить 4-8 нод, на каждой запустить Docker контейнеры (16-32 шт.).
  2. Установить и настроить каждую FS на отдельном наборе нод (или на одном кластере поочерёдно):

    • Lustre
      # На MGS/MDS (1 нода)
      apt install lustre-server
      mkfs.lustre --fsname=lustre --mgs --mdt /dev/sdb
      mount -t lustre /dev/sdb /mnt/lustre-mdt
      
      # На OSS (4 ноды)
      mkfs.lustre --fsname=lustre --ost --index=0 /dev/sdc
      mount -t lustre /dev/sdc /mnt/lustre-ost0
      
      # На клиентах (остальные ноды)
      apt install lustre-client
      mount -t lustre 10.0.0.1@tcp:/lustre /mnt/lustre
      
    • BeeGFS
      # На Management ноде (1)
      apt install beegfs-mgmtd
      /opt/beegfs/sbin/beegfs-setup-mgmtd -p /data/beegfs/mgmtd
      
      # На Storage нодах (4)
      apt install beegfs-storage
      /opt/beegfs/sbin/beegfs-setup-storage -c 10.0.0.1 -p /data/beegfs/storage -s 1
      
      # На клиентах
      apt install beegfs-client
      /opt/beegfs/sbin/beegfs-setup-client -m 10.0.0.1
      mount -t beegfs beegfs_nodev /mnt/beegfs
      
    • JuiceFS
      # Установить Redis (для метаданных) на отдельной ноде
      apt install redis-server
      
      # На каждой ноде установить JuiceFS клиент
      wget https://github.com/juicedata/juicefs/releases/latest/download/juicefs-1.1.0-linux-amd64.tar.gz
      tar -xzf juicefs-1.1.0-linux-amd64.tar.gz
      sudo mv juicefs /usr/local/bin/
      
      # Форматировать и смонтировать
      juicefs format --storage s3 --bucket s3://my-bucket --access-key xxx --secret-key yyy redis://10.0.0.1:6379/1 myjfs
      juicefs mount redis://10.0.0.1:6379/1 /mnt/juicefs
      
  3. Проверить базовую работу каждой FS

    # На одной ноде
    dd if=/dev/zero of=/mnt/<fs>/test bs=1M count=1024
    dd if=/mnt/<fs>/test of=/dev/null bs=1M
    

Ожидаемый результат этапа Все три FS установлены, смонтированы на всех 128 нодах, базовые тесты проходят.


Этап 2: Генерация синтетических checkpoint'ов (1 час)

Действия

  1. Написать Python скрипт generate_checkpoints.py

    import os
    import numpy as np
    
    def generate_checkpoint(path, size_gb, num_files):
        os.makedirs(path, exist_ok=True)
        for i in range(num_files):
            file_path = os.path.join(path, f"checkpoint_{i}.bin")
            # Создать файл заданного размера
            with open(file_path, 'wb') as f:
                f.write(os.urandom(size_gb * 1024 * 1024 * 1024))
            print(f"Created {file_path} ({size_gb} GB)")
    
    if __name__ == "__main__":
        # Параметры: 10 файлов по 5 ГБ каждый = 50 ГБ данных
        generate_checkpoint("/mnt/<fs>/checkpoints", 5, 10)
    
  2. Запустить скрипт для каждой FS

    for fs in lustre beegfs juicefs; do
        python generate_checkpoints.py --path /mnt/$fs/checkpoints
    done
    

Ожидаемый результат этапа На каждой FS созданы 10 файлов по 5 ГБ (всего 50 ГБ данных).


Этап 3: Запуск бенчмарков IOR (2-3 часа)

Действия

  1. Установить IOR на всех нодах

    wget https://github.com/hpc/ior/releases/download/3.4.0/ior-3.4.0.tar.gz
    tar -xzf ior-3.4.0.tar.gz
    cd ior-3.4.0
    ./configure --with-mpi
    make
    sudo make install
    
  2. Написать скрипт запуска run_benchmark.sh

    #!/bin/bash
    FS=$1
    NUM_NODES=128
    TASKS_PER_NODE=1
    TOTAL_TASKS=$((NUM_NODES * TASKS_PER_NODE))
    
    # Тест записи (write)
    mpirun -np $TOTAL_TASKS --hostfile hostfile.txt \
        ior -w -t 1m -b 100m -s 10 -F -e -o /mnt/$FS/ior_test \
        -O summaryFormat=CSV > results/write_$FS.csv
    
    # Тест чтения (read)
    mpirun -np $TOTAL_TASKS --hostfile hostfile.txt \
        ior -r -t 1m -b 100m -s 10 -F -e -o /mnt/$FS/ior_test \
        -O summaryFormat=CSV > results/read_$FS.csv
    
  3. Запустить бенчмарки для каждой FS

    for fs in lustre beegfs juicefs; do
        bash run_benchmark.sh $fs
    done
    
  4. Собрать метрики производительности

    # На каждой ноде во время теста
    dstat -d --output /tmp/dstat_$HOSTNAME.csv 5 > /dev/null &
    

Ожидаемый результат этапа Получены CSV-файлы с результатами IOR (throughput, IOPS) для каждой FS.


Этап 4: Анализ результатов и визуализация (2-3 часа)

Действия

  1. Написать Python скрипт analyze_results.py

    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # Загрузить результаты
    results = []
    for fs in ['lustre', 'beegfs', 'juicefs']:
        for op in ['write', 'read']:
            df = pd.read_csv(f'results/{op}_{fs}.csv')
            df['fs'] = fs
            df['operation'] = op
            results.append(df)
    
    all_results = pd.concat(results, ignore_index=True)
    
    # Построить график throughput
    plt.figure(figsize=(12, 6))
    sns.barplot(data=all_results, x='fs', y='Max(MiB/s)', hue='operation')
    plt.title('Throughput Comparison (MiB/s)')
    plt.savefig('throughput_comparison.png', dpi=150)
    
    # Построить график IOPS
    plt.figure(figsize=(12, 6))
    sns.barplot(data=all_results, x='fs', y='IOPS', hue='operation')
    plt.title('IOPS Comparison')
    plt.savefig('iops_comparison.png', dpi=150)
    
    # Вывести статистику
    print(all_results.groupby(['fs', 'operation']).agg({
        'Max(MiB/s)': ['mean', 'std'],
        'IOPS': ['mean', 'std']
    }))
    
  2. Дополнительно: проанализировать метрики dstat

    # Анализ загрузки дисков и сети
    dstat_data = pd.read_csv('/tmp/dstat_node1.csv')
    plt.plot(dstat_data['epoch'], dstat_data['dsk/write'])
    plt.title('Disk Write Load During Benchmark')
    plt.savefig('disk_load.png')
    
  3. Сравнить результаты с требованиями для checkpoint'ов:

    • Типичный checkpoint: 10-50 ГБ
    • Время сохранения: < 1 минута (желательно < 10 секунд)
    • Необходимый throughput: > 500 MB/s на ноду

Ожидаемый результат этапа Графики и таблицы со сравнением производительности.


Этап 5: Выбор оптимальной FS и написание отчёта (2-3 часа)

Действия

  1. Создать таблицу сравнения

    КритерийLustreBeeGFSJuiceFS
    Write throughput (GB/s)XYZ
    Read throughput (GB/s)XYZ
    Write IOPSXYZ
    Read IOPSXYZ
    Время монтированияXYZ
    Сложность настройкиВысокаяСредняяНизкая
    ЗависимостиLDAP/KerberosНетRedis + S3
    Цена (TCO)ВысокаяСредняяНизкая
  2. Написать отчёт report.md

    # Сравнение распределённых FS для checkpoint'ов
    
    ## Введение
    ...
    
    ## Методология
    ...
    
    ## Результаты
    ...
    
    ## Анализ
    ...
    
    ## Рекомендация
    На основе полученных данных, для хранения checkpoint'ов рекомендуется:
    - Если важна максимальная производительность Lustre (но высокая сложность)
    - Если баланс производительности и простоты BeeGFS
    - **Если важна низкая стоимость и облачная интеграция:** JuiceFS
    
  3. Подготовить презентацию (опционально):

    • 5-10 слайдов с ключевыми графиками и выводами.

Ожидаемый результат этапа Готовый отчёт с обоснованным выбором FS.


5. Критерии приемки (Definition of Done)

  • Все три FS установлены и настроены на кластере из 128 нод.
  • Сгенерированы синтетические checkpoint'и (10 файлов по 5 ГБ).
  • Запущены бенчмарки IOR для записи и чтения на каждой FS.
  • Собраны метрики производительности (throughput, IOPS, latency).
  • Построены графики сравнения (минимум 2: throughput и IOPS).
  • Написан отчёт с анализом результатов и рекомендацией.
  • Отчёт содержит таблицу сравнения по 8+ критериям.
  • Рекомендация обоснована численными данными.
  • Все артефакты (CSV, PNG, MD) сохранены в репозитории.
  • Воспроизводимость: скрипты запуска и анализа включены в репозиторий.

6. Ожидаемый результат

Основной артефакт Файл report.md (отчёт о сравнении FS).

Содержание отчёта

  • Введение (цель, контекст)
  • Методология (описание кластера, параметры бенчмарков)
  • Результаты (таблицы, графики)
  • Анализ (сравнение по критериям)
  • Рекомендация (выбор оптимальной FS для checkpoint'ов)

Дополнительные артефакты

  • results/ — CSV-файлы с сырыми данными IOR
  • graphs/ — PNG-файлы с графиками
  • scripts/ — скрипты для генерации данных, запуска бенчмарков, анализа
  • configs/ — конфигурационные файлы для каждой FS

7. Возможные сложности и их решение

СложностьРешение
Не хватает 128 физических нодИспользовать Docker контейнеры на 4-8 нодах с эмуляцией сети
Ошибки при установке LustreИспользовать готовые образы (например, AWS Marketplace) или Docker-образы
Низкая производительность JuiceFS из-за S3Использовать локальный MinIO для тестов (убрать сетевую задержку)
Разные версии MPIИспользовать OpenMPI 4.1 на всех нодах, проверить совместимость
Сетевые ограничения (пропускная способность)Использовать ноды с 25 Gbps сетью или настроить bonding
Нехватка места на дискахИспользовать временные диски (ephemeral) или увеличить размер в облаке
Конфликты при монтировании нескольких FSИспользовать разные точки монтирования (/mnt/lustre, /mnt/beegfs, /mnt/juicefs)

8. Бюджет времени (оценка)

ЭтапВремя
Этап 1: Подготовка окружения и установка FS4-6 часов
Этап 2: Генерация синтетических checkpoint'ов1 час
Этап 3: Запуск бенчмарков IOR2-3 часа
Этап 4: Анализ результатов и визуализация2-3 часа
Этап 5: Выбор оптимальной FS и написание отчёта2-3 часа
Итого11-16 часов

Примечание Для первого раза (с учётом изучения документации) заложите +50% времени (до 24 часов).


9. Связанные вопросы из базы знаний

ВопросТема
1Основы распределённых файловых систем
15Сравнение Lustre и BeeGFS
23JuiceFS: архитектура и особенности
42Бенчмаркинг с IOR
67Оптимизация checkpoint'ов в ML
89Настройка сети для HPC
112Мониторинг производительности FS
145TCO распределённых хранилищ
178Выбор FS для ML-тренировок
203Параллельные файловые системы в облаке

10. Чек-лист самопроверки

  • Я проверил, что все три FS установлены и смонтированы на всех нодах.
  • Я убедился, что бенчмарки IOR запускаются параллельно на всех 128 нодах.
  • Я собрал метрики для записи и чтения отдельно.
  • Я построил минимум два графика (throughput и IOPS) для визуального сравнения.
  • Я написал отчёт с обоснованной рекомендацией, основанной на численных данных.