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 TiBO 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/sdbSaí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 -obPatExemplo 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 WExemplo 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.sqliteO 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 extensionSaí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 , seus resultados para btrfs e ext4 ao gravar 4 KB estão relacionados aos meus.

Conclusão e Resumo
Através das manobras descritas, foi identificado:
- Gravação frequente dos estados de trabalhos pelo daemon de impressão CUPS em /var/cache/cups каждую минуту. Проблема устранена очисткой /var/spool/cups (хотя никаких заданий печати не было);
- O fato da leitura do banco de dados a cada 30 segundos pela extensão Group Speed Dial para Firefox;
- 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;
- 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
