"Nenhum espaço deixado no dispositivo" erro ao gravar determinados nomes de arquivos de sessão

4

Eu tenho alguns nomes de arquivos (arquivos de sessão) que não podem ser gravados ("Não há espaço disponível no dispositivo"). Outros nomes de arquivos (mesmo diretório) estão bem. O disco não está cheio. O sistema de arquivos é ext3

O PHP está dando um erro ao tentar criar os arquivos, mas o erro pode ser reproduzido na linha de comando:

# less /path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj1
/path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj1: No such file or directory
# touch /path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj1
touch: cannot touch '/path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj1': No space left on device
# touch /path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj0
# less /path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj0
# ls -al /path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj1
ls: /path/to/session_data/sess_u2q1pfelfr0jof3mp38jb2eaj1: No such file or directory

Observe os diferentes nomes de arquivos. Não parece haver nenhum padrão, mas afeta apenas alguns nomes de arquivos, e eles não parecem ser capazes de serem gravados.

Para possivelmente complicar ainda mais as coisas, este é um servidor OpenVZ, mas você não pode gravar / criar esses nomes de arquivos no servidor virtual ou no nó de hardware.

Existem muitos arquivos nesse diretório (18.456.002 no momento da escrita), mas não há problemas com inode, e o disco definitivamente não está cheio.

Conforme solicitado, as saídas do df:

[root@web1 session_data]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/simfs            2.7T  2.1T  495G  81% /
/dev/root             2.7T  2.1T  495G  81% /path/to/session_data
[root@web1 session_data]# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/simfs           726761472 22843560 703917912    4% /
/dev/root            726761472 22843560 703917912    4% /path/to/session_data

(Eu editei o caminho para os dados da sessão, mas ele realmente é montado separadamente, para permitir o compartilhamento de dados de sessão entre vários servidores virtuais)

    
por Rob Ferrer 17.09.2013 / 14:03

1 resposta

4

Ext3 faz hash em nomes de arquivos / dir.
Com tantos arquivos em um diretório, eu não ficaria surpreso se você estivesse executando problemas de colisão de hash. Ter todos os nomes de arquivos do mesmo tamanho e ter a mesma estrutura torna a probabilidade de uma colisão ainda pior.

Se houver uma colisão, o nome do arquivo será efetivamente inutilizável, como você percebeu.

Eu não tenho mais experiência com esse tipo de coisa, então não posso lhe dar nenhum conselho mais detalhado.
(Nós nos deparamos com um problema semelhante no escritório uma vez e o guru Linux residente usou alguns tunefs mágicos para fazer o problema desaparecer. Eu nunca tive os detalhes exatos do que ele fez. Só que isso tinha a ver com colisões de hash nos nomes dos arquivos .)

Você pode aparentemente definir o comportamento de hashing via tunefs. Existe também uma extensão ext3 chamada "dirindex" que ajuda a lidar com diretórios contendo tantos arquivos.

    
por 17.09.2013 / 16:34