我有一些文件名(会话文件)无法写入(“设备上没有剩余空间”)。其他文件名(同一目录)正常。磁盘未满。文件系统是 ext3
PHP 在尝试创建文件时出现错误,但可以在命令行上重现该错误:
# 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
注意不同的文件名。似乎没有任何模式,但它确实只影响某些文件名,而且它们似乎永远无法被写入。
可能使事情变得更加复杂的是,这是一个 OpenVZ 服务器,但您无法从虚拟服务器或硬件节点写入/创建这些文件名。
该目录中有很多文件(撰写本文时为 18,456,002 个),但是没有 inode 问题,并且磁盘肯定没有满。
根据要求, 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
(我已经编辑了会话数据的路径,但它实际上是这样单独安装的,以便在多个虚拟服务器之间共享会话数据)
答案1
Ext3 对文件/目录名进行哈希处理。
由于一个目录中有如此多的文件,如果您遇到哈希冲突问题,我不会感到惊讶。如果
所有文件名的长度和结构都相同,则发生冲突的可能性会更大。
正如您所注意到的,如果发生冲突,文件名实际上将不可用。
我对这类事情没有进一步的经验,因此无法为您提供更详细的建议。
(我们曾经在办公室遇到过类似的问题,常驻的 Linux 专家使用了一些 tunefs magic 来解决问题。我从未了解他所做的确切细节。只是知道这与文件名上的哈希冲突有关。)
您显然可以通过 tunefs 设置哈希行为。还有一个名为“dirindex”的 ext3 扩展,它确实有助于处理包含如此多文件的目录。