A partir de la versión 2.0.9, ossfs admite escrituras aleatorias mediante un directorio temporal local. Al configurar la opción de montaje --temp_dir, ossfs 2.0 almacena temporalmente los datos escritos en un disco local. Esto otorga al punto de montaje semántica completa de escritura aleatoria POSIX, que incluye escrituras en posiciones arbitrarias, truncamiento a cualquier tamaño y lectura durante la escritura. Este tema describe los principios de funcionamiento, los métodos de configuración, las restricciones de uso y las recomendaciones para las escrituras aleatorias.
Contexto
Una vez creado un objeto en OSS, no es posible modificarlo parcialmente; cualquier cambio de contenido requiere sobrescribir el objeto completo. En el modo predeterminado de ossfs 2.0, la ruta de escritura utiliza carga por streaming: los datos se cargan a OSS en partes secuenciales conforme se escriben, lo cual presenta las siguientes limitaciones:
Solo se admiten escrituras secuenciales. No se admiten llamadas a
pwriteen posiciones más allá del final del archivo.truncatesolo admite truncar a 0. Truncar a cualquier otro tamaño distinto de cero devuelveENOTSUP.No es posible leer un archivo mientras se escribe (antes de cerrarlo). Intentarlo devuelve
EBUSY.
Escenarios como la ejecución de código de agentes de IA, la edición de scripts en el mismo lugar y los resultados intermedios de cómputo científico suelen depender de la semántica de escritura aleatoria. La función de escritura aleatoria de ossfs 2.0 almacena temporalmente los datos escritos en un directorio temporal local y, combinada con la gestión de fragmentos y la carga incremental, implementa escrituras aleatorias sobre object storage.
El modo de escritura aleatoria de ossfs 2.0 tiene las siguientes características:
Semántica completa de escritura aleatoria POSIX: Admite
pwriteen posiciones arbitrarias,O_APPENDytruncatea cualquier tamaño (aumento o reducción).Lectura durante la escritura: Es posible leer un archivo mientras se escribe. Las partes modificadas se leen desde el área de almacenamiento temporal local, y las partes no modificadas se leen directamente desde OSS.
Carga incremental: Al vaciar el búfer o cerrar el archivo, solo se cargan desde el disco local los bloques de datos modificados. Las partes no modificadas se gestionan mediante copia del lado del servidor en OSS, sin consumo de E/S local ni ancho de banda de carga.
Protección del espacio en disco: Un presupuesto global integrado de espacio en disco devuelve
ENOSPCpara las escrituras cuando queda poco espacio en el disco de almacenamiento temporal. Puede reservar un umbral de espacio libre al montar para evitar que se llene el disco del sistema.
El directorio temporal local sirve únicamente para la ruta de escritura. Es independiente de la caché de datos local (--disk_data_cache_dir, que es una caché de lectura). Puede habilitar ambas funciones simultáneamente (usando directorios diferentes) sin que exista interferencia entre ellas.
De forma predeterminada, ossfs 1.0 usa el directorio /tmp como directorio temporal local. Para mantener la ruta consistente con la predeterminada de ossfs 1.0, configure --temp_dir=/tmp.
Tras habilitar las escrituras aleatorias, el rendimiento de escritura queda limitado por el rendimiento de lectura y escritura del disco donde reside el directorio temporal local. En escenarios que implican escrituras secuenciales masivas, como la copia de archivos grandes, el rendimiento es muy inferior al del modo predeterminado. Habilite esta función solo cuando su carga de trabajo requiera realmente semántica de escritura aleatoria.
Principios de funcionamiento
Almacenamiento temporal local y carga combinada
Al habilitar las escrituras aleatorias, ossfs 2.0 crea un archivo de almacenamiento temporal en el directorio temporal local para cada archivo sujeto a escritura aleatoria. Esto guarda las modificaciones más recientes de forma local con una granularidad fija de bloque de datos (fragmento):
Los datos escritos se depositan directamente en el archivo de almacenamiento temporal local. Si una escritura solo se superpone parcialmente a un bloque de datos que ya existe en la nube, ossfs primero recupera ese bloque desde OSS para garantizar que los datos almacenados temporalmente estén completos.
Al ejecutar
fsyncoclose, las modificaciones almacenadas temporalmente se combinan automáticamente y se cargan junto con los datos en la nube: las partes modificadas se cargan desde el disco local, y las partes no modificadas se gestionan mediante copia del lado del servidor en OSS, sin retransmitir todo el archivo ni consumir ancho de banda de lectura del disco local.Tras una carga correcta, el espacio en disco de almacenamiento temporal se libera automáticamente.
Lectura durante la escritura
También es posible leer un archivo mientras se escribe: las partes modificadas se leen desde el área de almacenamiento temporal local, y las partes no modificadas se leen directamente desde OSS.
Protección del espacio en disco
Al montar, ossfs comprueba si el espacio libre en el disco donde reside el directorio temporal cumple con el requisito reservado y rechaza el montaje si no es así. Si el espacio de disco reservado es insuficiente, las escrituras devuelven ENOSPC en lugar de que el proceso falle debido a un disco lleno.
Métodos de configuración
|
Elemento de configuración |
Obligatorio |
Descripción |
Valor predeterminado |
|
temp_dir |
No |
Ruta del directorio temporal local. Debe ser una ruta absoluta. Establecer un valor no vacío habilita las escrituras aleatorias. Déjelo vacío para deshabilitar esta función. |
Vacío |
|
temp_dir_free_bytes |
No |
Espacio mínimo libre reservado en el disco donde reside el directorio temporal, en bytes (admite unidades como K, M y G). ossfs2 no usará este espacio reservado para datos temporales: cuando el espacio libre cae por debajo de este umbral, las nuevas escrituras devuelven ENOSPC, dejando un margen de seguridad para otras cargas de trabajo en el mismo disco. Si el espacio libre ya está por debajo de este valor al momento del montaje, este fallará. Valor mínimo: 64 MiB. |
1 GiB |
|
random_write_max_file_size |
No |
Tamaño lógico máximo de un solo archivo en modo de escritura aleatoria, en bytes (admite unidades como K, M y G). Las escrituras o truncamientos que excedan este límite devuelven EFBIG. El límite físico superior es la capacidad de carga multiparte de OSS (10,000 partes × 5 GiB, aproximadamente 48.8 TiB). |
100 GiB |
Restricciones:
Si el directorio al que apunta
--temp_dirno existe, se crea automáticamente. Se recomienda usar una partición o disco independiente para evitar competir por espacio con el disco del sistema u otras cargas de trabajo.Los datos de los archivos en escritura se almacenan en el directorio temporal local. Si el disco carece de capacidad, las escrituras devuelven ENOSPC. El espacio libre restante menos el espacio reservado por
temp_dir_free_bytesse denomina espacio de disco escribible. ossfs2 solo usa esta porción de espacio para almacenar los datos que se están escribiendo. El espacio de disco escribible debe ser mayor que el tamaño total de todos los archivos que se escriben simultáneamente (en el peor de los casos, un archivo completo podría escribirse localmente).Cuando varias instancias de ossfs2 se montan en la misma máquina, pueden compartir el mismo directorio temporal, ya que los nombres de los archivos temporales no entran en conflicto. Sin embargo, dado que múltiples instancias competirán por el espacio y la E/S del disco, se recomienda usar directorios independientes.
--temp_diry--enable_appendable_objectson mutuamente excluyentes y no pueden habilitarse al mismo tiempo.
Ejemplo de comando de montaje:
ossfs2 mount /mnt/oss/ \
--oss_bucket <your-bucket> \
--oss_endpoint <your-endpoint> \
--oss_access_key_id <ak> \
--oss_access_key_secret <sk> \
--temp_dir /mnt/disk/ossfs2/temp \
--temp_dir_free_bytes 1G
Requisitos del entorno
|
Parámetro |
Requisito |
|
Tipo de disco del directorio temporal |
Se recomienda disco efímero elástico, NVMe local o ESSD. El throughput de escritura del disco afecta directamente la latencia de escritura aleatoria y la velocidad de carga. |
|
Espacio disponible en disco |
No menor que |
Efectos de la función
Comparación de las capacidades de escritura antes y después de habilitar --temp_dir:
|
Operación |
Modo predeterminado |
Modo de escritura aleatoria |
|
Escritura por anexión secuencial |
Compatible |
Compatible |
|
pwrite en una posición arbitraria (más allá del final del archivo) |
No compatible |
Compatible |
|
truncate a 0 |
Compatible |
Compatible |
|
truncate a cualquier tamaño (aumento o reducción) |
No compatible (ENOTSUP) |
Compatible |
|
Escritura O_APPEND en un archivo existente |
Compatible |
Compatible |
|
Lectura de un archivo mientras se escribe |
No compatible (EBUSY) |
Compatible |
|
Varios identificadores escribiendo en el mismo archivo simultáneamente |
No compatible |
Compatible |
Semántica de durabilidad:
De forma predeterminada, el modo de escritura aleatoria sigue la semántica de
fsync:fsyncdesencadena una carga combinada de las modificaciones locales con los datos en la nube. Una devolución exitosa significa que los datos se han persistido en OSS. Los datos restantes también se cargan al cerrar el archivo.Un fallo de carga se devuelve a la aplicación como un error, y la aplicación puede reintentar mediante
fsync. Si la carga falla definitivamente y se cierra el archivo, los datos no persistidos se pierden, y el contenido del archivo revierte a la última versión cargada correctamente en el extremo remoto.Si el proceso termina de forma anómala, los datos temporales no cargados se pierden, pero el objeto en OSS permanece en el estado de su última carga exitosa. No se genera ningún objeto dañado.
Recomendaciones de uso
Las escrituras aleatorias basadas en un directorio temporal local son adecuadas para escenarios que requieren semántica de escritura similar a la de un sistema de archivos local en un punto de montaje de OSS.
Escenarios adecuados para habilitar escrituras aleatorias:
|
Escenario |
Recomendación de uso |
|
Ejecución de código de agentes de IA / entornos sandbox (los agentes e intérpretes de código realizan lecturas y escrituras arbitrarias, así como ediciones en el mismo lugar, sobre archivos) |
Habilite las escrituras aleatorias. Se recomienda usar un disco independiente de alto rendimiento para el directorio temporal y reservar espacio de disco escribible según el tamaño total de los archivos que se escriben simultáneamente. |
|
Archivos de resultados intermedios de aplicaciones de cómputo científico o simulación |
Habilite las escrituras aleatorias. Planifique el espacio de disco escribible según el tamaño total de los archivos que se escriben simultáneamente. |
Escenarios donde no se recomienda habilitar escrituras aleatorias:
|
Escenario |
Recomendación de uso |
|
Copia de archivos grandes (escrituras masivas al punto de montaje usando cp, rsync y herramientas similares) |
En este escenario, el rendimiento de escritura está limitado por el disco local y es muy inferior al del modo predeterminado. Use el modo de carga por streaming predeterminado. |
|
Escrituras por anexión puramente secuenciales (escritura de registros por streaming) |
La ruta de carga por streaming predeterminada tiene menor sobrecarga, por lo que habilitar escrituras aleatorias es innecesario. Si requiere lectura durante la escritura, considere usar |
Recomendaciones de presupuesto de disco:
Mantenga el directorio temporal separado del disco del sistema para evitar que los datos temporales llenen el disco del sistema y afecten la estabilidad del host. Si la máquina tiene un solo disco, se recomienda establecer
temp_dir_free_bytesen un valor mayor (por ejemplo, 10G) para reservar suficiente espacio libre para el sistema.El espacio de disco escribible (consulte las restricciones anteriores) debe ser mayor que el tamaño total de los archivos que se escriben simultáneamente.
Para un solo archivo mayor a 100 GiB, además de aumentar explícitamente
--random_write_max_file_size(por ejemplo,--random_write_max_file_size=500G), debe asegurarse de que el espacio de disco escribible supere el tamaño de dicho archivo.