过去几年来,NFS 一直运行良好,但现在我面临着一个性能问题,而我实际上无法找到解决方案。
我的问题是,在 NFS 服务器上我有大约 5Gb 的小文件,并且当我从客户端对已挂载目录执行“ls”或“du”时,可能需要 2 分钟以上的时间才能列出所有文件。
我认为问题在于,对于每个文件,NFS 都会发送一个文件统计信息查询,等待响应,然后发送下一个文件的新查询。如果是这样,我很确定这就是导致我性能不佳的原因。
现在,我尝试寻找解决方案,但没有找到,所以我决定开设这个帖子。
你们有人知道我该如何解决我的性能问题吗?
来自 Linux 系统管理员 padawan 的衷心感谢。
答案1
我的感觉是,这个问题并非 NFS 所特有。从历史上看,UNIX 文件系统通常存在包含大量文件的平面目录问题。当然,多年前我被告知的经验法则是,性能会随着目录文件大小的平方而下降。正如您所指出的,执行此操作意味着对每个 inode 进行ls -la
操作stat
,一旦目录文件开始增长,这将花费大量时间;NFS 增加的延迟会加剧这种情况,但它只会让您注意到潜在的问题,而不是导致问题。
正如我不断告诉我的开发人员的那样,解决方案不是将大量文件存储在浅而宽的结构中,而是存储在窄而深的结构中。
看看现有实用程序在需要存储大量文件时是如何存储文件的:yum
在 下创建大量文件/var/lib/yum/yumdb
,因此它通过以下首字母将它们存储在子目录中:
drwxr-xr-x. 4 root root 4096 Sep 9 2011 C
drwxr-xr-x. 3 root root 4096 Sep 9 2011 M
drwxr-xr-x. 3 root root 4096 Jul 13 10:05 S
drwxr-xr-x. 24 root root 4096 Jul 13 10:05 a
drwxr-xr-x. 18 root root 4096 Nov 7 11:10 b
[c through y omitted to save space]
drwxr-xr-x. 5 root root 4096 Dec 28 2011 z
Squid 缓存在使用 初始化时squid -z
,会生成/var/spool/squid/0[0-F]
,并在这些目录下生成子目录./[0-F][0-F]
。 innd
如果我没记错的话,当它不使用环形缓冲区类型的文件结构时,会使用类似的技巧。所有这些守护进程以及许多其他类似的守护进程都知道,如果它们需要存储大量小文件,那么拥有一组深层子目录来存储这些文件是基本的高效运作。
编辑:1s 对于在单个本地目录上执行 ls 来说是一个非常长的时间。正如我所说,我认为 NFS 延迟加剧了您的问题;但它不是问题的根源,只是让问题变得严重到让您感到痛苦。