diff --git a/Oper.md b/Oper.md new file mode 100644 index 0000000..91dd46c --- /dev/null +++ b/Oper.md @@ -0,0 +1,373 @@ +# Поддерживаемые операции в 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 +```