102 lines
4.5 KiB
Markdown
102 lines
4.5 KiB
Markdown
# DiskTester
|
||
|
||
Тестер дисковой подсистемы на Go с упором на операции
|
||
с метаданными файловой системы (stat), что критично для приложений
|
||
активно работающих с атрибутами файлов.
|
||
|
||
|
||
### КЛЮЧЕВЫЕ ВОЗМОЖНОСТИ:
|
||
|
||
Операции:
|
||
* read - чтение файлов
|
||
* write - запись файлов
|
||
* stat - получение метаданных
|
||
* fsync - Принудительная запись на диск
|
||
* mkdir - Создание каталога
|
||
* rmdir - даление каталога
|
||
* readdir - Чтение содержимого каталога
|
||
|
||
Конфигурация:
|
||
* YAML файлы + command-line flags
|
||
* Гибкие веса операций (например: 70% stat, 20% read, 10% write)
|
||
* Настройка размеров файлов, глубины каталогов
|
||
* Количество workers, длительность теста
|
||
|
||
Метрики:
|
||
* IOPS (операций в секунду)
|
||
* Throughput (MB/s для read/write)
|
||
* Latency percentiles (p50, p95, p99)
|
||
* Раздельная статистика по типам операций
|
||
* JSON, csv отчеты
|
||
|
||
А также:
|
||
* Автоматическое создание тестовых данных
|
||
* Проверка существующих данных (не пересоздаёт)
|
||
* Warmup фаза для стабильности
|
||
* Thread-safe метрики
|
||
* Graceful shutdown
|
||
|
||
|
||
═══════════════════════════════════════════════════════════════
|
||
|
||
### ИНТЕРПРЕТАЦИЯ РЕЗУЛЬТАТОВ:
|
||
|
||
```txt
|
||
--- Stat Operations ---
|
||
Count: 50339 ← выполнено 50,339 операций
|
||
IOPS: 838.98 ← 838 операций в секунду
|
||
Latency (p50): 234µs ← типичная операция: 0.234ms
|
||
Latency (p95): 1.123ms ← 95% операций: < 1.123ms
|
||
Latency (p99): 3.456ms ← 99% операций: < 3.456ms
|
||
```
|
||
|
||
#### Что такое Latency (задержка)?
|
||
|
||
Latency - это время выполнения одной операции. Например:
|
||
|
||
Записать файл заняло 2.5 миллисекунды
|
||
Прочитать файл заняло 1.2 миллисекунды
|
||
Stat файла занял 0.3 миллисекунды
|
||
|
||
В массив latencies собирается время выполнения КАЖДОЙ операции:
|
||
|
||
### Зачем Percentiles (процентили)?
|
||
|
||
Среднее значение (average) - плохая метрика! Вот почему:
|
||
|
||
Пример 1: Обманчивое среднее
|
||
У вас 100 операций:
|
||
|
||
- 95 операций: 1ms
|
||
- 5 операций: 100ms
|
||
|
||
Среднее: (95×1 + 5×100) / 100 = 5.95ms
|
||
Но это НЕ отражает реальность! 95% пользователей видят 1ms, а среднее говорит про 6ms.
|
||
|
||
Percentiles решают эту проблему:
|
||
**p50 (медиана) - 50%** операций быстрее этого значения:
|
||
|
||
"Половина операций выполняется быстрее чем X"
|
||
Типичная производительность
|
||
|
||
**p95 - 95%** операций быстрее этого значения:
|
||
|
||
"95 из 100 операций выполняются быстрее чем X"
|
||
Показывает "почти всегда" производительность
|
||
|
||
**p99 - 99%** операций быстрее этого значения:
|
||
|
||
"99 из 100 операций выполняются быстрее чем X"
|
||
Показывает "худшие случаи" которые всё ещё регулярны
|
||
|
||
#### Интерпретация:
|
||
|
||
- **p50 = 500µs**: Типичный stat выполняется за полмиллисекунды
|
||
- **p95 = 2ms**: В 95% случаев stat занимает ≤ 2ms
|
||
- **p99 = 50ms**: Но 1% операций (100 из 10,000) занимают до 50ms!
|
||
|
||
**Проблема!** Эти 100 медленных операций - это когда пользователь открывает почтовый ящик и ждёт 50ms. Это заметно!
|
||
|
||
═══════════════════════════════════════════════════════════════
|
||
|