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