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