¿Cuál es el tamaño de una escritura atómica en disco en mi sistema?

10

En la documentación de la access_logdirectiva , la documentación de nginx dice

El tamaño del búfer no debe exceder el tamaño de una escritura atómica en un archivo de disco.

¿Cómo puedo determinar cuál es este tamaño en mi sistema?

Bdesham
fuente
@mdpc Del documento vinculado está bastante claro, que no se trata de tamaños de sector, por cierto. ha sido de 512 bytes en la mayoría de los medios desde finales de los 80 hasta ahora. Hay un movimiento hacia los tamaños de sector 4K en las nuevas unidades.
Kasperd
Esta especificación puede ser relevante. Aunque no parece dar una respuesta exacta a la pregunta: pubs.opengroup.org/onlinepubs/7908799/xsh/write.html
kasperd

Respuestas:

3

mejor tarde que nunca :)

la respuesta rápida es: "2,147,479,552 bytes, si la versión del kernel es 3.14 o más nueva"

respuesta detallada:

Por lo que yo entiendo, se trata de escribir syscall:

http://man7.org/linux/man-pages/man2/write.2.html

1) cualquier sistema POSIX (linux, bsd, todos unix) está garantizado para poder escribir hasta MAX_SSIZE bytes

Según POSIX.1, si el recuento es mayor que SSIZE_MAX, el resultado está definido por la implementación; vea las NOTAS para el límite superior en Linux.

# getconf SSIZE_MAX
32767

2) Linux garantiza poder escribir hasta 1.99 GiB (y es una operación atómica para Linux kernel versión 3.14 y posteriores)

En Linux, write () (y llamadas de sistema similares) transferirán como máximo 0x7ffff000 (2,147,479,552) bytes, devolviendo el número de bytes realmente transferidos. (Esto es cierto tanto en los sistemas de 32 bits como en los de 64 bits).

Pero es una operación atómica justa solo desde el kernel 3.14 de Linux

De acuerdo con POSIX.1-2008 / SUSv4 Sección XSI 2.9.7 ("Interacciones de subprocesos con operaciones regulares de archivos"):

Todas las siguientes funciones serán atómicas entre sí en los efectos especificados en POSIX.1-2008 cuando operan en archivos regulares o enlaces simbólicos: ...

Entre las API que se enumeran posteriormente se encuentran write () y writev (2). Y entre los efectos que deberían ser atómicos en los subprocesos (y procesos) se encuentran las actualizaciones del desplazamiento del archivo. Sin embargo, en Linux antes de la versión 3.14, este no era el caso: si dos procesos que comparten una descripción de archivo abierto (ver open (2)) realizan una escritura () (o writev (2)) al mismo tiempo, entonces el I Las operaciones / O no fueron atómicas con respecto a la actualización del desplazamiento del archivo, con el resultado de que los bloques de salida de datos de los dos procesos podrían (incorrectamente) solaparse. Este problema se solucionó en Linux 3.14.

Oleg Korchagin
fuente
1

Esta respuesta de Superusuario tenía una buena definición de qué es el tamaño de escritura atómica.

Esto es al menos tan grande como el tamaño del sector de hardware, que es el tamaño de lectura / escritura atómica.

mlw4428
fuente
1
Bien, entonces, ¿cómo puedo determinar qué tan grande es un sector de disco?
bdesham
99
La documentación de nginx y la respuesta del superusuario no hablan de la misma capa en la pila de almacenamiento. La documentación de nginx habla sobre la escritura atómica más grande en la capa del sistema de archivos, que depende del sistema operativo y del FS. La respuesta del superusuario está hablando de la escritura atómica más grande a nivel de bloque, que depende del hardware.
Kasperd