免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2365 | 回复: 7
打印 上一主题 下一主题

超级大牛请进,问两个编程中遇到的文件系统跟性能有关的很高深的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-24 11:00 |只看该作者 |倒序浏览
20可用积分
我在做一个Linux项目,使用的是ext3的文件系统。需要存储大量的文件。现在有如下问题:

1) 如果把一个文件存储在一个文件夹下,那么文件数量大了以后,文件枚举的速度会大大降低, 除了文件数量多了以后,枚举的文件数量多以外,导致速度降低还有没有文件系统上的其他原因。
2) 下面我开始做优化,把文件夹数量搞成2层,第一层从0到F(16进制),每个第一层文件夹里还有0到F文件夹,这样一个256个文件夹。创建文件的时候,随机在这256个文件夹里面选。这样解决了问题1,但是问题2出现了: 频繁创建文件时,在IO上占用的性能非常大。后来我又进一步做了优化,改为某个时间段,选一个文件夹,创建文件,这样IO的占用降低了,整个程序性能提高了超过50%。我想知道这样做性能能提高的原因,我觉得应该是filesystem cache机制的原因,但是理论上我说不上来。

请问能否有大牛解释一下问题1和问题2所出现的现象,让我对Linux的文件系统有所了解,不胜感激啊

论坛徽章:
5
2 [报告]
发表于 2009-03-24 11:12 |只看该作者
原帖由 nj_zhangchuntao 于 2009/3/24 11:00 发表
1) 如果把一个文件存储在一个文件夹下,那么文件数量大了以后,文件枚举的速度会大大降低, 除了文件数量多了以后,枚举的文件数量多以外,导致速度降低还有没有文件系统上的其他原因。
2) 下面我开始做优化,把文件夹数量搞成2层,第一层从0到F(16进制),每个第一层文件夹里还有0到F文件夹,这样一个256个文件夹。创建文件的时候,随机在这256个文件夹里面选。这样解决了问题1,但是问题2出现了: 频繁创建文件时,在IO上占用的性能非常大。后来我又进一步做了优化,改为某个时间段,选一个文件夹,创建文件,这样IO的占用降低了,整个程序性能提高了超过50%。我想知道这样做性能能提高的原因,我觉得应该是filesystem cache机制的原因,但是理论上我说不上来。


先声明一下, 俺不牛.
谈一下我的理解:
1. 在一个文件夹下, 会导致节点过多, 而变成文件节点的多级索引, 降低性能.
2. 随机选取文件夹, 有两方面的影响:
a. 在文件夹之间切换, 导致文件夹经常不在cache中. 大部分的切换动作, 都要重新读取文件夹信息.
b. 频繁的切换也导致磁盘IO 预取(prefetch)命中率低. 增加磁盘读写数据量.

论坛徽章:
0
3 [报告]
发表于 2009-03-24 11:37 |只看该作者
原帖由 nj_zhangchuntao 于 2009-3-24 11:00 发表
我在做一个Linux项目,使用的是ext3的文件系统。需要存储大量的文件。现在有如下问题:

1) 如果把一个文件存储在一个文件夹下,那么文件数量大了以后,文件枚举的速度会大大降低, 除了文件数量多了以后,枚举 ...


我也不牛,凑个热闹。

把你测试过程的数据精简一下发过来好吧。 我的意思是过程不要太复杂,能反应问题的,还有你的操作的具体描述。没数据也可以,如果你描述清楚你做了什么,大家可以重现一下你的问题,然后具体分析一下。从你之前的描述,我觉得有些细节没描述。

还有,你的操作系统版本。

[ 本帖最后由 zhang1980s 于 2009-3-24 11:46 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-03-24 11:50 |只看该作者

回复 #2 yidou 的帖子

谢谢你的回帖,我觉得你说的很有道理,我会找这方面的材料看。

论坛徽章:
0
5 [报告]
发表于 2009-03-24 11:52 |只看该作者

回复 #3 zhang1980s 的帖子

问题1我没有做过测试,但是这个应该是个很普遍的问题,应该很多人都会遇到。问题1是项目里的其他人告诉的,是他们以前的测试结果。

我的程序是基于SMTP协议收到邮件,然后做扫描(扫描的操作是CPU密集型的操作),如果有的邮件不符合要求的就保存下来,就是我问题2里说的保存到256个文件夹的问题。邮件数量很大,每秒几十条,而且90%的邮件是不合格,需要保存下来的,所以这个时候IO操作很大。

论坛徽章:
0
6 [报告]
发表于 2009-03-24 12:43 |只看该作者
原帖由 nj_zhangchuntao 于 2009-3-24 11:52 发表
问题1我没有做过测试,但是这个应该是个很普遍的问题,应该很多人都会遇到。问题1是项目里的其他人告诉的,是他们以前的测试结果。

我的程序是基于SMTP协议收到邮件,然后做扫描(扫描的操作是CPU密集型的操 ...


恩,问题一是目录项过大过长导致遍历开销大,这个可以理解。

问题二我试试看了,看看瓶颈出自哪里。

论坛徽章:
2
申猴
日期:2013-12-26 22:11:31天秤座
日期:2014-12-23 10:23:19
7 [报告]
发表于 2009-03-24 19:55 |只看该作者
ext3文件系统把一个分区按照磁道分成好几个块组
因为相邻磁道的访问速度快,所以目录里的文件最好放在同一个块组里
但块组是有大小的,如果这个块组里剩余的索引节点数不够用了
新建的这个目录为了和目录下的文件在同一个块组里
就会被存放到另一个索引节点足够的块组里
所以就不会在以前的块组里了
访问是时候磁头转动便会浪费时间

论坛徽章:
0
8 [报告]
发表于 2009-04-15 21:51 |只看该作者
关注
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP