产品中心PRDUCTS DISPLAY

联系我们

联系人:张生

咨询热线:400-123-4657

传真:+86-123-4567

手机:13800000000

邮箱:admin@youweb.com

地址:广东省广州市天河区88号

在线咨询

行业资讯

您现在的位置是: 首页 > 新闻动态 > 行业资讯

硬盘又满了,该怎么处理呢?

432229 大家好,我是石头哥。

\nTímù nǐ kěnéng dú bù quán (méi shì, ān yě yíyàng), tècǐ bǔzhōng pīnyīn!最近有读者向我询问一个神奇的问题。这种坑其实是一个常见的陷防,有时候我们在找工作的过程中经常会遇到。主要的问题在于招聘方有时候没有明确说明具体的薪资范围,而是让应聘者自己报出期望的薪资。这就给了招聘方很大的灵活性,在面试过程中可以根据应聘者的表现来调整薪资,甚至直接选择不同的候选人给不同的薪资。\n对于求职者来说,避免掉入这种坑的关键是提前做好功课,了解行业的薪资水平,确保自己对于这个职位的薪资范围有一个清晰的认识。同时,也可以在面试的过程中主动询问招聘方关于薪资待遇的问题,确保双方在这个问题上有一个明确的共识。\n最重要的是,在面试过程中要保持自信和沟通畅通,如果发现招聘方在薪资上不太诚实或者有变化,可以及时表达自己的意见和需求,避免陷入不利的境地。希望这些经验对于大家在面试中能够有所帮助。你在评论区可以分享一下,你有遇到过这个问题吗?为什么会出现以上的结果呢?稀疏文件是什么?这篇文章将为你揭示真相。收到一条自动告警短信或邮件,通知我某台机器上的磁盘已满,请立即登录查看。实际上,这件事情应该定期进行自动化处理的巡检。当我第一次遇到

这个问题时,我采取的解决方法是:首先删除 /tmp/ 目录以释放一些空间,然后检查一下常用用户目录。最终,

x

发现某服务A的日志文件contentutil.log占用了数十GB的空间。询问相关开发人员后,确认该日志文件无需压缩备份,可以直接删除。于是,

x

删除了该文件(contentutil.log),并天真地认为问题得到了解决...

但是,删除文件(contentutil.log)后,磁盘空间是否真的被释放了呢?磁盘空间告警再次出现,似乎

不到天,磁盘又满了,让人感到困惑和惊讶。经过

的探查,最终发现上一次运行了 rm contentutil.log 命令后,占用了数十GB空间的 contentutil.log 文件仍被服务A的进程占用,并未被释放。

rm 实际上是删除文件名和文件在磁盘上真正存储位置之间的链接。此时,文件仍被服务A程序所打开,因此相应的磁盘空间没有被系统回收。

可以类比为GC(垃圾回收)中的引用计数。rm操作只是减少了引用计数,而并非真正释放资源。只有当引用计数归零时,操作系统内核才会释放空间,以供其他进程使用。因此,只有当A进程停止(即文件句柄的引用计数归零)或重新启动后,才会释放占用的存储空间(这在一定程度上表明该服务一直很稳定,可以连续运行很长时间而不会出现故障~微笑)。如果你不知道具体的进程或文件名,可以使用lsof | grep deleted来查找所有被删除但文件句柄没有被释放的文件和对应的进程,然后再终止进程或重新启动进程。白老板后来通知我,可以通过修改文件内容的方式在不需要重新启动进程的情况下释放空间。

在下面的技巧中,请注意:

echo "" > filename.log 

du与ls

前两天该问题重新出现,服务A的日志文件(contentutil.log)占用了大约7.6G。

应该定期对服务日志进行日志轮转。这次他学聪明了,直接运行了`echo 'hello' > contentutil.log`,然后用 `df` 命令确认磁盘空间已经释放。他心想这次可以愉快了,突然不小心执行了 `ls` 和 `du` 命令,以下是结果: \n[root@xxx shangtongdai-content-util]# ls -lah contentutil.log -rw-r--r--. 1 root root 7.6G Nov  7 19:36 contentutil.log\n[root@xxx shangtongdai-content-util]# du -h contentutil.log 2.3M\n我看到这种结果,实在是让我感到困扰,百思不得其解。你已经确定造成这种结果的原因了吗?

可以明确的是,这里的 ls 和 du 结果肯定代表不同的含义。在查阅相关资料和咨询强大的票圈后了解到,这大概与文件空洞和稀疏文件相关。

ls 的结果是 apparent sizes,我的理解是文件的表观大小,类似文件系统中 file 这个数据结构中定义的文件长度字段;

du 的结果是 disk usage,即实际占用的存储空间大小,默认使用块作为度量单位。

"apparent sizes"和磁盘使用量"disk usage"这两个术语取自于du命令的--apparent-size选项的说明部分。

提供了一个具体的例子:

// Mac OS 10.11.6 (15G1004) ➜  _drafts git:(source) ✗ echo -n a >1B.log ➜  _drafts git:(source) ✗ ls -las 1B.log 8 -rw-r--r--  1 tanglei  staff  1 11  9 00:06 1B.log ➜  _drafts git:(source) ✗ du 1B.log 8 1B.log ➜  _drafts git:(source) ✗ du -h 1B.log 4.0K 1B.log 

\n以上示例展示了一个操作过程。操作者在Mac OS 10.11.6 (15G1004)系统环境下,使用命令行工具进行了以下操作:\n- 输出一个字符串到1B.log文件中\n- 查看1B.log文件的详细信息\n- 查看1B.log文件的大小,第一次使用du命令显示为8字节,第二次使用du -h命令显示为4.0K。文件1B.log中只包含一个字母"a",文件大小为1个字节。前面的8位用于占用8个数据块的存储空间, ls -s 命令和 du 命令的结果相等,都表示实际占用磁盘空间的大小。为什么只有1个字节的文件要占用8个 block 呢?可以这样解释:block 是磁盘存储的基本单位,方便磁盘寻址。这里所说的基本单位指的是磁盘的物理结构单位,例如扇区或柱面等,它对应一个物理单位。 可以将一个文件粗略地分成两部分:数据部分和元数据部分。数据部分即文件实际包含的内容,而元数据部分则包括了文件名、文件大小、创建时间、权限等信息。在存储一个文件时,除了要存储数据部分外,还要存储元数据部分。\n在文件系统中,最小的存储单位是block,通常一个block的大小为4KB或者8KB。当一个文件小于一个block的大小时,它也会占用一个完整的block的空间。这是因为文件系统中记录每个文件的元数据信息通常需要一部分block来存储,而即使文件本身的大小小于一个block,也需要至少占用一个block来存储这些元数据信息。\n因此,即使文件只包含1个字节的数据,但是为了存储这个文件的元数据信息,需要分配至少一个block的空间。当然,文件系统的设计和实现方式可能各不相同,对于小文件的处理方式也可能有所不同,但一般情况下小文件也会占用至少一个block的存储空间。

借用最近非常受欢迎的一篇文章中的图表来解释:

必须得说,这篇文章居然让0.2秒复制了100G文件?这篇文章的动图呈现得很出色,引起了关注的原因显而易见。然而,令人遗憾的是,最初的原文竟然找不到了(后补充:来自奇伢云存储,链接见评论),各个转载的文章中都没有注明原文。这个结构就是文件控制块(File Control Block,FCB)。每个文件在磁盘上都有对应的FCB,用来记录文件的基本属性,如文件名、大小、创建时间、修改时间等,以及文件数据在磁盘上的存储位置。在读写文件时,操作系统需要先通过文件索引结构(如文件目录)找到对应的FCB,然后从FCB中获取文件数据的存储位置,最后通过磁盘块来读取或写入文件数据。这样一来,文件控制块和磁盘块相互配合,实现了磁盘文件的管理和读写操作。

文件系统inode和块区

在默认情况下,Mac中1个逻辑块中的大小为512字节,因此`du -h`的结果显示为8 * 512 = 4096 = 4.0K。
如果环境变量BLOCKSIZE设定,且未指定-k选项,那么块计数将以该大小的块为单位显示。如果BLOCKSIZE未设置,如果不指定 -k 选项,则块计数将以 512 字节块为单位显示。(参考手册 du)因此, 通常情况下,如果使用默认参数执行,ls 命令得到的结果应该比 du 命令得到的结果更小。当然,如果调整参数可以使它们表达相同的含义。然而,在 A 服务运行的机器上,contentutil.log 的结果是 7.6G 对比上 2.3M,使人难以理解。可以通过man du命令查看

,虽然稀疏文件的表面大小通常较小,但由于其中的孔洞、内部碎片、间接块等因素,它可能更大。例如,contentutil.log是一个稀疏文件,它的文件大小很大,达到了7.6G,但其中包含大量的孔洞,不会占用实际的存储空间。以下通过一个具体的例子来展示刚刚提到的问题。以下通过一个具体的例子来再现上述问题。下面的例子展示的是在 Linux version 2.6.32 (Red Hat 4.4.7) 中的运行结果。需要注意的是,这个问题在 Mac 系统中无法再现(后文会解释为什么我的 Mac 不能再现)。从标准输入中读取n个block,输出到稀疏文件中。每个block的大小为1k (bs=1k)。在输出时,先将写指针移动到seek位置。\n[root@localhost ~]# dd of=sparse-file bs=1k seek=5120 count=0\n1.6329e-05秒。当前文件的下载速度为0.0kB/s。因此文件的长度为5M,即5120*1k(1024) = 5242880字节。在终端输入"ls -l sparse-file"可以看到文件的具体信息。如果输入"ls -ls sparse-file",可以看到sparse-file占用的实际存储空间为0个block。通过命令"du sparse-file"或"du -h sparse-file",都可以查看到sparse-file的实际占用存储空间为0。如果愿意,也可使用vim来打开此文件。请使用二进制格式查看。 (提示:使用"!%"命令)可以使用xxd命令来将文件内容显示为2进制形式,例如:\n```bash\nxxd 文件名\n```\n如果看到里面的内容全是0,说明文件内容全为0。另外,也可以直接使用od命令查看文件内容的2进制形式,例如:\n```bash\nod -t x1 -An 文件名\n```00:  0000 0000 0000 0000 0000 0000 0000 0000    ...  0000010:  0000 0000 0000 0000 0000 0000 0000 0000    ...  ...  //od{-b} sparse-file 0000000   000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 *  24000000 

\n实际上,这是一个稀疏文件,表示一个240MB的文件。在这种文件中,不存在实际的数据块,而是由许多空块和部分填充块组成。使用稀疏文件格式,可以节省磁盘空间,因为空块不会占用任何磁盘空间。 Sparse 文件是指文件中可能包含大量的连续0的数据,但实际上并不会占用磁盘存储空间。这是因为操作系统在创建这样的文件时,会使用一种称为稀疏文件(Sparse File)的技术来表示这些连续的0。\n在磁盘上存储文件时,实际上是以块(block)为单位来存储数据的,一般情况下每个块都会被初始化为0。而稀疏文件的技术允许将文件中大量的连续0所占据的块标记为“空洞”(hole),并不会在磁盘上实际分配存储空间。\n因此,尽管在文件中可能看到大量的连续0,但实际上并不会占用磁盘存储空间。这种技术可以减少空洞文件所占据的存储空间,提高存储效率。在读取稀疏文件时,文件系统会根据文件的元数据(即描述文件的数据结构)自动用0进行填充[参见维基百科]。维基百科还指出,许多现代文件系统都支持稀疏文件,包括Unix和NTFS系统,但是Apple文件系统(APFS)不支持。因此,当我在我的Mac上使用du命令查看占用空间时,结果与ls命令一致。在Mac下,通过使用dd命令等,可以创建稀疏文件。其中的参数如bs=1k和seek=5120等,表示了文件的一些属性。创建后可以通过ls和du命令来查看文件的详细信息。有一些同学使用了C代码来实现相似的功能。

实际上是指在文件写入过程中,调整当前的写入指针,前面遇到的问题应该是类似的。

#include <stdio.h> #include <fcntl.h> #include <string.h>  int main() {     int fd, result;     char wbuf[] = "hello";      if ((fd = open("filetest.log", O_RDWR|O_CREAT|O_EXCL,若((open(path,O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR))==-1){ perror("打开文件失败"); return -1; } 若((result=write(fd,wbuf,  strlen(wbuf)+1)) < 0) {             perror("write");             返回 -1;     }     如果 ((result = lseek(fd, 1024*1024*10,sizeof(wbuf)))==-1) {            perror("write");            return -1;     }调用strlen(wbuf) + 1返回的值)) < 0) {             perror("write");             返回{-1;     }      关闭(fd);     返回0; } 

以上代码首先将"hello"写入filetest.log。然后将文件指针移动到1024乘以1024乘以10的位置(即相当于扩大了文件长度这个字段)。gcc编译后运行结果文件的详细信息如下:\n[root@localhost ~]# ls -ls filetest.log\n8 -rw-------. 1 root root 10485772 Nov 9 17:45 filetest.log\n[root@localhost ~]# du filetest.log\n8 filetest.log\n[root@localhost ~]# du -h filetest.log\n8.0K filetest.log\n[root@localhost ~]# ls -lh filetest.log\n-rw-------. 1 root root 11M Nov 9 17:45 filetest.log\n[root@localhost ~]# od -c filetest.log\n0000000 h e l l o \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0\n0000020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0\n*\n50000000 h e l l o \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0\n50000014\n解释结果:文件长度应该是 "hello" 加上 "\n" 共6个字节乘以2,等于12字节。再加上1024乘以1024乘以10个字节,即为ls命令产生的结果是10485772个字节,约合11M。

的输出为8个区块,也就是8千字节(这个机器的区块大小与之前的Mac不同,这里是1024)。It seems like the text you provided is a mix of shell commands and possibly some error or troubleshooting related information in Chinese. If you need help summarizing or understanding the content better, please let me know and I'll be happy to assist.\nIf there are specific questions or clarifications you need regarding the commands or the error message, feel free to ask!例如,在删除某个文件后,文件占用的磁盘空间并不会立即释放,而是在该文件的句柄没有被任何进程引用时才会被回收。ls和du命令的结果具体含义是什么?稀疏文件是什么意思?

 

在线客服

关注我们 在线咨询 投诉建议 返回顶部