# Поддерживаемые операции в DiskTest v1.1 ## Обзор операций DiskTest поддерживает 7 типов операций для тестирования различных аспектов производительности файловой системы. --- ## 1. write - Запись файла ### Описание Полная перезапись файла случайными данными. ### Что делает - Выбирает случайный файл из тестового набора - Генерирует данные случайного размера (между `file_size.min` и `file_size.max`) - **Полностью перезаписывает** файл новыми данными - Измеряет время записи ### Метрики - **IOPS** - операций записи в секунду - **Throughput** - MB/s записанных данных - **Latency** - p50/p95/p99 ### Пример конфигурации ```yaml operations: - type: write weight: 50 ``` --- ## 2. read - Чтение файла ### Описание Полное чтение файла в память. ### Что делает - Выбирает случайный файл - **Читает весь файл** целиком в память - Измеряет время чтения и количество прочитанных байт ### Метрики - **IOPS** - операций чтения в секунду - **Throughput** - MB/s прочитанных данных - **Latency** - p50/p95/p99 ### Пример конфигурации ```yaml operations: - type: read weight: 50 ``` --- ## 3. stat - Получение метаданных файла ### Описание Получение информации о файле без чтения его содержимого. ### Что делает - Выбирает случайный файл - Вызывает `os.Stat()` для получения метаданных - **НЕ читает содержимое файла** - Возвращает: размер, время модификации, права доступа ### Метрики - **IOPS** - операций stat в секунду - **Latency** - p50/p95/p99 - Throughput **не измеряется** (нет передачи данных) ### Целевые значения - **Отлично:** p99 < 5ms - **Хорошо:** p99 5-10ms - **Плохо:** p99 > 50ms ### Пример конфигурации ```yaml 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 систем ### Пример конфигурации ```yaml 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! ### Пример конфигурации ```yaml operations: - type: mkdir weight: 30 - type: rmdir weight: 30 ``` --- ## 6. rmdir - Удаление каталога 🆕 ### Описание Удаление пустого каталога. ### Что делает - Создаёт пустой временный каталог - Измеряет время удаления пустого каталога - Вызывает `os.Remove()` на каталоге ### Метрики - **IOPS** - операций rmdir в секунду - **Latency** - p50/p95/p99 ### Пример конфигурации ```yaml 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! ### Пример конфигурации ```yaml 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) ```yaml operations: - type: stat weight: 70 # Проверка писем - type: read weight: 20 # Чтение писем - type: write weight: 10 # Новые письма ``` **Критическая метрика:** stat p99 < 10ms --- ### Transactional Database (PostgreSQL) ```yaml operations: - type: write weight: 45 # Запись данных - type: fsync weight: 45 # Коммит транзакций - type: read weight: 10 # Чтение ``` **Критическая метрика:** fsync p99 < 10ms --- ### Container Runtime (Docker) ```yaml operations: - type: mkdir weight: 40 # Создание слоёв - type: write weight: 30 # Запись в слой - type: readdir weight: 20 # Проверка кэша - type: rmdir weight: 10 # Очистка ``` **Критическая метрика:** mkdir p99 < 20ms --- ### Backup System ```yaml operations: - type: readdir weight: 50 # Сканирование каталогов - type: stat weight: 30 # Проверка изменений - type: read weight: 20 # Чтение для backup ``` **Критическая метрика:** readdir p99 < 100ms (для больших каталогов) --- ### Build System (make, ninja) ```yaml 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. Запустите тест ```bash ./disktest -config your_config.yaml -csv results.csv ``` ### 5. Анализируйте результаты Смотрите на p99 latency критичных операций! --- ## Примеры запуска ### Тест всех операций ```bash ./disktest -config examples/balanced.yaml ``` ### Тест БД workload ```bash ./disktest -config examples/database.yaml -csv db_results.csv ``` ### Тест directory operations ```bash ./disktest -config examples/directory_ops.yaml ``` ### Тест Dovecot workload ```bash ./disktest -config examples/dovecot.yaml ```