我有一些无法写入的文件名(会话文件)(“设备上没有剩余空间”)。 其他文件名(相同的目录)都很好。 磁盘未满。 文件系统是ext3
尝试创build文件时,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服务器,但是你不能从虚拟服务器或者硬件节点写/创build这些文件名。
该目录中有很多文件(写入时为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
(我已经编辑了会话数据的path,但它确实像这样分开安装,以便在多个虚拟服务器之间共享会话数据)
Ext3对文件/目录名进行哈希处理。
有了这么多的文件在一个目录中,我不会感到惊讶,如果你正在运行的哈希碰撞问题。
具有相同长度的所有文件名并具有相同的结构使得碰撞的可能性更差。
如果碰撞,文件名是无效的,正如你注意到的那样。
我没有进一步的经验,所以我不能给你更详细的build议。
(我们曾经在办公室遇到类似的问题,而现有的Linux专家使用了一些tunefs的魔法来解决这个问题,我从来没有得到他所做的确切的细节,只是需要处理文件名的散列冲突。)
你显然可以通过tunefs设置哈希行为。 还有一个名为“dirindex”的ext3扩展,它确实有助于处理包含这么多文件的目录。