[!] Ready

This commit is contained in:
Maxim Khomutov 2025-03-24 00:12:11 +03:00
parent fe10998751
commit 2b315d42ac
4 changed files with 133 additions and 0 deletions

View File

@ -1,2 +1,13 @@
# FSBenchmarks-module # FSBenchmarks-module
FSBenchmarks module
luguru настроен под формат:
```python
fmt = "<green>{elapsed} -- {time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level:<8}</level> | {extra[module]:^12} | {extra[prefix]:<12} | {message}"
```
Добавление в проект:
```bash
git submodule add ssh://git@git.anidev.ru:222/SantaSpeen/FSBenchmarks-module.git src/modules/FSBenchmarks
```

2
benchmarks/__init__.py Normal file
View File

@ -0,0 +1,2 @@
from .iops import test_iops
from .speed import test_speed

58
benchmarks/iops.py Normal file
View File

@ -0,0 +1,58 @@
import os
import shutil
import time
from pathlib import Path
# Настройки теста
DEPTH = 3 # Глубина вложенности
FILES_PER_LAYER = 3 # Количество файлов в каждом слое
FILE_SIZE = 1024 # Размер файла в байтах
def create_nested_structure(base_dir, depth, files_per_layer, file_size):
"""Создаёт вложенную структуру с именами layerX_Y и файлами file_X_Y"""
start_time = time.time()
total_files = 0
for layer in range(depth):
for sublayer in range(files_per_layer):
layer_dir = os.path.join(base_dir, f"layer{layer}_{sublayer}")
os.makedirs(layer_dir, exist_ok=True)
for file_index in range(files_per_layer):
file_path = os.path.join(layer_dir, f"file_{layer}_{sublayer}_{file_index}.txt")
with open(file_path, "wb") as f:
f.write(os.urandom(file_size))
total_files += 1
elapsed_time = time.time() - start_time
iops = total_files / max(elapsed_time, 1e-9) # Предотвращение деления на ноль
return elapsed_time, iops, total_files
def scan_files(base_dir):
"""Сканирует все файлы и возвращает скорость доступа"""
start_time = time.time()
total_files = 0
for root, dirs, files in os.walk(base_dir):
for file in files:
file_path = os.path.join(root, file)
stat = os.stat(file_path) # Получение метаинформации
_ = (stat.st_size, stat.st_ctime, file) # Вес, дата создания, имя файла
total_files += 1
elapsed_time = time.time() - start_time
iops = total_files / max(elapsed_time, 1e-9) # Предотвращение деления на ноль
return elapsed_time, iops, total_files
def test_iops(path: Path):
os.makedirs(path / ".tests", exist_ok=True)
base_bir = (path / ".tests" / "iops").as_posix()
_, create_iops, _ = create_nested_structure(
base_bir, DEPTH, FILES_PER_LAYER, FILE_SIZE
)
_, scan_iops, _ = scan_files(base_bir)
shutil.rmtree(base_bir)
return create_iops, scan_iops

62
benchmarks/speed.py Normal file
View File

@ -0,0 +1,62 @@
import os
import random
import sys
import time
from pathlib import Path
from loguru import logger as llogger
logger = llogger.bind(module="FSBench", prefix="test")
b = 1
kb = 1024 * b
mb = 1024 * kb
rsize = [
# 100 * mb, 90 * mb, 80 * mb, 70 * mb, 60 * mb, 50 * mb, 40 * mb, 30 * mb, 20 * mb, 10 * mb, # 100mb -> 10mb
5 * mb, 4.5 * mb, 4 * mb, 3.5 * mb, 3 * mb, 2.5 * mb, 2 * mb, 1.5 * mb, 1 * mb, # 5mb -> 1mb
500 * kb, 450 * kb, 400 * kb, 350 * kb, 300 * kb, 250 * kb, 200 * kb, 150 * kb, 100 * kb, # 500kb -> 100kb
# 50 * kb, 45 * kb, 40 * kb, 35 * kb, 30 * kb, 25 * kb, 20 * kb, 15 * kb, 10 * kb # 50kb -> 10kb
]
min_float = sys.float_info.min * sys.float_info.epsilon
def _test(path: Path, size: int):
size = int(size)
path = path / ".tests" / "speed"
logger.debug(f"Speed testing. Path: {path}, Size: {size / mb:.4f}MB")
os.makedirs(path, exist_ok=True)
_test_file = path / ".test_speed"
if os.path.exists(_test_file):
os.remove(_test_file)
# Запись файла
t1 = time.perf_counter()
with open(_test_file, 'wb') as f:
f.write(b'\0' * size)
t2 = time.perf_counter()
# Чтение файла
t3 = time.perf_counter()
with open(_test_file, 'rb') as f:
while f.read(1024 * 1024): # Читаем блоками по 1MB
pass
t4 = time.perf_counter()
os.remove(_test_file)
# Защита от деления на ноль
write_time = max(t2 - t1, 1e-9)
read_time = max(t4 - t3, 1e-9)
return size / write_time / mb, size / read_time / mb # MB/s upload, MB/s download
def test_speed(path: Path, iterations: int = 5):
data_upload = []
data_download = []
for _ in range(iterations):
u, d = _test(path, random.choice(rsize))
data_upload.append(u)
data_download.append(d)
avg_uspeed = sum(data_upload) / len(data_upload)
avg_dspeed = sum(data_download) / len(data_download)
return avg_uspeed, avg_dspeed