À partir de la version 2.0.8, ossfs prend en charge le cache de données local. Cette fonctionnalité met en cache les données de fichiers précédemment lues sur un disque local afin d'accélérer les lectures répétées ultérieures et de réduire le nombre de requêtes adressées à OSS. Cette rubrique décrit les principes de fonctionnement, les méthodes de configuration et les performances du cache de données local.
Informations générales
Lorsque vous utilisez ossfs 2,0 pour accéder à OSS, les données doivent être récupérées depuis le serveur distant à chaque lecture de fichier. Dans les scénarios nécessitant plusieurs cycles de lectures répétées des mêmes données, tels que l'entraînement d'IA et le chargement de modèles, les accès distants fréquents entraînent une latence réseau élevée et une consommation importante de bande passante.
Le cache de données local d'ossfs 2,0 conserve les données de fichiers précédemment lues sur un disque local, de sorte que les accès ultérieurs sont servis directement depuis ce disque. Cela améliore considérablement les performances des lectures répétées et réduit les coûts liés aux requêtes OSS.
Le cache de données local d'ossfs 2,0 présente les caractéristiques suivantes :
Meilleures performances : Dans les scénarios de lectures répétées, qu'il s'agisse de fichiers volumineux ou de petits fichiers, la bande passante est nettement supérieure à celle d'ossfs 1,0. Pour plus d'informations, consultez la comparaison des performances ci-dessous.
Éviction automatique : Une politique d'éviction LRU (Least Recently Used) intégrée libère automatiquement l'espace occupé par les fichiers les moins récemment consultés lorsque le cache est plein, sans nécessiter de nettoyage manuel.
Prise en charge d'un grand nombre de petits fichiers : Lorsqu'il est utilisé conjointement avec le cache de métadonnées (
--max_inode_cache_countet--attr_timeout), il peut accélérer considérablement le chargement en plusieurs cycles des jeux de données d'entraînement d'IA.
Le cache de données local est utilisé uniquement pour la mise en cache en lecture et n'affecte pas le chemin d'écriture. Les opérations d'écriture ne passent pas par le cache local. Cela diffère de l'option -ouse_cache d'ossfs 1.0, qui met en cache à la fois les données en lecture et en écriture.
Principes de fonctionnement
Granularité du cache
Le cache utilise les objets OSS (fichiers) comme unité de base. Chaque fichier lu correspond à un fichier de cache dans le répertoire de cache, et le remplissage du cache s'effectue à la demande.
Processus de lecture
Première lecture : Les données sont récupérées depuis OSS et écrites de manière synchrone dans le répertoire de cache local.
Lectures ultérieures : Les données sont lues directement depuis le cache local.
Libération d'espace
Lorsque le cache approche sa limite de capacité, les anciens fichiers sont automatiquement évincés selon la politique LRU (Least Recently Used) afin de libérer de l'espace pour les nouvelles données. La libération s'effectue au niveau du fichier de cache individuel, qui constitue l'unité minimale.
Méthodes de configuration
|
Élément de configuration |
Obligatoire |
description |
Valeur par défaut |
|
disk_data_cache_dir |
Non |
Chemin du répertoire de cache local. Le cache de données est activé lorsque cet élément est défini sur une valeur non vide. |
Vide |
|
disk_data_cache_size |
Conditionnellement obligatoire |
Capacité maximale du cache, alignée sur des GiB. Elle ne peut pas dépasser l'espace disponible du disque ou de la partition où réside le répertoire de cache. disk_data_cache_dir peut rester vide. Si disk_data_cache_dir est spécifié, ce paramètre doit être défini sur une valeur valide. |
Vide |
|
disk_data_cache_io_engine |
Non |
Moteur d'E/S pour le cache disque. Valeurs valides : psync et libaio. |
psync |
Contraintes :
Le répertoire pointé par --disk_data_cache_dir doit exister et être vide. Nous vous recommandons de vous assurer que le chemin du cache réside sur une partition indépendante ou un disque indépendant.
--disk_data_cache_size ne peut pas dépasser l'espace disponible du disque où réside le répertoire de cache.
Lorsque vous montez plusieurs instances ossfs2 sur la même machine, chaque instance doit utiliser un répertoire de cache indépendant.
Lorsque le processus ossfs2 se termine, le répertoire de cache n'est pas nettoyé automatiquement et doit être supprimé manuellement.
Après le montage, évitez d'effectuer des opérations sur le chemin du répertoire de cache pour prévenir des erreurs inconnues.
Exemple de commande de montage :
ossfs2 mount /mnt/oss/ \
--oss_bucket <your-bucket> \
--oss_endpoint <your-endpoint> \
--oss_access_key_id <ak> \
--oss_access_key_secret <sk> \
--disk_data_cache_dir /mnt/disk/ossfs2/cache \
--disk_data_cache_size 256G
Configuration requise
|
Paramètre |
Exigence |
|
Système de fichiers du disque de cache |
ext4, xfs ou tmpfs (mode psync uniquement). Les autres systèmes de fichiers n'ont pas été vérifiés. |
|
Type de disque de cache |
Un disque éphémère élastique ou un disque NVMe local est recommandé. Le débit des disques ESSD PL0/PL1/PL2 peut facilement devenir un goulot d'étranglement, ce qui peut entraîner une mauvaise expérience utilisateur. Lorsque la mémoire est suffisante, tmpfs peut être utilisé (psync uniquement). |
|
Espace disponible sur le disque de cache |
Supérieur ou égal à la valeur définie pour --disk_data_cache_size |
Recommandations d'utilisation
Le cache de données local convient aux scénarios à forte intensité de lecture et faible intensité d'écriture, nécessitant un accès répété aux mêmes données.
Recommandations pour la configuration du moteur d'E/S (disk_data_cache_io_engine) :
psync : Utilise des appels système de lecture/écriture synchrones ; les données transitent par le PageCache du système d'exploitation lors des lectures. Lorsque la quantité de données mises en cache est proche ou inférieure à la mémoire disponible, les données fréquemment utilisées résident naturellement dans le PageCache, atteignant ainsi des vitesses de lecture proches de celles de la mémoire. Cette option convient aux scénarios généraux, aux disques cloud de faible spécification et aux disques de cache tmpfs (tmpfs ne supporte pas libaio).
libaio : Utilise l'interface d'E/S asynchrone de Linux et contourne le PageCache pour opérer directement sur le disque. Cette option convient aux scénarios disposant de disques NVMe locaux de grande capacité et dont les jeux de données sont beaucoup plus volumineux que la mémoire. Elle offre généralement une amélioration supplémentaire des performances d'environ 20 % par rapport à psync.
Le tableau suivant répertorie les scénarios typiques et les configurations recommandées :
|
Scénario |
Recommandation d'utilisation |
|
Chargement en plusieurs cycles des données d'entraînement d'IA (accès répété au même jeu de données sur plusieurs époques), ou plusieurs requêtes/analyses d'un jeu de données fixe |
Activez le cache de données local et définissez --disk_data_cache_size sur la taille du jeu de données × 1,1. Lorsque le disque de cache est un NVMe local et que le volume de données est important, nous recommandons --disk_data_cache_io_engine=libaio pour exploiter pleinement les performances du disque. |
|
Inférence de grands modèles / chargement vLLM (chargement répété de fichiers de modèle de plusieurs Go) |
Lorsque la mémoire du type d'instance recommandé est supérieure à la taille totale du modèle, utilisez un disque tmpfs comme disque de cache. Si la mémoire est insuffisante pour mettre entièrement en cache les fichiers de modèle, vous pouvez également utiliser un disque local comme disque de cache, mais les performances seront limitées par celles du disque. Dans ce cas, effectuez une évaluation spécifique avant de décider d'activer le cache de données local. |
Dans les scénarios exigeant une grande actualité des données et où les données sont fréquemment modifiées, nous ne recommandons pas d'activer le cache de données (le cache présente un certain décalage en termes d'actualité).
Comparaison des performances
Cibles du test : ossfs 2.0.9 contre ossfs 1.91.10. Dans le tableau, « première lecture / lectures ultérieures » correspondent respectivement à un échec du cache (les données doivent être récupérées depuis OSS) et à un succès du cache local. « — » indique que la configuration ne dispose pas de cache et ne distingue pas la première lecture des lectures ultérieures.
Scénario 1 : Lecture séquentielle de fichiers volumineux (4 threads lisant un fichier de 100 Go)
Environnement de test
Machine : ecs.i4,4xlarge (16 vCPU, 128 GiB)
Disque NVMe local : 3576 GiB NVMe (bande passante en lecture 6 Go/s, bande passante en écriture 3 Go/s, IOPS 900 000)
ossfs 2,0 : --disk_data_cache_dir=<path> --disk_data_cache_size=3T, testé séparément avec --disk_data_cache_io_engine=psync et libaio
ossfs 1,0 : -ouse_cache=<path> -oparallel_count=128
Résultats
|
Configuration |
Mode d'E/S |
Bande passante (première lecture / lectures ultérieures) |
CPU (moy/max) |
Mémoire de pointe |
|
ossfs 2.0 (sans cache) |
- |
2841 Mo/s — |
385 % / 468 % |
5170 Mo |
|
ossfs 2.0 |
psync |
2561 / 4516 Mo/s |
371 % / 526 % |
2118 Mo |
|
libaio |
2343 / 6625 Mo/s |
298 % / 322 % |
2146 Mo |
|
|
ossfs 1.0 |
- |
1249 / 2648 Mo/s |
815 % / 1214 % |
137 Mo |
Conclusion :
Une fois le cache activé, dans le scénario de lectures ultérieures de fichiers volumineux, ossfs 2,0 offre des performances environ 2,5 fois supérieures à celles d'ossfs 1,0 (mode libaio : 6625 contre 2648 Mo/s), atteignant le plafond de performance du NVMe local. Parallèlement, l'utilisation du CPU est considérablement réduite (≈300 % contre 800 %).
Scénario 2 : Lecture d'un grand nombre de petits fichiers (chargement du jeu de données d'entraînement ImageNet)
Environnement de test
Machine : ecs.i4,32xlarge (128 vCPU, 1024 GiB)
Disques NVMe locaux : 8 × 3576 GiB NVMe
Jeu de données : Jeu d'entraînement ImageNet (environ 1,3 million d'images), chargé de manière répétée sur plusieurs époques
ossfs 2,0 : --disk_data_cache_dir=<path> --disk_data_cache_size=1500G --disk_data_cache_io_engine=libaio --attr_timeout=36000 --max_inode_cache_count=11000000 (cache de métadonnées activé)
ossfs 1,0 : -ouse_cache=<path> -oreaddir_optimize -omax_stat_cache_size=11000000 -ostat_cache_expire=72000
Résultats
|
Configuration |
Bande passante (première lecture / lectures ultérieures) |
CPU (moy/max) |
Mémoire de pointe |
|
ossfs 2,0 (sans cache) |
304 Mo/s — (environ 2400 img/s) |
67 % / 209 % |
5062 Mo |
|
ossfs 2,0 |
286 / 1292 Mo/s (environ 10000 img/s) |
219 % / 1068 % |
6470 Mo |
|
ossfs 1,0 |
38 / 224 Mo/s (environ 2000 img/s) |
66,1 % / 206 % |
31,6 Go |
Conclusion :
Une fois le cache disque et le cache de métadonnées activés, les performances de chargement d'ossfs 2,0 lors des époques ultérieures atteignent 4,25 fois celles observées sans cache disque (1292 contre 304 Mo/s), et les requêtes réseau vers OSS sont complètement éliminées. Pour les charges de travail d'entraînement d'IA qui chargent de manière répétée le même jeu de données sur plusieurs cycles, nous recommandons vivement le cache de données local d'ossfs 2,0 combiné à libaio.