Identificamos procesos con actividad de disco en Linux

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 TiB

reescribirá 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/sdb

Salida 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 -obPat

Ejemplo 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 W

Ejemplo 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.sqlite

Fatrace 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 extension

Salida 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 realizaron un estudio sobre la mejora de la escritura en diferentes sistemas de archivos, sus resultados para btrfs y ext4 al escribir 4 KB se relacionan con los míos.

Identificamos procesos con actividad de disco en Linux

Conclusión y resumen

A través de las manipulaciones descritas se descubrió:

  1. 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 (хотя никаких заданий печати не было);
  2. El hecho de leer la base de datos cada 30 segundos por la extensión Group Speed Dial para Firefox;
  3. 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;
  4. 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

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster