Eu tenho um script de backup que executa os seguintes comandos:
tar -c dir1 dir2 | xz -9 -T0 | gpg -c --batch --passphrase xxx | aws s3 ...
Os valores de retorno são sempre os mesmos: tar
falha com 141
( broken pipe
erro) e xz
retorna 137
(nenhuma outra mensagem de erro, mesmo no modo detalhado).
O script é testado, roda como root
e funciona bem em outros servidores. Inicialmente, pensei que os dados que estou fazendo backup poderiam estar corrompidos e excluí alguns arquivos de soquete dentro do diretório de backup (que é uma rsnapshot
pasta), mas isso também não ajudou.
Alguém tem ideia de qual pode ser o problema?
EDIT: Se eu remover xz
do tubo, funciona.
TL;DR: tente
ou substitua
xz -T0
porzstd
para obter taxas de compactação semelhantes em velocidades mais altas, mesmo sem usar vários núcleos.O que acontece aqui é muito provável que você
xz
seja morto pelo assassino sem memória do seu sistema operacional, para que o resto possa sobreviver. Isso, claro, quebra o tubo. (Ainda é um pouco surpreendente; geralmente,xz -9
requer no máximo 700 MB de RAM, o que não é muito por núcleo). Você pode tentar--memlimit=1000MiB
limitar o uso de RAM a 1000 MiB (ou qualquer outro). No entanto , se isso resolver o problema, significa que sua "quantidade razoável de CPU" não pode atender às necessidades de sua-9
configuração de compactação exz
teve que escolher uma menor. Então, seu problema provavelmente é que você tem muito pouca RAM para-9
e um thread para cada núcleo de CPU , e nada pode resolver isso, além de reduzir qualquer um.-T0
significa "usar tantos threads quantos núcleos de CPU", o que é contraproducente, pois você pega os dados resultantes e os passa pelo GPG (que não é muito eficiente e possivelmente precisará de cerca de um núcleo de CPU para si), e através doaws
comando, que por si só fará a criptografia TLS para a conexão (e possivelmente tentará sem sucesso reduzir o volume de dados usando o próprio DEFLATE).Portanto, no caso extremo,
-T
deve ser usado no máximo com o número de núcleos de CPU que você possui menos um.Geralmente, talvez não use
xz
para começar. É um excelente compressor, com certeza, mas é incrivelmente lento. Eu sei que você provavelmente está pagando por GB de armazenamento, mas:zstd
obtém resultados semelhantes com um uso de recursos muito menor/taxa de transferência mais alta.Por exemplo, na minha experiência, substituir
xz -T0 -6
um backup misto de imagem/código-fonte/binário porzstd -15
arquivos 5% maiores, mas compactação aproximadamente 2 vezes mais rápida, embora eu não tenha usado multithreading com zstd (em uma máquina de 8 núcleos).Você ainda pode habilitar o multithreading, se quiser/precisar, mas vendo que também está fazendo gpg e TLS para a transferência da AWS, provavelmente não (veja acima).
Eu recomendo remover o
-T0
ou colocar um número lá diferente de 0 (como talvez metade do seu cpus ou menos). xz está quase certamente ficando sem memória e sendo morto pelo OOM. O uso-9
também aumenta o uso de memória.