DiskTester/Oper.md
2026-03-25 17:57:26 +03:00

10 KiB
Raw Permalink Blame History

Поддерживаемые операции в DiskTest v1.1

Обзор операций

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


1. write - Запись файла

Описание

Полная перезапись файла случайными данными.

Что делает

  • Выбирает случайный файл из тестового набора
  • Генерирует данные случайного размера (между file_size.min и file_size.max)
  • Полностью перезаписывает файл новыми данными
  • Измеряет время записи

Метрики

  • IOPS - операций записи в секунду
  • Throughput - MB/s записанных данных
  • Latency - p50/p95/p99

Пример конфигурации

operations:
  - type: write
    weight: 50

2. read - Чтение файла

Описание

Полное чтение файла в память.

Что делает

  • Выбирает случайный файл
  • Читает весь файл целиком в память
  • Измеряет время чтения и количество прочитанных байт

Метрики

  • IOPS - операций чтения в секунду
  • Throughput - MB/s прочитанных данных
  • Latency - p50/p95/p99

Пример конфигурации

operations:
  - type: read
    weight: 50

3. stat - Получение метаданных файла

Описание

Получение информации о файле без чтения его содержимого.

Что делает

  • Выбирает случайный файл
  • Вызывает os.Stat() для получения метаданных
  • НЕ читает содержимое файла
  • Возвращает: размер, время модификации, права доступа

Метрики

  • IOPS - операций stat в секунду
  • Latency - p50/p95/p99
  • Throughput не измеряется (нет передачи данных)

Целевые значения

  • Отлично: p99 < 5ms
  • Хорошо: p99 5-10ms
  • Плохо: p99 > 50ms

Пример конфигурации

operations:
  - type: stat
    weight: 70  # Dovecot делает МНОГО stat

4. fsync - Принудительная запись на диск 🆕

Описание

Форсирует физическую запись данных на диск (гарантия durability).

Что делает

  • Открывает случайный файл
  • Вызывает f.Sync() - форсирует запись буферов на диск
  • Гарантирует что данные физически записаны (не в cache)
  • Измеряет время синхронизации

Метрики

  • IOPS - операций fsync в секунду
  • Latency - p50/p95/p99 (КРИТИЧЕСКАЯ метрика для БД!)

Целевые значения

  • Отлично: p99 < 5ms
  • Хорошо: p99 5-10ms
  • Приемлемо: p99 10-50ms
  • Плохо: p99 > 50ms

Почему важно

  • Fsync p99 > 10ms → медленные транзакции в БД
  • Fsync p99 > 50ms → неприемлемо для OLTP систем

Пример конфигурации

operations:
  - type: write
    weight: 45
  - type: fsync
    weight: 45  # После каждой записи - fsync
  - type: read
    weight: 10

5. mkdir - Создание каталога 🆕

Описание

Создание нового каталога в файловой системе.

Что делает

  • Создаёт временный каталог с уникальным именем
  • Измеряет время создания
  • Сразу удаляет каталог (cleanup)

Метрики

  • IOPS - операций mkdir в секунду
  • Latency - p50/p95/p99

Целевые значения

  • Отлично: p99 < 5ms
  • Хорошо: p99 5-20ms
  • Плохо: p99 > 100ms

Почему важно

Docker build медленный? Проверьте mkdir latency!

Пример конфигурации

operations:
  - type: mkdir
    weight: 30
  - type: rmdir
    weight: 30

6. rmdir - Удаление каталога 🆕

Описание

Удаление пустого каталога.

Что делает

  • Создаёт пустой временный каталог
  • Измеряет время удаления пустого каталога
  • Вызывает os.Remove() на каталоге

Метрики

  • IOPS - операций rmdir в секунду
  • Latency - p50/p95/p99

Пример конфигурации

operations:
  - type: mkdir
    weight: 30
  - type: rmdir
    weight: 30
  - type: readdir
    weight: 40

7. readdir - Чтение содержимого каталога 🆕

Описание

Чтение списка всех файлов и подкаталогов в директории.

Что делает

  • Выбирает случайный каталог из тестовой структуры
  • Вызывает os.ReadDir() - читает список всех файлов/каталогов
  • Подсчитывает количество entries
  • Измеряет время операции

Метрики

  • IOPS - операций readdir в секунду
  • Throughput - entries/second (сколько файлов прочитано)
  • Latency - p50/p95/p99 (зависит от количества файлов!)

Целевые значения

Latency зависит от количества файлов в каталоге:

  • 100 файлов: p99 < 10ms
  • 1,000 файлов: p99 < 50ms
  • 10,000 файлов: p99 < 200ms

Особенность

Latency растёт нелинейно с количеством файлов в каталоге.

Почему важно

  • ls в большом каталоге медленный? Проверьте readdir!
  • Backup долго сканирует? Проверьте readdir latency!

Пример конфигурации

operations:
  - type: readdir
    weight: 60
  - type: stat
    weight: 30  # часто используются вместе
  - type: read
    weight: 10

Сравнительная таблица

Операция Читает данные? Пишет данные? Изменяет файл? Критично для
write Mail, DB, Logs
read Mail, DB, Media
stat Dovecot, Sync
fsync (flush) PostgreSQL, MySQL
mkdir (metadata) (FS) Docker, Build
rmdir (metadata) (FS) Cleanup
readdir (metadata) Backups, Browsers

Типичные комбинации операций

Mail Server (Dovecot)

operations:
  - type: stat
    weight: 70  # Проверка писем
  - type: read
    weight: 20  # Чтение писем
  - type: write
    weight: 10  # Новые письма

Критическая метрика: stat p99 < 10ms


Transactional Database (PostgreSQL)

operations:
  - type: write
    weight: 45  # Запись данных
  - type: fsync
    weight: 45  # Коммит транзакций
  - type: read
    weight: 10  # Чтение

Критическая метрика: fsync p99 < 10ms


Container Runtime (Docker)

operations:
  - type: mkdir
    weight: 40  # Создание слоёв
  - type: write
    weight: 30  # Запись в слой
  - type: readdir
    weight: 20  # Проверка кэша
  - type: rmdir
    weight: 10  # Очистка

Критическая метрика: mkdir p99 < 20ms


Backup System

operations:
  - type: readdir
    weight: 50  # Сканирование каталогов
  - type: stat
    weight: 30  # Проверка изменений
  - type: read
    weight: 20  # Чтение для backup

Критическая метрика: readdir p99 < 100ms (для больших каталогов)


Build System (make, ninja)

operations:
  - type: stat
    weight: 40  # Проверка timestamps
  - type: mkdir
    weight: 25  # Создание build dirs
  - type: read
    weight: 20  # Чтение исходников
  - type: write
    weight: 15  # Объектные файлы

Критическая метрика: stat p99 < 5ms, mkdir p99 < 10ms


Как выбрать операции для теста

1. Определите приложение

  • Mail server → stat + read + write
  • Database → write + fsync + read
  • Containers → mkdir + rmdir + write
  • Backup → readdir + stat + read

2. Определите критичные метрики

  • Dovecot → stat p99 (< 10ms)
  • PostgreSQL → fsync p99 (< 10ms)
  • Docker → mkdir p99 (< 20ms)
  • Backup → readdir p99 (< 100ms)

3. Подберите веса операций

  • Основная операция: 60-70%
  • Вторичные: 20-30%
  • Редкие: 5-10%

4. Запустите тест

./disktest -config your_config.yaml -csv results.csv

5. Анализируйте результаты

Смотрите на p99 latency критичных операций!


Примеры запуска

Тест всех операций

./disktest -config examples/balanced.yaml

Тест БД workload

./disktest -config examples/database.yaml -csv db_results.csv

Тест directory operations

./disktest -config examples/directory_ops.yaml

Тест Dovecot workload

./disktest -config examples/dovecot.yaml