TL;DR: este artículo trata sobre un método conveniente, rápido y fiable para identificar programas de Linux que escriben datos en el disco, lo que ayuda a detectar una carga alta o anómala en la subsistema de disco, además de permitir evaluar las sobrecargas del sistema de archivos. Esto es especialmente relevante para SSD en PC, EMMC y memoria Flash en computadoras de placa única.
Durante la redacción del artículo se descubrió que escribir varios kilobytes de datos en el sistema de archivos BTRFS resulta en la escritura de 3 megabytes de datos reales en el disco.
Introducción
“Oh, tonterías, las celdas de memoria en los SSD modernos fallarán después de décadas de uso normal, no hay que preocuparse por eso, y mucho menos trasladar el swap, máquinas virtuales y la carpeta de perfil del navegador a un HDD” — es una respuesta típica a la pregunta sobre la fiabilidad de los discos de estado sólido con aproximadamente 150 TBW garantizados. Si se estima cuánto puede escribir un software típico, parece que 10-20 GB al día es una cifra ya alta, digamos un máximo de 40 GB, ¿qué más se puede escribir? Con esas cifras, la respuesta parece razonable: se necesitan 10 años para alcanzar los valores garantizados en cuanto a la cantidad de sobrescritura de celdas, con 40 GB de datos escritos a diario.
Sin embargo, en 6 años he utilizado ya mi tercer SSD: el primero falló debido a un problema en el controlador, y el segundo empezó a mover datos entre las celdas varias veces al día, lo que resultó en retrasos de 30 segundos en el servicio de escritura.
Después de 7 meses de uso del nuevo SSD, decidí comprobar la cantidad de datos escritos, como lo informa el mismo disco a través de SMART.
19.7 TB.
En total, durante 7 meses he utilizado el 13% de la cantidad garantizada de datos escritos, teniendo en cuenta que está configurado de acuerdo con las recomendaciones para alinear particiones y ajustar el sistema de archivos, el swap casi no se utiliza, los discos máquinas virtuales están ubicados en HDD.
Esta es una cifra anormalmente alta, a este ritmo, el TBW garantizado se superará antes de alcanzar los 5 años de garantía del disco. ¡Y mi computadora no puede escribir 93 gigabytes al día! Necesito verificar cuánto se escribe en el disco en 10 minutos…
Total:
Escrituras en cola: 24,712, 2,237MiB
Escrituras completadas: 25,507, 2,237MiB
Mezclas de escritura: 58, 5,472KiB
2.2 GiB, ¡wow!
Determinación de la cantidad de datos escritos en un dispositivo de disco
Si su dispositivo soporta S.M.A.R.T. (SSD, EMMC, algunas MicroSD industriales), lo primero que debe hacer es solicitar datos del almacenamiento utilizando programas smartctl, skdump o mmc (del conjunto mmc-utils).
Ejemplo de salida del programa smartctl
$ sudo smartctl -a /dev/sdb
smartctl 7.0 2019-03-31 r4903 [x86_64-linux-5.3.11-200.fc30.x86_64] (compilación local)
Copyright (C) 2002-18, Bruce Allen, Christian Franke, www.smartmontools.org
=== INICIO DE LA SECCIÓN DE INFORMACIÓN ===
Familia del modelo: SSD basados en Samsung
Modelo del dispositivo: Samsung SSD 860 EVO mSATA 250GB
Número de serie: S41MNC0KA13477K
Id del dispositivo LU WWN: 5 002538 e700fa64b
Versión del firmware: RVT41B6Q
Capacidad del usuario: 250 059 350 016 bytes [250 GB]
Tamaño de sector: 512 bytes lógico/físico
Tasa de rotación: Dispositivo de estado sólido
Factor de forma: mSATA
El dispositivo está: En la base de datos de smartctl [para detalles usar: -P show]
La versión ATA es: ACS-4 T13/BSR INCITS 529 revisión 5
La versión SATA es: SATA 3.1, 6.0 Gb/s (actual: 3.0 Gb/s)
La hora local es: Mar Nov 19 01:48:50 2019 MSK
El soporte SMART está: Disponibles - el dispositivo tiene capacidades SMART.
El soporte SMART está: Habilitado
=== INICIO DE LA SECCIÓN DE DATOS DE SMART LEIDOS ===
Resultado de la autoevaluación de salud general de SMART: APROBADO
Valores generales de SMART:
Estado de recopilación de datos fuera de línea: (0x00) La actividad de recopilación de datos fuera de línea
nunca se inició.
Recopilación de datos fuera de línea automática: Desactivada.
Estado de ejecución de la autoevaluación: ( 0) La rutina de autoevaluación anterior se completó
sin errores o nunca se ha
ejecutado ninguna autoevaluación.
Tiempo total para completar la
recopilación de datos fuera de línea: ( 0) segundos.
Capacidades de recopilación de datos fuera de línea: (0x53) SMART ejecuta fuera de línea inmediata.
Soporte para encender/apagar la recopilación de datos fuera de línea.
Suspenda la colección fuera de línea al recibir un nuevo
comando.
No se admite escaneo de superficie fuera de línea.
Autoevaluación soportada.
No se admite autoevaluación de transporte.
Autoevaluación selectiva soportada.
Capacidades de SMART: (0x0003) Guarda los datos SMART antes de entrar
en modo de ahorro de energía.
Soporta temporizador de auto-guardado de SMART.
Capacidad de registro de errores: (0x01) Registro de errores soportado.
Registro de propósito general soportado.
Tiempo de sondeo recomendado de la rutina de
autoevaluación corta: ( 2) minutos.
Tiempo de sondeo recomendado de la rutina de
autoevaluación extendida: ( 85) minutos.
Capacidades de SCT: (0x003d) SCT Estado soportado.
Control de recuperación de errores SCT soportado.
Control de funciones SCT soportado.
Tabla de datos SCT soportada.
Número de revisión de la estructura de datos de los atributos SMART: 1
Atributos SMART específicos del vendedor con umbrales:
ID# NOMBRE_DEL_ATRIBUTO FLAG VALOR PEOR UMBRAL TIPO ACTUALIZADO CUANDO_FALLIDO VALOR_CRUDO
5 Reallocated_Sector_Ct 0x0033 100 100 010 Pre-fail Siempre - 0
9 Power_On_Hours 0x0032 098 098 000 Viejo Siempre - 5171
12 Power_Cycle_Count 0x0032 099 099 000 Viejo Siempre - 459
177 Wear_Leveling_Count 0x0013 096 096 000 Pre-fail Siempre - 62
179 Used_Rsvd_Blk_Cnt_Tot 0x0013 100 100 010 Pre-fail Siempre - 0
181 Program_Fail_Cnt_Total 0x0032 100 100 010 Viejo Siempre - 0
182 Erase_Fail_Count_Total 0x0032 100 100 010 Viejo Siempre - 0
183 Runtime_Bad_Block 0x0013 100 100 010 Pre-fail Siempre - 0
187 Uncorrectable_Error_Cnt 0x0032 100 100 000 Viejo Siempre - 0
190 Airflow_Temperature_Cel 0x0032 058 039 000 Viejo Siempre - 42
195 ECC_Error_Rate 0x001a 200 200 000 Viejo Siempre - 0
199 CRC_Error_Count 0x003e 100 100 000 Viejo Siempre - 0
235 POR_Recovery_Count 0x0012 099 099 000 Viejo Siempre - 29
241 Total_LBAs_Written 0x0032 099 099 000 Viejo Siempre - 38615215765
Versión del registro de errores SMART: 1
No se han registrado errores
Estructura del registro de autoevaluación SMART: número de revisión 1
No se han registrado autoevaluaciones. [Para ejecutar autoevaluaciones, use: smartctl -t]
Estructura de datos del registro de autoevaluación selectiva de SMART número de revisión 1
RANGO MIN_LBA MAX_LBA ESTADO_DEL_TEST_ACTUAL
1 0 0 No_en_prueba
2 0 0 No_en_prueba
3 0 0 No_en_prueba
4 0 0 No_en_prueba
5 0 0 No_en_prueba
Banderas de autoevaluación selectiva (0x0):
Después de escanear los rangos seleccionados, NO leer-escaneé el resto del disco.
Si la autoevaluación selectiva está pendiente al encender, reanudar después de 0 minutos de retraso.Mi SSD almacena la cantidad de datos escritos en el parámetro 241 Total_LBAs_Written, en bloques lógicos (LBA), y no en bytes. El tamaño del bloque lógico en mi caso es de 512 bytes (se puede ver en la salida de smartctl, en Sector Size). Para obtener bytes, se debe multiplicar el valor del parámetro por 512.
38615215765 × 512 ÷ 1000 ÷ 1000 ÷ 1000 ÷ 1000 = 19.770 TB
38615215765 × 512 ÷ 1024 ÷ 1024 ÷ 1024 ÷ 1024 = 17.981 TiBreescribirá los metadatos del sistema de archivos. Para esto, usamos el siguiente comando: skdump mi SSD intenta interpretar el valor Total_LBAs_Written de manera incorrecta, por lo que muestra 1296217.695 TB, lo cual, evidentemente, es incorrecto.
Para conocer la cantidad de información escrita a nivel de dispositivo, utilizaremos el programa btrace del paquete blktrace. Muestra tanto la estadística general desde el inicio del programa como los procesos y hilos individuales (incluidos los núcleos) que realizaron la escritura.
Ejecute el siguiente comando para recopilar información durante 10 minutos, donde /dev/sdb es su disco:
# btrace -w 600 -a write /dev/sdbSalida típica del comando
…
8,16 0 3253 50.085433192 0 C WS 125424240 + 64 [0]
8,16 0 3254 50.085550024 0 C WS 193577744 + 64 [0]
8,16 0 3255 50.085685165 0 C WS 197246976 + 64 [0]
8,16 0 3256 50.085936852 0 C WS 125736264 + 128 [0]
8,16 0 3257 50.086060780 0 C WS 96261752 + 64 [0]
8,16 0 3258 50.086195031 0 C WS 94948640 + 64 [0]
8,16 0 3259 50.086327355 0 C WS 124656144 + 64 [0]
8,16 0 3260 50.086843733 15368 C WSM 310218496 + 32 [0]
8,16 0 3261 50.086975238 753 A WSM 310218368 + 32 <- (8,20) 291339904
8,16 0 3262 50.086975560 753 Q WSM 310218368 + 32 [dmcrypt_write\/2]
8,16 0 3263 50.086977345 753 G WSM 310218368 + 32 [dmcrypt_write\/2]
8,16 0 3264 50.086978072 753 I WSM 310218368 + 32 [dmcrypt_write\/2]
8,16 0 3265 50.086979159 753 D WSM 310218368 + 32 [dmcrypt_write\/2]
8,16 0 3266 50.087055685 0 C WSM 310218368 + 32 [0]
8,16 0 3267 50.087060168 753 A WSM 310218592 + 160 <- (8,20) 291340128
8,16 0 3268 50.087060367 753 Q WSM 310218592 + 160 [dmcrypt_write\/2]
8,16 0 3269 50.087061242 753 G WSM 310218592 + 160 [dmcrypt_write\/2]
8,16 0 3270 50.087061698 753 I WSM 310218592 + 160 [dmcrypt_write\/2]
8,16 0 3271 50.087062361 753 D WSM 310218592 + 160 [dmcrypt_write\/2]
8,16 0 3272 50.087386179 0 C WSM 310218592 + 160 [0]
8,16 0 3273 50.087436417 15368 A FWS 0 + 0 <- (253,1) 0
8,16 0 3274 50.087437471 15368 Q FWS [LS Thread]
8,16 0 3275 50.087440862 15368 G FWS [LS Thread]
8,16 0 3276 50.088300047 0 C WS 0 [0]
8,16 0 3277 50.088470917 753 A WFSM 18882688 + 8 <- (8,20) 4224
8,16 0 3278 50.088471091 753 Q WFSM 18882688 + 8 [dmcrypt_write\/2]
8,16 0 3279 50.088471688 753 G WFSM 18882688 + 8 [dmcrypt_write\/2]
8,16 0 3280 50.088474334 32254 D WSM 18882688 + 8 [kworker\/0:2H]
8,16 0 3281 50.088515572 0 C WSM 18882688 + 8 [0]
8,16 0 3282 50.089229069 0 C WSM 18882688 [0]
CPU0 (8,16):
Reads Queued: 0, 0KiB Writes Queued: 345, 25,932KiB
Read Dispatches: 0, 0KiB Write Dispatches: 331, 25,788KiB
Reads Requeued: 0 Writes Requeued: 0
Reads Completed: 0, 0KiB Writes Completed: 1,597, 117,112KiB
Read Merges: 0, 0KiB Write Merges: 1, 16KiB
Read depth: 0 Write depth: 177
IO unplugs: 0 Timer unplugs: 0
CPU1 (8,16):
Reads Queued: 0, 0KiB Writes Queued: 502, 39,948KiB
Read Dispatches: 0, 0KiB Write Dispatches: 495, 40,076KiB
Reads Requeued: 0 Writes Requeued: 0
Reads Completed: 0, 0KiB Writes Completed: 0, 0KiB
Read Merges: 0, 0KiB Write Merges: 0, 0KiB
Read depth: 0 Write depth: 177
IO unplugs: 0 Timer unplugs: 0
CPU2 (8,16):
Reads Queued: 0, 0KiB Writes Queued: 297, 26,800KiB
Read Dispatches: 0, 0KiB Write Dispatches: 287, 26,800KiB
Reads Requeued: 0 Writes Requeued: 0
Reads Completed: 0, 0KiB Writes Completed: 0, 0KiB
Read Merges: 0, 0KiB Write Merges: 0, 0KiB
Read depth: 0 Write depth: 177
IO unplugs: 0 Timer unplugs: 0
CPU3 (8,16):
Reads Queued: 0, 0KiB Writes Queued: 418, 24,432KiB
Read Dispatches: 0, 0KiB Write Dispatches: 408, 24,448KiB
Reads Requeued: 0 Writes Requeued: 0
Reads Completed: 0, 0KiB Writes Completed: 0, 0KiB
Read Merges: 0, 0KiB Write Merges: 2, 272KiB
Read depth: 0 Write depth: 177
IO unplugs: 0 Timer unplugs: 0
Total (8,16):
Reads Queued: 0, 0KiB Writes Queued: 1,562, 117,112KiB
Read Dispatches: 0, 0KiB Write Dispatches: 1,521, 117,112KiB
Reads Requeued: 0 Writes Requeued: 0
Reads Completed: 0, 0KiB Writes Completed: 1,597, 117,112KiB
Read Merges: 0, 0KiB Write Merges: 3, 288KiB
IO unplugs: 0 Timer unplugs: 0
Throughput (R\/W): 0KiB\/s \/ 2,338KiB\/s
Events (8,16): 9,287 entries
Skips: 0 forward (0 - 0.0%) btrace permite ver claramente la cantidad real de datos escritos, pero es difícil entender qué programas están realizando la escritura a partir de su salida.
Detección de programas que realizan escritura en el almacenamiento
reescribirá los metadatos del sistema de archivos. Para esto, usamos el siguiente comando: iotop mostrará los procesos que escriben en el disco y el tamaño de los datos escritos.
Los siguientes parámetros ofrecen la salida más conveniente:
# iotop -obPatEjemplo de salida del programa
02:55:47 Total DISK READ : 0.00 B/s | Total DISK WRITE : 30.65 K/s
02:55:47 Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
TIME PID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
b'02:55:47 753 be/4 root 0.00 B 0.00 B 0.00 % 0.04 % [dmcrypt_write/2]'
b'02:55:47 788 be/4 root 72.00 K 18.27 M 0.00 % 0.02 % [btrfs-transacti]'
b'02:55:47 15057 be/4 valdikss 216.00 K 283.05 M 0.00 % 0.01 % firefox'
b'02:55:47 1588 ?dif root 0.00 B 0.00 B 0.00 % 0.00 % Xorg -nolisten tcp -auth /var/run/sddm/{398f030f-9667-4dff-b371-81eaae48dfdf} -background none -noreset -displayfd 18 -seat seat0 vt1'
b'02:55:47 15692 be/4 valdikss 988.00 K 9.41 M 0.00 % 0.00 % python3 /usr/bin/gajim'
b'02:55:47 15730 ?dif valdikss 9.07 M 0.00 B 0.00 % 0.00 % telegram-desktop --'
b'02:55:47 2174 ?dif valdikss 1840.00 K 2.47 M 0.00 % 0.00 % yakuake'
b'02:55:47 19827 be/4 root 16.00 K 896.00 K 0.00 % 0.00 % [kworker/u16:7-events_unbound]'
b'02:55:47 19074 be/4 root 16.00 K 480.00 K 0.00 % 0.00 % [kworker/u16:4-btrfs-endio-write]'
b'02:55:47 19006 be/4 root 16.00 K 1872.00 K 0.00 % 0.00 % [kworker/u16:1-events_unbound]'
b'02:55:47 1429 be/4 root 484.00 K 0.00 B 0.00 % 0.00 % accounts-daemon'
b'02:55:47 15820 be/4 valdikss 312.00 K 0.00 B 0.00 % 0.00 % firefox -contentproc -childID 6 -isForBrowser -prefsLen 7894 -prefMapSize 223880 -parentBuildID 20191022164834 -greomni /usr/lib64/firefox/omni.ja -appomni /usr/lib64/firefox/browser/omni.ja -appdir /usr/lib64/firefox/browser 15057 tab'
b'02:55:47 2125 ?dif valdikss 0.00 B 92.00 K 0.00 % 0.00 % plasmashell'
b'02:55:47 1268 be/3 root 0.00 B 4.00 K 0.00 % 0.00 % auditd'
b'02:55:47 1414 be/4 root 0.00 B 4.00 K 0.00 % sssd_nss --uid 0 --gid 0 --logger=files'
b'02:55:47 15238 be/4 valdikss 0.00 B 4.00 K 0.00 % 0.00 % thunderbird'
b'02:55:47 18605 be/4 root 0.00 B 3.19 M 0.00 % 0.00 % [kworker/u16:0-btrfs-endio-write]'
b'02:55:47 18867 be/4 root 0.00 B 96.00 K 0.00 % 0.00 % [kworker/u16:5-btrfs-endio-meta]'
b'02:55:47 19070 be/4 root 0.00 B 160.00 K 0.00 % 0.00 % [kworker/u16:2-btrfs-freespace-write]'
b'02:55:47 19645 be/4 root 0.00 B 2.17 M 0.00 % 0.00 % [kworker/u16:3-events_unbound]'
b'02:55:47 19982 be/4 root 0.00 B 496.00 K 0.00 % 0.00 % [kworker/u16:6-btrfs-endio-write]'Destaca Firefox, que ha escrito 283 megabytes en unos pocos minutos de funcionamiento de iotop.
Detección de archivos en los que se realiza la escritura
La información sobre el proceso que está forzando el disco es buena, pero conocer los caminos por los que se realiza la escritura es aún mejor.
Utilicemos el programa fatrace, que rastrea los cambios en el sistema de archivos.
# fatrace -f WEjemplo de salida del programa
firefox(15057): CW /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite-wal
firefox(15057): CW /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): CW /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/usage-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/usage
firefox(15057): CW /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/usage
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite-wal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite-wal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite-wal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite-wal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite-wal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite-wal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite-wal
firefox(15057): CW /home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/https+++habr.com/ls/data.sqlite-journal
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqlite
firefox(15057): W /home/valdikss/.mozilla/firefox/xyf4vqh2.default/webappsstore.sqliteFatrace no puede mostrar la cantidad de datos escritos debido a su uso de un seguimiento bastante simple de las solicitudes de archivo a través de inotify.
De la salida se puede ver cómo Habr guarda mi artículo en el almacenamiento local del navegador mientras lo estoy escribiendo, así como la extensión Group Speed Dial, que, como se pudo descubrir precisamente gracias a fatrace, lee sus datos cada 30 segundos. Solo lee, no escribe: CW перед el archivo indica que está abierto para lectura y escritura, creando simultáneamente el archivo si no existe (se llama a openat con la bandera O_RDWR|O_CREAT), pero no indica que realmente se haya escrito información en el archivo.
Para asegurarnos de esto, utilizaremos strace, filtrando las llamadas del sistema de archivos:
strace -yy -e trace=open,openat,close,write -f -p 15057 2>&1 | grep extensionSalida del comando
[pid 20352] openat(AT_FDCWD, "/home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 153
[pid 20352] read(153, "Formato SQLite 3 20 22 @ d 23"..., 100) = 100
[pid 20352] read(153, "Formato SQLite 3 20 22 @ d 23"..., 4096) = 4096
[pid 20352] openat(AT_FDCWD, "/home/valdikss/.mozilla/firefox/xyf4vqh2.default/storage/default/moz-extension+++e5c304fb-af40-498a-9ba8-47eb0416e933^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite-wal", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 166
…
[pid 20352] read(54, " r4304364354354364- 4204!4'414" 250 &..., 4096) = 4096
[pid 20352] read(54, " 136Pt2262504 O24532016:"16.27 r245306>2461t1q370"..., 4096) = 4096
[pid 20352] close(77) = 0
[pid 20352] close(54) = 0 No hay ninguna llamada write(), lo que indica que no hay registros en el archivo.
Definición de la sobrecarga del sistema de archivos
La gran diferencia en las lecturas iotop y btrace suscitó la idea de probar el sistema de archivos mediante la escritura manual de datos en un archivo y rastrear las lecturas btrace.
Si excluimos completamente la escritura en disco, iniciando en modo de emergencia de systemd, y escribimos manualmente un par de bytes de datos en un archivo existente, btrace en SSD con btrfs informa de una escritura de 3 megabytes datos reales. Un sistema de archivos recién creado en una memoria flash de 8 GB escribe un mínimo de 264 KiB al escribir un solo byte.
En comparación, escribir un par de bytes en un archivo en ext4 termina con la escritura de 24 kilobytes de datos en el disco.
En 2017, Jayashree Mohan, Rohan Kadekodi y Vijay Chidambaram , sus resultados para btrfs y ext4 al escribir 4 KB se relacionan con los míos.

Conclusión y resumen
A través de las manipulaciones descritas se descubrió:
- La grabación frecuente de estados de trabajos para la impresora por el demonio de impresión CUPS en /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
- El hecho de leer la base de datos cada 30 segundos por la extensión Group Speed Dial para Firefox;
- La grabación periódica de registros por varios servicios de monitoreo de rendimiento en Fedora, lo que provocaba la escritura de varios megabytes de datos en btrfs: pmcd.service, pmie.service, pmlogger.service;
- Una enorme amplificación al escribir una pequeña cantidad de datos al usar btrfs.
Conclusión: no se debe utilizar btrfs si los programas a menudo escriben una pequeña cantidad de datos (varios kilobytes), de lo contrario resultará en megabytes de datos escritos. Esto es especialmente relevante para computadoras de placa única con sistemas operativos en MicroSD.
Fuente: habr.com
