Não resta espaço no dispositivo ao mover arquivos de 700 mil para um único diretório dentro do mesmo FS

Não resta espaço no dispositivo ao mover arquivos de 700 mil para um único diretório dentro do mesmo FS

Eu uso o seguinte comando para localizar e mover um grande número de arquivos em meu servidor:

find SomeDir/ -maxdepth 10 -type f -mtime +90 -exec mv {} SomeDir2/ \;

Depois de mover cerca de 700.000 arquivos, recebo este erro:

mv: cannot move ‘SomeDir/Dir1/Dir2/Dir3/file.jpg.gz’ to ‘SomeDir2/file.jpg.gz’: No space left on device

df -item o seguinte resultado:

/dev/sdb1           322125824 144163358 177962466   45% /files

df -htem o seguinte resultado:

/dev/sdb1            4.8T  3.5T  1.1T   78%   /files

Eu faço toda a operação /filese nenhum outro diretório

O sistema de arquivos é ext4.

ATUALIZAR

Como sugerido, corro dmesg -Hwxe o resultado éEXT4-fs warning (device sdb1): ext4_dx_add_entry:2016: Directory index full!

Responder1

Você provavelmente está excedendo max_dir_size_kbo conjunto (ou deixou o padrão) no momento da montagem do diretório:

Documentos Linux:

max_dir_size_kb=n
    This limits the size of the directories so that any
    attempt to expand them beyond the specified limit in
    kilobytes will cause an ENOSPC error. This is useful in
    memory-constrained environments, where a very large
    directory can cause severe performance problems or even
    provoke the Out Of Memory killer. (For example, if there
    is only 512 MB memory available, a 176 MB directory may
    seriously cramp the system's style.)

( ENOSPCtraduz-se na mensagem de erro No space left on devicecom perror)

Portanto, certifique-se de que essa opção não foi especificada (ou especificada com um número muito grande) no momento da montagem.

Além disso, observações:

  • muitos arquivos em uma pasta não parecem uma boa ideia. Você talvez queira um banco de dados relacional? Armazenamento de objetos?
  • 4,8 TB: isso não é raro para discos rígidos modernos, mas honestamente, da próxima vez que você configurar algo nos dias de hoje, use um pool de armazenamento como o LVM. Com isso você pode ter coisas como instantâneos de sistemas ativos.

Responder2

Com as informações recém-obtidas:

Então, lendo linux/fs/ext4/namei.c line 2007 na git tag v3.10 (ou seja, seu kernel), acho que você está sem sorte e precisa ajustar seu sistema de arquivos;

tune2fs -O large_dir /dev/sdb1

deve permitir que você tenha mais dx_entriespor diretório, mas honestamente, nunca fiz isso. Como sempre, tenha backups.

Certifique-se de ter backups ou aplique-os a um novo sistema de arquivos para onde você copia esses arquivos, em vez de movê-los dentro do mesmo sistema de arquivos. Pode parecer que eu sou um fanboy do XFS (não sou, simplesmente funciona), mas acho que isso realmente não parece que um ext4 desafinado seja um ótimo sistema de arquivos para este caso de uso.

informação relacionada