Benchmark S3 · prima / dopo

Una richiesta.
Stesso risultato.

Prima iterazione: test contro il legacy, correzione dei metadati e misura delle prestazioni. StorageNode e backend fsspec/s3fs restano in uso.

Risultato dimostrato

Gli attributi ora superano il legacy.

Nuovo prima: 6,70 ms. Nuovo dopo: 1,52 ms. Legacy nello stesso run finale: 3,27 ms. Le richieste per il nuovo scendono da quattro a una.

È una conclusione sugli attributi del singolo file in questo ambiente. Copia e spostamento rimangono più lenti. Le variazioni nelle operazioni non modificate non sono attribuibili a questa ottimizzazione.

Prima i test, poi la modifica.

Sorgente originale

Gli stessi test differenziali danno 10 passati e 4 falliti: due casi per la data delle directory e due per le quattro richieste di metadati, con e senza versioning.

Sorgente modificato

Tutti i 14 test differenziali passano. La suite finale comprende 584 test passati e 14 saltati. I salti non sono successi: comprendono servizi opzionali assenti, configurazioni mancanti e un bug preesistente di S3 set_metadata.

I contratti verificati coprono file vuoti, binari, file da 64 KiB, nomi Unicode e spazi, letture e file temporanei, assenza, directory implicite, sovrascritture, copie, spostamenti, cancellazioni e metadati dopo invalidazione. Ogni caso S3 usa servizi reali e bucket isolati, versionati e non versionati.

Il test preesistente dei 1.001 file continua a rifiutare il listing incompleto del legacy: non abbiamo riprodotto quel limite nel nuovo. Questa matrice non certifica la parità dell'intera API legacy.

Le modifiche in Genro Storage.

Tutti i casi confrontati.

Mediane di nove ripetizioni dopo un warmup; un worker; cache dei metadati fredda. Ogni run include entrambi i client, con ordine dei casi rimescolato. Nessun test di integrazione è stato eseguito in contemporanea con le due raccolte qui riportate.

1 KiB; directory di 8 file
OperazioneNuovo prima · msNuovo dopo · msLegacy dopo · msHTTP prima → dopo / legacy
Attributi6,701,523,274 → 1 / 2
Lettura4,102,864,402 → 2 / 3
Scrittura5,034,1118,381 → 1 / 5
Copia16,3513,226,936 → 6 / 3
Spostamento19,8718,2110,5110 → 10 / 6
Albero con attributi4,883,5829,761 → 1 / 18
Esistenza1,561,401,401 → 1 / 1
Listing3,543,424,341 → 1 / 2
File temporaneo5,215,047,713 → 3 / 4
32 MiB
OperazioneNuovo prima · msNuovo dopo · msLegacy dopo · msHTTP prima → dopo / legacy
Lettura157,85136,42145,372 → 2 / 3
Scrittura315,75293,87294,001 → 1 / 5
Copia101,8089,2181,946 → 6 / 3
Spostamento122,68109,07101,7910 → 10 / 6
File temporaneo187,73172,93153,973 → 3 / 7
Le due raccolte sono sequenziali: carico di sistema e stato delle cache del server possono cambiare. I nove campioni non costituiscono una garanzia di tempi in produzione. Su Hetzner non abbiamo ancora misurato.

Che cosa resta da verificare.

La prima prova dimostra che intervenire soltanto su Genro Storage può eliminare uno svantaggio rispetto al legacy. Non dimostra ancora la stessa cosa per tutte le operazioni.

Copia e spostamento conservano rispettivamente 6 e 10 richieste, contro 3 e 6 del legacy. Prima di specializzarli occorre estendere i contratti a directory di destinazione esistenti, copie ricorsive, collisioni fra chiavi e prefissi ed errori. I trasferimenti grandi richiedono più raccolte e un profilo dei tempi: il numero di richieste da solo non spiega tutti gli scarti.

Provenienza e riproducibilità.

Prima
Run 72a82c23-9820-47e7-b0d2-42111d865a09
Hash sorgente 687e9cdb67819e0030cede114b271e299095dd72db54fef2255a716455f839ce

Dopo
Run dac69290-2cbe-4b30-b484-4fedd4201269
Hash sorgente 5e52ee511f0628d3de43bbfe796804f0eadb7ca665eb906467ec700f3d409f8e

I dati grezzi e i metadati delle due raccolte sono disponibili nel JSON della prima ottimizzazione. Entrambe sono concluse senza campioni errati e con pulizia completata. La raccolta preliminare 33e21eba-3441-4b80-9cfe-0aefc7a03b37, sovrapposta ai test iniziali, è esclusa dal confronto.

BENCH_LEGACY_ROOT=/percorso/genropy python -m benchmarks   --adapters legacy genro --sizes 1024 33554432   --workers 1 --repeats 9 --list-count 8 --caches cold

MINIO_ENDPOINT=http://127.0.0.1:29000 BENCH_TEST_ENDPOINT=http://127.0.0.1:29000 BENCH_LEGACY_ROOT=/percorso/genropy python -m pytest tests benchmarks/tests -q -o addopts=''