当前位置: 首页 > news >正文

商务部网站市场体系建设司首页网络营销薪酬公司

商务部网站市场体系建设司首页,网络营销薪酬公司,网站开发公司兴田德润在那里,沈阳做网站的不知道你有没有遇到过当一个文件夹下文件特别多,在下面执行ls命令的时候要等好长时间才能展现出来的问题?如果有,你有想过这是为什么吗,我们该如何解决? 要想深入理解这个的问题产生的原因,我们就需要从文件夹占用的磁…

不知道你有没有遇到过当一个文件夹下文件特别多,在下面执行ls命令的时候要等好长时间才能展现出来的问题?如果有,你有想过这是为什么吗,我们该如何解决? 要想深入理解这个的问题产生的原因,我们就需要从文件夹占用的磁盘空间开始讨论了。

欢迎关注微信公众号:开发内功修炼

inode消耗验证

在《新建一个空文件占用多少磁盘空间?》中我提到了每一个文件会消耗其所在文件夹中的一点空间。文件夹呢,其实也一样会消耗inode的。 我们先看一下当前inode的占用情况

# df -i  
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
......
/dev/sdb1            2147361984 12785020 2134576964    1% /search

再创建一个空文件夹

# mkdir temp
# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
......
/dev/sdb1            2147361984 12785021 2134576963    1% /search

通过IUsed可以看到,和空文件一样,空的文件夹也会消耗掉一个inode。不过这个很小,我的机器上才是256字节而已,应当不是造成ls命令卡主的元凶。

block消耗验证

文件夹的名字存在哪儿了呢?嗯,和《新建一个空文件占用多少磁盘空间?》里的文件类似,会消耗一个ext4_dir_entry_2(今天用ext4举例,它在linux源码的fs/ext4/ex4.h文件里定义),放到其父目录的block里了。根据这个,相信你也很快能想到,如果它自己节点下创建一堆文件的话,就会占用它自己的block。我们来动手验证一下:

# mkdir test
# cd test  
# du -h
4.0K    .

这里的4KB就表示消耗掉了一个block。 空文件不消耗block,空目录为啥一开始就消耗block了呢,那是因为其必须默认带两个目录项"."和".."。另外这个4K在你的机器上不一定是这么大,它其实是一个block size,在你格式化的时候决定的。

我们再新建两个空的文件,再查看一下:

# touch aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
# touch aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# du -h
4.0K    .

貌似,没有什么变化。这是因为

  • 第一、新的空文件不占用block,所以这里显示的仍然是目录占用的block。
  • 第二、之前文件夹创建时候分配的4KB里面空闲空间还有,够放的下这两个文件项

那么我再多创建一些试试,动用脚本创建100个文件名长度为32Byte的空文件。

#!/bin/bash
for((i=1;i<=100;i++));
do
file="tempDir/"$(echo $i|awk '{printf("%032d",$0)}')echo $filetouch $file
done
# du -h
12K    .

哈哈,这时我们发现目录占用的磁盘空间变大了,成了3个Block了。当我们创建到10000个文件的时候,

# du -h
548K     .

在每一个ext4_dir_entry_2里都除了文件名以外,还记录着inode号等信息,详细定义如下:

struct ext4_dir_entry_2 {__le32  inode;                  /* Inode number */__le16  rec_len;                /* Directory entry length */__u8    name_len;               /* Name length */__u8    file_type;char    name[EXT4_NAME_LEN];    /* File name */
};

我们计算一下,平均每个文件占用的空间=548K/10000=54字节。也就是说,比我们的文件名32字节大一点点,基本对上了。 这里我们也领会到一个事实,文件名越长,在其父目录中消耗的空间也会越大。

本文结论

一个文件夹当然也是要消耗磁盘空间的。

  • 首先要消耗掉一个inode,我的机器上它是256字节
  • 需要消耗其父目录下的一个目录项ext4_dir_entry_2,保存自己inode号,目录名。
  • 其下面如果创建文件夹或者文件的话,它就需要在自己的block里ext4_dir_entry_2数组

目录下的文件/子目录越多,目录就需要申请越多的block。另外ext4_dir_entry_2大小不是固定的,文件名/子目录名越长,单个目录项消耗的空间也就越大。

对于开篇的问题,我想你现在应该明白为什么了,问题出在文件夹的block身上。 这就是当你的文件夹下面文件特别多,尤其是文件名也比较长的时候,它会消耗掉非常多的block。当你遍历文件夹的时候,如果Page Cache中没有命中你要访问的block,就会穿透到磁盘上进行实际的IO。在你的角度来看,就是你执行完ls后,卡住了。

那么你肯定会问,我确实要保存许许多多的文件,我该怎么办? 其实也很简单,多创建一些文件夹就好了,一个目录下别存太多,就不会有这个问题了。工程实践中,一般的做法就是通过一级甚至是二级hash把文件散列到多个目录中,把单目录文件数量控制在十万或万以下。

ext的bug

貌似今天的实践应该结束了,现在让我们把刚刚创建的文件全部删掉,再看一下。

# rm -f *
# du -h
72K     .

等等,什么情况?文件夹下的文件都已经删了,该文件夹为什么还占用72K的磁盘空间? 这个疑惑也伴随了我很长时间,后来才算是解惑。问题关键在于ext4_dir_entry_2中的rec_len。这个变量存储了当前整个ext4_dir_entry_2对象的长度,这样操作系统在遍历文件夹的时候,就可以通过当前的指针,加上这个长度就可以找到文件夹中下一个文件的dir_entry了。这样的优势是遍历起来非常方便,有点像是一个链表,一个一个穿起来的。 但是,如果要删除一个文件的话,就有点小麻烦了,当前文件结构体变量不能直接删,否则链表就断了。 Linux的做法是在删除文件的时候,在其目录中只是把inode设置为0就拉倒,并没有回收整个ext4_dir_entry_2对象。其实和大家做工程的时候经常用到的假删除是一个道理。现在的xfs文件系统好像已经没有这个小问题了,但具体咋解决的,暂时没有深入研究,如果你有答案,欢迎留言!

欢迎关注微信公众号:开发内功修炼

http://www.hkea.cn/news/427890/

相关文章:

  • 如何进行电子商务网站推广?百度网盘app
  • 做情趣网站需要什么资质sem推广外包
  • 国外网站做任务赚钱的最近新闻有哪些
  • 建设部网站查资质中裕隆百度推广登录平台网址
  • 黄页网站大全免费山东网络推广优化排名
  • 网站文字代码常见的网络营销工具
  • 计算机毕设网站建设怎么改长沙网站设计拓谋网络
  • 类似红盟的网站怎么做aso优化推广
  • vs2013做网站怎样制作免费网页
  • b2c网站的开发无锡网络优化推广公司
  • 网站做视频在线观看营销活动推广方案
  • wordpress多站点统计google图片搜索引擎入口
  • 麻章手机网站建设百度网盘提取码入口
  • 网站后台管理系统的重要技术指标sem竞价托管费用
  • 包头怎样做网站我想做电商怎么加入
  • 株洲企业网站建设品牌2023免费b站推广大全
  • 仿制单页面网站多少钱免费制作网站app
  • 商城网站制作网站长尾词挖掘工具
  • 夹克定制公司trinseo公司
  • 四川智能网站建设制作网站链接分析工具
  • 制作销售网站有哪些宁波网络营销推广咨询报价
  • 佛山做外贸网站服务新闻发稿平台
  • 做网站前怎么写文档域名收录
  • 中信建设有限责任公司钟宁关键词优化的方法有哪些
  • 建站之星平台优化推广网站排名
  • wordpress 网盘 插件郑州seo外包阿亮
  • 怎样建设网站首页广告营销平台
  • wordpress调起淘宝app什么叫做seo
  • 嘉兴做网站优化的公司网站维护公司
  • css层叠样式会不会影响打开网站的速度百度免费下载安装百度