文件系统那些事儿,你学会了吗?

2024年 2月 6日 73.9k 0

引言

“Everything is a file(一切皆文件)”是UNIX世界里的名言,也是UNIX系统的设计思想之一。在其之后演变出众多UNIX、Linux,如开源的FreeBSD、OpenBSD、GNU/Linux或商业的AIX、HP-UX、Solaris等均继承了该思想。不论是普通文件、目录、字符设备、块设备、socket套接字、网络设备等,对操作系统来说都是文件。虽然类型不同,但操作系统都提供了一套统一的接口,即文件系统来对上述各种文件统一管理。本文讲述了G行文件系统使用中遇到的一些有趣问题和解决办法,供大家参考。

1、文件系统的基本功能

文件系统是操作系统的重要组成部分,定义了把文件存储于硬盘时的数据结构及管理方式。硬盘是由很多扇区组成,为了访问硬盘中的数据,就必须在文件和扇区之间建立联系,比如需要知道文件从哪个扇区开始、一共占多少个扇区、文件有什么属性……这就是文件系统要做的事情。

一个操作系统通常会建立多个文件系统,每个文件系统都有独立和完整的结构,当一个文件系统出现问题不会影响到其他文件系统。通过文件系统还可以实现配额管理,限制用户的存储空间容量,防止用户无限制地使用存储空间。

 一般来说,文件系统是和操作系统紧密结合在一起的,不同类型的操作系统默认使用不同的文件系统,比如AIX的jfs2文件系统、HP-UX的vxfs文件系统、Linux的ext4文件系统等。

2、文件系统和LVM

文件系统通常建立在LVM(Logical Volume Manager)之上。基于LVM的管理功能,将硬盘或硬盘分区组合起来,创建一个逻辑层给文件系统使用,实现了灵活、方便、动态地管理各种存储设备。各类UNIX/Linux在LVM管理上大同小异,如下图所示:

图片图片

硬盘(或使用SCSI等协议连接的外置存储)在LVM中被标记为物理卷(PV,Physical Volume),多个PV组成一个卷组(VG,Volume Group),然后,在VG中划分出多个逻辑卷(LV,Volume Group),最后将LV格式化成文件系统(FS,File System)供用户使用。这样,一个文件系统的大小就突破了物理硬盘空间连续性的限制,也可以跨多个硬盘,提供更大的存储空间。LVM也可用于提升I/O性能,通过对LV逻辑卷设置条带化,使I/O落在多个PV物理卷上。

3、文件系统使用中遇到的典型问题

文件系统虽然有上述各种优点,但是实际使用中也遇到过形形色色的问题,接下来我们分享几个有代表性的文件系统问题。

案例1:某服务器在编译Tuxedo ubb配置文件时,编译报错,并且没有日志生成。

图片图片

从官方错误编码解释分析:编译文件所在的目录中,存在目录名过长(大于78个字符)或目录结构权限错误。

图片图片

但检查确认该ubb所在的目录中,不存在过长的目录名。尝试将权限都改成了777,编译仍然报错。

图片图片

对编译命令进行truss跟踪,发现编译命令在检查当前路径的权限时报EACCES错。EACCES错误的说明是“Search permission is denied on a component of the path prefix.”,Search permission也就是x(执行)位的权限。

图片图片

根据报错提示,执行检查命令,也验证了Permission denied错误。通过AIX官方文档资料确认,在AIX操作系统中,所有的jfs/jfs2文件系统都有两套权限:文件系统权限和文件系统挂载点目录权限。用户要对文件系统和挂载点目录都有r和x(searchable)的权限才能正常使用。卸载文件系统后,对挂载点目录赋权755,重新挂载文件系统,编译顺利通过。

图片图片

案例 2:某个批量任务每天自动创建 24 个目录(每小时 1个)。某天运行该任务时突然报错,显示不能创建目录。

图片图片

按照错误提示,手工检查当前文件系统空间和 inode 使用率都不高。该批量任务报错前创建了 9 个目录,手工尝试创建第 10个目录也失败了,报错信息和批量任务的报错信息一致。

图片图片

进一步排查发现批量任务脚本中对历史文件打包备份后仅是清理了文件而未删除目录,导致目录累计越来越多。当前目录下的子目录一共 32767 个,怀疑是一个目录下的子目录数量达到了上限。对这些历史子目录进行清理后,新子目录创建成功。

图片图片

我们对 AIX、HP-UX、Linux 等操作系统进行了测试,结果表明 AIX 和 HP-UX 的文件系统的目录有 32768 个子目录的限制,Linux 内核版本小于等于 3.0.101 是有 32000 子目录限制。于是,我们将一个目录下的子目录数量统计加入巡检和监控,当发现子目录数量接近 30000 时会自动通知管理员进行清理。

案例 3:一个业务系统做压力稳定性测试时,发现四台应用服务器中的一台交易响应变慢。查看这台服务器上的应用日志,发现有接近 15 秒的“断档”,没有记录。而同一时段的其他 3 台应用服务器的日志记录均是连贯的。

图片图片

查看这台故障服务器的性能数据,发现故障时段 vxfsd 进程竟然占用了 8 颗 CPU。应用日志所在的目录就是一个单独的 vxfs文件系统,vxfsd 又是 vxfs 文件系统的主进程,因此定位是 vxfs故障导致应用日志无法写入。

图片图片

进一步排查发现这台服务器应用日志文件系统的 lastid 计数器值远远小于其他 3 台服务器的数值。

图片图片

图片图片

查看 vxfs 的官方文档确认:lastid 计数器最大值是 2 的30 次方,约等于 10 亿 7 千万。超过最大值后,vxfsd 进程就会对 vxfs 文件系统元数据(包括 lastid)自动重置,重置耗时 15秒,期间会影响 I/O。

了解 vxfs 这个特性后,我们部署了巡检和监控:当一个 vxfs文件系统的 lasitd 达到 8 亿时通知管理员。管理员选择业务低峰时段主动对 lastid 这一元数据进行手工重置,避免在业务高峰时段因为 lastid 自动重置影响系统性能。

4、展望

随着硬件技术的发展,文件系统技术也在不断创新。尤其是SSD 闪存盘的普及,需要文件系统提供与之相适应的文件管理方式,如 BTRFS 的 COW(Copy On Write)方式,避免频繁擦写 SSD,提升了 I/O 性能也延长了 SSD 的使用寿命。再有,ZFS 等新一代文件系统自身就具备了对硬盘的条带化和镜像能力,已经不需要LVM 的支持了。但是,无论文件系统功能如何演进,它的基本原理没有改变,值得我们深入探究。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论