我被 xfs' No space left on device击中。根据常见问题解答:
http://xfs.org/index.php/XFS_FAQ#Q:_Why_do_I_receive_No_space_left_on_device_after_xfs_growfs.3F
解决此问题的唯一方法是移动数据以释放 1TB 以下的空间。找到最旧的数据(即在第一次增长之前就已经存在)并将其移出文件系统(移动,而不是复制)。然后,如果您将其重新复制,数据块最终将超过 1TB,这应该为低于 1TB 的 inode 留出足够的空间。
但是我如何识别要移动的数据呢?我不能按年龄计算,因为前 10 TB 是在同一天使用rsync.
我试过了:
xfs_db -r -c "blockget -i 1 -n -v" /dev/md3
Run Code Online (Sandbox Code Playgroud)
但我似乎只得到文件的基本名称,而不是文件的完整路径。而且由于我的很多文件都被称为相同的(但在不同的目录中),所以这不是很有用。它似乎也给了我更多信息,只是 inode 1。
我有一种感觉,我可以使用xfs_db它来告诉我前 1 TB 中哪些文件正在使用块,但我一直无法看到如何使用。
(通过使用挂载选项inode64,文件系统不会在设备上留下 No space left,但是如果您稍后忘记使用 mount 选项,inode64那么您将再次在设备上获得No space left on device。我想避免使用挂载选项,inode64因为文件系统可能会被其他人安装在其他系统上,他们会忘记这一点,从而得到令人惊讶的No space left on device)。
在我的 nginx 服务器上,我无法登录我的 wordpress 站点。错误日志提到“设备上没有剩余空间”。
2014/09/26 02:02:05 [crit] 1197#0: *32 open() "/usr/local/nginx/client_body_temp/0030999742" 失败(28:设备上没有剩余空间)
有空间,但我发现我的 inode 使用率是 100%
我已经找到了数量惊人的文件到/usr/local/nginx/client_body_temp有太多文件无法计算的地方。
所以我的问题是:这个目录有什么用,我可以删除这些文件吗?
根据这个答案,至少可以挂载具有“无限”inode 的 tmpfs。
考虑这种特定的(出于示例目的而选择的数字,我知道它们不现实)情况:
nr_inodes=1000这意味着,tmpfs的是50%满,但也任何试图写它会导致空间不足错误的。
在我看来,设置nr_inodes=0(又名无限 inode)会使这种情况消失。
尝试了几种解决方案,但只能在一定程度上起作用。 https://unix.stackexchange.com/questions/37329/efficiently-delete-large-directory- contains-thousands-of-files?newreg=07f276292205457ab9975a0ea68e9273
http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux
释放 8% 的 inode 后,磁盘变得非常慢,无法再删除任何内容。
rm -f filename*
rsync -a --delete empty_dir/ yourdirectory/
perl -e 'for(<*>){((stat)[9]<(unlink))}'
Run Code Online (Sandbox Code Playgroud)
现在磁盘看起来像这样
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda1 2621440 2385895 235545 92% /
tmpfs 128789 1 128788 1% /dev/shm
Run Code Online (Sandbox Code Playgroud)
一个目录中仍然有 600 万个以上的小文件。上述方法以大约 2 个文件/秒的速度删除
我阅读了有关 b 树重新平衡的信息。但是如何诊断/解决缓慢删除问题?
``
在 shell 中执行选项卡、选项卡时出现以下错误:
-bash:无法为此处的文档创建临时文件:设备上没有剩余空间
root@alexus:~# cat /etc/issue.net
Ubuntu 14.04.3 LTS
root@alexus:~# uname -a
Linux alexus 3.13.0-57-generic #95-Ubuntu SMP Fri Jun 19 09:28:15 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
root@alexus:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 30G 17G 11G 61% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
udev 487M 4.0K 487M 1% /dev
tmpfs 100M 404K 100M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 498M 352K 497M 1% /run/shm
none 100M 0 100M 0% /run/user …Run Code Online (Sandbox Code Playgroud) 所以我试图找出stderr进程的 的 是否已被重定向到某种异常(它是一个 java 进程,我想要一个线程转储,但它是通过一组启动脚本启动的)。
我找到了我的过程pgrep,并用它pfiles来查看那里有什么:
4366:/foo/bar/platform/solaris2/jre_1.5.0/bin/java -Xmx2048m -Xms10
当前 rlimit:65536 个文件描述符
0: S_IFCHR 模式:0666 dev:302,0 ino:6815752 uid:0 gid:3 rdev:13,2
O_RDONLY|O_LARGEFILE
/devices/pseudo/mm@0:null
1: S_IFREG 模式:0640 dev:85,56 ino:26471 uid:0 gid:0 size:10485812
O_WRONLY|O_LARGEFILE
2: S_IFREG 模式:0640 dev:85,56 ino:26471 uid:0 gid:0 size:10485812
O_WRONLY|O_LARGEFILE
3: S_IFCHR 模式:0666 dev:302,0 ino:6815772 uid:0 gid:3 rdev:13,12
所以我可以看到stdout和stderr(文件描述符 1 和 2)指向同一个地方;我认为它们被重定向到启动脚本中的同一个文件,所以这符合。
但是当我查找 inode 编号为 26471 的文件时,我看到了:
# 查找/-inum 26471 /usr/share/man/man3mlib/mlib_MatrixScale_S16_U8_Sat.3mlib /proc/4366/fd/1 /proc/4366/fd/2 /proc/4366/fd/83
第一个命中是(我确定)不同文件系统上的文件。中的三个条目/proc是我的进程已打开的 fds。
往里看/proc/4366 …
我有一张关于服务器磁盘的高 inode 使用率的图表,但我没有任何详细信息(如df -i),所以我想猜测原因。
我使用 NetApp 设备作为 NAS 存储。我有很多小文件(30-60k)和目录。例如我有:30000 个目录和另外 1000-2000 个目录。
很多目录都是空的,但大多数目录都有很多文件(30k)。
我应该更改 Ext3 上的块大小吗?
是否可以在不格式化分区的情况下增加 ReiserFS 中的 inode 限制?
目前,我的 VPS 上的文件系统允许我创建 489K 的 inode,这还不够。该机器用作在线服务器,因此不能选择磁盘格式。
简单的答案是 1.) 移动到 ext4 和/或 2.) 以某种方式“分片”目录 - 通过将它们放在带有编号或字母的子文件夹中。
但是,这些更改并不容易,因此我正在寻找一些创造性的解决方案。有任何想法吗?