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

374 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Поддерживаемые операции в 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
```