[!] Ready
This commit is contained in:
parent
fe10998751
commit
2b315d42ac
11
README.md
11
README.md
@ -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
2
benchmarks/__init__.py
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
from .iops import test_iops
|
||||||
|
from .speed import test_speed
|
58
benchmarks/iops.py
Normal file
58
benchmarks/iops.py
Normal 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
62
benchmarks/speed.py
Normal 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
|
Loading…
x
Reference in New Issue
Block a user