Identificamos processos com atividade de disco no Linux

TL;DR: este artigo fala sobre uma maneira conveniente, rápida e confiável de identificar programas Linux que gravam dados no disco, ajudando a detectar uma carga alta ou anormalmente frequente no subsistema de disco, além de permitir avaliar o overhead do sistema de arquivos. Isso é especialmente relevante para SSDs em PCs, EMMC e memória Flash em computadores de placa única.
Durante a redação do artigo, percebi que a gravação de alguns kilobytes de dados no sistema de arquivos BTRFS resulta na gravação de 3 megabytes de dados reais no disco.

Introdução

“Ah, bobagem, as células de memória dos SSDs modernos falharão após décadas de uso normal, não vale a pena se preocupar com isso, muito menos transferir swap, máquinas virtuais e a pasta do perfil do navegador para o HDD” — uma resposta típica à questão sobre a confiabilidade dos drives de estado sólido com garantias de ≈150 TBW. Se considerarmos quanta dados um software típico pode gravar, parece que 10-20 GB por dia já é um número alto, vamos considerar no máximo 40 GB, o que mais poderia haver. Com esses números, a resposta parece bastante razoável — seriam necessários 10 anos para alcançar os valores garantidos em termos de número de regravações das células, com 40 GB de dados gravados diariamente.
No entanto, após 6 anos, já estou usando meu terceiro SSD: o primeiro teve a controladora queimada, e o segundo começou a mover dados entre as células várias vezes ao dia, resultando em atrasos de 30 segundos no atendimento ao gravar.

Após 7 meses de uso do novo SSD, decidi verificar a quantidade de dados gravados, conforme reportado pelo próprio disco via SMART.
19.7 TB.
Em apenas 7 meses, utilizei 13% da quantidade garantida de dados gravados, considerando que está configurado de acordo com as recomendações para alinhamento de partições e configuração do FS, e eu quase não uso swap, os discos máquinas virtuais estão alocados no HDD!
Esse número é anormalmente alto, com esse ritmo, o TBW garantido será excedido antes do término do prazo de 5 anos de garantia do disco. E meu computador não pode gravar 93 gigabytes por dia! Preciso verificar quanta dados estão sendo gravados no disco em 10 minutos...

Total:
Escritas em Espera: 24.712, 2.237MiB
Escritas Concluídas: 25.507, 2.237MiB
Fusões de Escrita: 58, 5.472KiB

2.2 GiB, uau!

Determinação da quantidade de dados gravados no dispositivo de disco

Se o seu dispositivo suporta S.M.A.R.T. (SSD, EMMC, alguns MicroSD industriais), o primeiro passo é solicitar dados do armazenamento com os programas smartctl, skdump ou mmc (do pacote mmc-utils).

Exemplo de saída do programa smartctl

$ sudo smartctl -a /dev/sdb
smartctl 7.0 2019-03-31 r4903 [x86_64-linux-5.3.11-200.fc30.x86_64] (construção local)
Copyright (C) 2002-18, Bruce Allen, Christian Franke, www.smartmontools.org

=== INÍCIO DA SEÇÃO DE INFORMAÇÕES ===
Modelo familiar:     SSDs baseados em Samsung
Modelo do dispositivo:     Samsung SSD 860 EVO mSATA 250GB
Número de série:    S41MNC0KA13477K
LU WWN ID do dispositivo: 5 002538 e700fa64b
Versão do firmware: RVT41B6Q
Capacidade do usuário:    250 059 350 016 bytes [250 GB]
Tamanho do setor:      512 bytes lógico/físico
Taxa de rotação:    Dispositivo de Estado Sólido
Fator de forma:      mSATA
O dispositivo está:        No banco de dados smartctl [para detalhes use: -P show]
A versão ATA é:   ACS-4 T13/BSR INCITS 529 revisão 5
A versão SATA é:  SATA 3.1, 6.0 Gb/s (atual: 3.0 Gb/s)
A hora local é:    Ter Nov 19 01:48:50 2019 MSK
O suporte SMART está: Disponível - o dispositivo possui capacidade SMART.
O suporte SMART está: Habilitado

=== INÍCIO DA SEÇÃO DE LEITURA DE DADOS SMART ===
Resultado do teste de autoavaliação da saúde geral do SMART: APROVADO

Valores gerais do SMART:
Status da coleta de dados offline:  (0x00) A atividade de coleta de dados offline
                                        nunca foi iniciada.
                                        Coleta de dados offline automática: Desativada.
Status de execução do auto-teste:      (   0) A rotina anterior de auto-teste foi concluída
                                        sem erro ou nenhum auto-teste foi executado.
Tempo total para concluir a coleta de dados offline:                (    0) segundos.
Capacidades de coleta de dados offline:                    (0x53) Executa imediatamente o SMART Offline.
                                        Suporte para coleta de dados offline automática on/off.
                                        Suspender coleção offline mediante novo
                                        comando.
                                        Nenhuma varredura de superfície offline suportada.
                                        Auto-teste suportado.
                                        Nenhum auto-teste de transporte suportado.
                                        Auto-teste seletivo suportado.
Capacidades SMART:            (0x0003) Salva dados SMART antes de entrar no
                                        modo de economia de energia.
                                        Suporta temporizador de salvamento automático do SMART.
Capacidade de registro de erros:        (0x01) Registro de erros suportado.
                                        Registro de uso geral suportado.
Tempo de polling recomendado para a rotina do auto-teste curto:        (   2) minutos.
Tempo de polling recomendado para a rotina do auto-teste estendido:        (  85) minutos.
Capacidades SCT:              (0x003d) Status SCT suportado.
                                        Controle de recuperação de erros SCT suportado.
                                        Controle de recursos SCT suportado.
                                        Tabela de dados SCT suportada.

Número da revisão da estrutura de dados de atributos SMART: 1
Atributos SMART específicos do fornecedor com limites:
ID# NOME_DO_ATTRIBUTO          FLAG     VALOR PIOR LIMITE TIPO      ATUALIZADO  QUANDO_FALHOU VALOR_RAW
  5 Contador_Setores_Realoctados   0x0033   100   100   010    Pré-falha  Sempre       -       0
  9 Horas_Ligado              0x0032   098   098   000    Idade_antiga   Sempre       -       5171
 12 Contador_Ciclo_Poder          0x0032   099   099   000    Idade_antiga   Sempre       -       459
177 Contador_Nivel_Afatamento     0x0013   096   096   000    Pré-falha  Sempre       -       62
179 Contador_Blc_Usado_Rsvd_Total   0x0013   100   100   010    Pré-falha  Sempre       -       0
181 Contador_Falhas_Programa_Total  0x0032   100   100   010    Idade_antiga   Sempre       -       0
182 Contador_Falhas_Eras_Total  0x0032   100   100   010    Idade_antiga   Sempre       -       0
183 Bloco_Ruim_Runtime       0x0013   100   100   010    Pré-falha  Sempre       -       0
187 Contador_Erros_Incorretos 0x0032   100   100   000    Idade_antiga   Sempre       -       0
190 Temperatura_Fluxo_Cel 0x0032   058   039   000    Idade_antiga   Sempre       -       42
195 Taxa_Erro_ECC          0x001a   200   200   000    Idade_antiga   Sempre       -       0
199 Contador_Erros_CRC         0x003e   100   100   000    Idade_antiga   Sempre       -       0
235 Contador_Recuperação_POR      0x0012   099   099   000    Idade_antiga   Sempre       -       29
241 Total_LBAs_Escritos      0x0032   099   099   000    Idade_antiga   Sempre       -       38615215765

Versão do Log de Erros SMART: 1
Nenhum erro registrado

Estrutura do log do auto-teste SMART revisão número 1
Nenhum auto-teste foi registrado.  [Para executar auto-testes, use: smartctl -t]

Dados da estrutura de log do auto-teste seletivo SMART revisão número 1
 INTERVALO  MIN_LBA  MAX_LBA  STATUS_ATUAL_DO_TESTE
    1        0        0  Não_testando
    2        0        0  Não_testando
    3        0        0  Não_testando
    4        0        0  Não_testando
    5        0        0  Não_testando
Flags do auto-teste seletivo (0x0):
  Após a varredura dos intervalos selecionados, NÃO leia o restante do disco.
Se o auto-teste seletivo estiver pendente ao ligar, retome após 0 minutos de espera.

Meu SSD armazena a quantidade de dados gravados no parâmetro 241 Total_LBAs_Written, em blocos lógicos (LBA), e não em bytes. O tamanho do bloco lógico, no meu caso, é de 512 bytes (pode ser visto na saída do smartctl, em Sector Size). Para obter os bytes, é necessário multiplicar o valor do parâmetro por 512.

38615215765 × 512 ÷ 1000 ÷ 1000 ÷ 1000 ÷ 1000 = 19,770 TB
38615215765 × 512 ÷ 1024 ÷ 1024 ÷ 1024 ÷ 1024 = 17,981 TiB

O programa skdump no meu SSD tenta interpretar o valor de Total_LBAs_Written de uma maneira peculiar, resultando em 1296217.695 TB, o que, evidentemente, está incorreto.

Para saber a quantidade de informações gravadas no nível do dispositivo, utilizaremos o programa btrace do pacote blktrace. Ele mostra tanto a estatística geral durante todo o funcionamento do programa, quanto processos e threads individuais (incluindo núcleos) que realizaram as gravações.

Execute o seguinte comando para coletar informações durante 10 minutos, onde /dev/sdb é o seu disco:

# btrace -w 600 -a write /dev/sdb

Saída típica do 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):
 Leituras em espera: 0, 0KiB Escritas em espera: 345, 25,932KiB
 Leituras despachadas: 0, 0KiB Escritas despachadas: 331, 25,788KiB
 Leituras retransmitidas: 0               Escritas retransmitidas: 0
 Leituras concluídas: 0, 0KiB Escritas concluídas: 1,597, 117,112KiB
 Unificações de leitura: 0, 0KiB Unificações de escrita: 1, 16KiB
 Profundidade de leitura: 0               Profundidade de escrita: 177
 Desconexões IO: 0               Desconexões de temporizador: 0
CPU1 (8,16):
 Leituras em espera: 0, 0KiB Escritas em espera: 502, 39,948KiB
 Leituras despachadas: 0, 0KiB Escritas despachadas: 495, 40,076KiB
 Leituras retransmitidas: 0               Escritas retransmitidas: 0
 Leituras concluídas: 0, 0KiB Escritas concluídas: 0, 0KiB
 Unificações de leitura: 0, 0KiB Unificações de escrita: 0, 0KiB
 Profundidade de leitura: 0               Profundidade de escrita: 177
 Desconexões IO: 0               Desconexões de temporizador: 0
CPU2 (8,16):
 Leituras em espera: 0, 0KiB Escritas em espera: 297, 26,800KiB
 Leituras despachadas: 0, 0KiB Escritas despachadas: 287, 26,800KiB
 Leituras retransmitidas: 0               Escritas retransmitidas: 0
 Leituras concluídas: 0, 0KiB Escritas concluídas: 0, 0KiB
 Unificações de leitura: 0, 0KiB Unificações de escrita: 0, 0KiB
 Profundidade de leitura: 0               Profundidade de escrita: 177
 Desconexões IO: 0               Desconexões de temporizador: 0
CPU3 (8,16):
 Leituras em espera: 0, 0KiB Escritas em espera: 418, 24,432KiB
 Leituras despachadas: 0, 0KiB Escritas despachadas: 408, 24,448KiB
 Leituras retransmitidas: 0               Escritas retransmitidas: 0
 Leituras concluídas: 0, 0KiB Escritas concluídas: 0, 0KiB
 Unificações de leitura: 0, 0KiB Unificações de escrita: 2, 272KiB
 Profundidade de leitura: 0               Profundidade de escrita: 177
 Desconexões IO: 0               Desconexões de temporizador: 0

Total (8,16):
 Leituras em espera: 0, 0KiB Escritas em espera: 1,562, 117,112KiB
 Leituras despachadas: 0, 0KiB Escritas despachadas: 1,521, 117,112KiB
 Leituras retransmitidas: 0               Escritas retransmitidas: 0
 Leituras concluídas: 0, 0KiB Escritas concluídas: 1,597, 117,112KiB
 Unificações de leitura: 0, 0KiB Unificações de escrita: 3, 288KiB
 Desconexões IO: 0               Desconexões de temporizador: 0

Taxa de transferência (R/W): 0KiB/s / 2,338KiB/s
Eventos (8,16): 9,287 entradas
Salta: 0 para frente (0 -   0.0%)

btrace permite visualizar claramente a quantidade real de dados gravados, mas entender quais programas estão realizando a gravação a partir de sua saída é complicado.

Identificação dos programas que gravam no armazenamento

O programa iotop mostrará os processos que estão escrevendo no disco e o tamanho dos dados gravados.
Os seguintes parâmetros oferecem a saída mais conveniente:

# iotop -obPat

Exemplo de saída do 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]'

Os processos do Firefox se destacam, tendo gravado 283 megabytes em poucos minutos de uso do iotop.

Identificação dos arquivos que estão sendo gravados

Informações sobre o processo que está utilizando o disco — é bom, mas saber os caminhos pelos quais a gravação está ocorrendo é ainda melhor.

Vamos usar o programa fatrace, que monitora as alterações no sistema de arquivos.

# fatrace -f W

Exemplo de saída do 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

O Fatrace não consegue mostrar a quantidade de dados gravados devido ao uso de um rastreamento bastante simples de acessos a arquivos por meio do inotify.

A partir da saída, é possível ver como o habr salva meu artigo no local storage do navegador enquanto eu escrevo, e também a extensão Group Speed Dial, que, como consegui descobrir justamente com o Fatrace, lê seus dados a cada 30 segundos. Lê, e não grava: CW A mensagem antes do arquivo indica que o arquivo é aberto para leitura e gravação, com a criação simultânea do arquivo, se ele não existir (chamado openat com a flag O_RDWR|O_CREAT), mas não afirma que realmente alguma informação foi gravada no arquivo.

Por via das dúvidas, para ter certeza disso, vamos usar strace, com um filtro para chamadas de sistema de arquivo:

strace -yy -e trace=open,openat,close,write -f -p 15057 2>&1 | grep extension

Saída do 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, "SQLite format 3 20 22 @   d 23"..., 100) = 100
[pid 20352] read(153, "SQLite format 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

Não há nenhuma chamada write(), o que indica que não houve gravação no arquivo.

Determinação das sobrecargas do sistema de arquivos

Uma grande diferença nas medições iotop e btrace me levou a pensar em testar o sistema de arquivos, escrevendo dados manualmente em um arquivo e monitorando as medições do btrace.

Se excluirmos completamente a gravação no disco, inicializando no modo de emergência do systemd, e escrevermos manualmente alguns bytes de dados em um arquivo existente, o btrace em SSD com btrfs reporta gravação 3 megabytes dados reais. Um sistema de arquivos recém-criado em um pen drive de 8 GB grava no mínimo 264 KiB ao gravar um único byte.
Para comparação, gravar um par de bytes em um arquivo no ext4 termina gravando 24 kilobytes de dados no disco.

Em 2017, Jayashree Mohan, Rohan Kadekodi e Vijay Chidambaram conduziram um estudo sobre a ampliação de gravação de diferentes sistemas de arquivos, seus resultados para btrfs e ext4 ao gravar 4 KB estão relacionados aos meus.

Identificamos processos com atividade de disco no Linux

Conclusão e Resumo

Através das manobras descritas, foi identificado:

  1. Gravação frequente dos estados de trabalhos pelo daemon de impressão CUPS em /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
  2. O fato da leitura do banco de dados a cada 30 segundos pela extensão Group Speed Dial para Firefox;
  3. Gravação periódica de logs por diversos serviços de monitoramento de desempenho no Fedora, resultando na gravação de vários megabytes de dados no btrfs: pmcd.service, pmie.service, pmlogger.service;
  4. Uma enorme amplificação ao gravar uma pequena quantidade de dados ao usar btrfs.

Conclusão: não vale a pena usar btrfs se os programas gravam frequentemente pequenas quantidades de dados (alguns kilobytes), caso contrário isso resultará em megabytes de dados gravados. Isso é especialmente relevante para computadores de placa única com sistemas operacionais em MicroSD.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster