Добавить Oper.md
This commit is contained in:
parent
cc200f90a6
commit
f37e93491e
373
Oper.md
Normal file
373
Oper.md
Normal 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
|
||||
```
|
||||
Loading…
x
Reference in New Issue
Block a user