Добавить Oper.md

This commit is contained in:
denis 2026-03-25 17:57:26 +03:00
parent cc200f90a6
commit f37e93491e

373
Oper.md Normal file
View File

@ -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
```