说说IO(四)- 文件系统

 

 

文件系统各有不同,其最主要的目标就是解决磁盘空间的管理问题,同时提供高效性、安全性。如果在分布式环境下,则有相应的分布式文件系统。Linux上有ext系列,Windows上有FatNTFS。如图为一个linux下文件系统的结构。

 

其中VFSVirtual File System)是Linux Kernel文件系统的一个模块,简单看就是一个Adapter,对下屏蔽了下层不同文件系统之间的差异,对上为操作系统提供了统一的接口.

中间部分为各个不同文件系统的实现。

再往下是Buffer CacheDriver

 

 

文件系统的结构

各种文件系统实现方式不同,因此性能、管理性、可靠性等也有所不同。下面为Linux Ext2Ext3)的一个大致文件系统的结构。

 

Boot Block存放了引导程序。

Super Block存放了整个文件系统的一些全局参数,如:卷名、状态、块大小、块总数。他在文件系统被mount时读入内存,在umount时被释放。

上图描述了Ext2文件系统中很重要的三个数据结构和他们之间的关系。

InodeInode是文件系统中最重要的一个结构。如图,他里面记录了文件相关的所有信息,也就是我们常说的meta信息。包括:文件类型、权限、所有者、大小、atime等。Inode里面也保存了指向实际文件内容信息的索引。其中这种索引分几类:

 

  • 直接索引:直接指向实际内容信息,公有12个。因此如果,一个文件系统block size1k,那么直接索引到的内容最大为12k
  • 间接索引
  • 两级间接索引
  • 三级间接索引

 

 

如图:

 

Directory代表了文件系统中的目录,包括了当前目录中的所有Inode信息。其中每行只有两个信息,一个是文件名,一个是其对应的Inode。需要注意,Directory不是文件系统中的一个特殊结构,他实际上也是一个文件,有自己的Inode,而它的文件内容信息里面,包括了上面看到的那些文件名和Inode的对应关系。如下图:

 

Data Block即存放文件的时间内容块。Data Block大小必须为磁盘的数据块大小的整数倍,磁盘一般为512字节,因此Data Block一般为1K2K4K

 

Buffer Cache

Buffer & Cache

虽然BufferCache放在一起了,但是在实际过程中BufferCache是完全不同了。Buffer一般对于写而言,也叫“缓冲区”,缓冲使得多个小的数据块能够合并成一个大数据块,一次性写入;Cache一般对于读而且,也叫“缓存”,避免频繁的磁盘读取。如图为Linuxfree命令,其中也是把BufferCache进行区分,这两部分都算在了free的内存。

 

Buffer Cache

Buffer Cache中的缓存,本质与所有的缓存都是一样,数据结构也是类似,下图为VxSF的一个Buffer Cache结构。

 

这个数据结构与memcachedOracle SGAbuffer何等相似。左侧的hash chain完成数据块的寻址,上方的的链表记录了数据块的状态。

 

Buffer vs Direct I/O

文件系统的BufferCache在某些情况下确实提高了速度,但是反之也会带来一些负面影响。一方面文件系统增加了一个中间层,另外一方面,当Cache使用不当、配置不好或者有些业务无法获取cache带来的好处时,cache则成为了一种负担。

       适合Cache的业务:串行的大数据量业务,如:NFSFTP

       不适合Cache的业务:随机IO的业务。如:Oracle,小文件读取。

 

块设备、字符设备、裸设备

这几个东西看得很晕,找了一些资料也没有找到很准确的说明。

从硬件设备的角度来看,

 

  • 块设备就是以块(比如磁盘扇区)为单位收发数据的设备,它们支持缓冲和随机访问(不必顺序读取块,而是可以在任何时候访问任何块)等特性。块设备包括硬盘、CD-ROM  RAM 盘。
  • 字符设备则没有可以进行物理寻址的媒体。字符设备包括串行端口和磁带设备,只能逐字符地读取这些设备中的数据。

 

 

从操作系统的角度看(对应操作系统的设备文件类型的bc),

# ls -l /dev/*lv

brw-------   1 root     system       22,  2 May 15 2007  lv

crw-------   2 root     system       22,  2 May 15 2007  rlv

 

  •  块设备能支持缓冲和随机读写。即读取和写入时,可以是任意长度的数据。最小为1byte。对块设备,你可以成功执行下列命令:dd if=/dev/zero of=/dev/vg01/lv bs=1 count=1。即:在设备中写入一个字节。硬件设备是不支持这样的操作的(最小是512),这个时候,操作系统首先完成一个读取(如1K,操作系统最小的读写单位,为硬件设备支持的数据块的整数倍),再更改这1k上的数据,然后写入设备。
  • 字符设备只能支持固定长度数据的读取和写入,这里的长度就是操作系统能支持的最小读写单位,如1K,所以块设备的缓冲功能,这里就没有了,需要使用者自己来完成。由于读写时不经过任何缓冲区,此时执行dd if=/dev/zero of=/dev/vg01/lv bs=1 count=1,这个命令将会出错,因为这里的bsblock size)太小,系统无法支持。如果执行dd if=/dev/zero of=/dev/vg01/lv bs=1024 count=1,则可以成功。这里的block sizeOS内核参数决定。

 

如上,相比之下,字符设备在使用更为直接,而块设备更为灵活。文件系统一般建立在块设备上,而为了追求高性能,使用字符设备则是更好的选择,如Oracle的裸设备使用。

 

裸设备

裸设备也叫裸分区,就是没有经过格式化、没有文件系统的一块存储空间。可以写入二进制内容,但是内容的格式、其中信息的组织等问题,需要使用它的人来完成。文件系统就是建立在裸设备之上,并完成裸设备空间的管理。

 

CIO

CIO即并行IOConcurrent IO)。在文件系统中,当某个文件被多个进程同时访问时,就出现了Inode竞争的问题。一般地,读操作使用的共享锁,即:多个读操作可以并发进行,而写操作使用排他锁。当锁被写进程占用时,其他所有操作均阻塞。因此,当这样的情况出现时,整个应用的性能将会大大降低。如图:

 

CIO就是为了解决这个问题。而且CIO带来的性能提高直逼裸设备。当文件系统支持CIO并开启CIO时,CIO默认会开启文件系统的Direct IO,即:让IO操作不经过Buffer直接进行底层数据操作。由于不经过数据Buffer,在文件系统层面就无需考虑数据一致性的问题,因此,读写操作可以并行执行。

在最终进行数据存储的时候,所有操作都会串行执行,CIO把这个事情交个了底层的driver


<think>嗯,用户现在想让我详细介绍一下/proc文件系统。之前他们在使用monitor.sh脚本时遇到了mpstat和free命令的问题,我建议他们通过安装sysstat和procps-ng来解决,但同时也提到了使用/proc文件系统作为替代方案,可能兼容性更好。现在用户可能想深入了解/proc,特别是如何在脚本中利用它来获取系统信息,而避免依赖外部命令。 首先,我需要回忆/proc的基本概念。它是一个虚拟文件系统,提供内核和进程信息的接口。在Linux中,/proc下的文件和目录不是真实的磁盘文件,而是动态生成的数据,反映系统实时状态。但用户是在MSYS2环境下,MSYS2模拟了部分Linux特性,所以/proc是否存在呢?可能部分存在,比如/proc/meminfo和/proc/stat,但可能不如完整Linux系统全面。需要确认这一点,否则用户可能会遇到信息不全的问题。 接下来,用户可能需要知道如何通过读取/proc中的文件来替代mpstat和free命令。比如,之前提到的替代方案中,get_cpu函数使用top命令,而get_mem函数直接读取/proc/meminfo。但用户可能更希望直接通过/proc来获取CPU使用率,而不是依赖top,这样减少外部依赖。 我需要详细说明/proc下哪些文件有用,比如/proc/stat包含CPU统计信息,/proc/meminfo包含内存信息,/proc/diskstats或/proc/partitions可能包含磁盘信息。然后举例如何解析这些文件,比如从/proc/stat计算CPU使用率,或者从/proc/meminfo获取内存总量和可用量。 另外,需要注意在MSYS2环境中,/proc可能提供的文件是否完整。例如,某些信息可能不可用,或者路径不同。可能需要建议用户检查是否存在这些文件,或者是否有其他替代路径。 用户可能还需要了解/proc文件系统的其他用途,比如查看进程信息(/proc/PID/),或者调整内核参数(/proc/sys/)。但当前场景主要是监控脚本,所以应重点介绍与系统资源监控相关的部分。 此外,需要提醒用户,处理/proc中的文件时要注意格式,因为这些文件的结构可能随着内核版本变化,或者在MSYS2中有不同的呈现方式。解析时应确保兼容性,比如使用awk或grep来提取特定字段。 最后,可能需要给出具体的示例代码,展示如何修改监控脚本,使用/proc替代mpstat和free,并验证在MSYS2中的可行性。同时,指出可能的限制,比如某些指标无法获取,或者需要其他处理方式。</think>━━━━━━━━━━━━━━━━━━━━ /proc 文件系统深度解析 ━━━━━━━━━━━━━━━━━━━━ /proc 是类Unix系统中特殊的虚拟文件系统(在Windows的MSYS2/Cygwin环境中为模拟实现),它作为内核与用户空间的通信接口,提供动态访问系统内核数据的能力。以下是其核心特性及应用场景: ▨ 本质特征 ├─ 虚拟性:不占用磁盘空间,数据存储在内存中 ├─ 实时性:内容动态生成,反映系统即时状态 ├─ 层次结构:以文件/目录形式组织系统信息 └─ 只读/可写:部分文件支持写入调整内核参数 ▨ 核心目录结构 ```bash /proc ├─ [PID] # 每个进程独立目录(MSYS2中可能受限) │ ├─ cmdline # 进程启动命令 │ ├─ status # 进程状态信息 │ └─ fd/ # 打开文件描述符 ├─ cpuinfo # CPU规格信息 ├─ meminfo # 内存使用详情 ├─ stat # 全局CPU统计 ├─ diskstats # 磁盘I/O统计 └─ sys/ # 内核参数调整接口 ``` ━━━━━━━━━━━━━━━━━━━━ 监控脚本关键数据获取 ━━━━━━━━━━━━━━━━━━━━ 1. CPU使用率计算(替代mpstat) ```bash function get_cpu_usage() { read -r cpu user nice system idle iowait irq softirq steal guest < <(awk '/^cpu /{print $0}' /proc/stat) total=$((user + nice + system + idle + iowait + irq + softirq + steal + guest)) idle_total=$((idle + iowait)) echo "scale=2; 100 * ($total - $idle_total) / $total" | bc } ``` 2. 内存使用率计算(替代free) ```bash function get_mem_usage() { mem_total=$(awk '/MemTotal/ {print $2}' /proc/meminfo) mem_avail=$(awk '/MemAvailable/ {print $2}' /proc/meminfo) echo "scale=2; 100 * ($mem_total - $mem_avail) / $mem_total" | bc } ``` ━━━━━━━━━━━━━━━━━━━━ MSYS2环境特殊注意事项 ━━━━━━━━━━━━━━━━━━━━ 1. 可用性差异 ├─ 完整进程树受限:`/proc/[PID]`信息不完整 ├─ 硬件信息过滤:部分敏感硬件数据被屏蔽 └─ 统计粒度调整:某些统计项合并处理 2. 兼容性验证方法 ```bash # 检查关键文件存在性 ls -l /proc/{cpuinfo,meminfo,stat} # 验证数据可读性 head -n5 /proc/meminfo | grep -E 'MemTotal|MemAvailable' ``` ━━━━━━━━━━━━━━━━━━━━ 高级应用场景 ━━━━━━━━━━━━━━━━━━━━ 1. 实时监控单个进程 ```bash pid=$(pgrep -f your_process) cat /proc/$pid/status | grep -E 'VmRSS|Threads' # 内存占用/线程数 ``` 2. 调整内核参数(需管理员权限) ```bash # 临时修改最大进程数 echo 120000 > /proc/sys/kernel/pid_max # 查看当前值 sysctl kernel.pid_max ``` 3. 硬件拓扑分析 ```bash cat /proc/cpuinfo | grep 'model name' # CPU型号 ls /proc/acpi/ # 电源管理信息 ``` ━━━━━━━━━━━━━━━━━━━━ 性能监控对比 ━━━━━━━━━━━━━━━━━━━━ | 指标 | /proc方案优势 | 传统命令方案劣势 | |------------|------------------------------|-------------------------| | CPU使用率 | 无额外依赖,精度高 | 需安装sysstat包 | | 内存统计 | 直接获取原始数据 | free显示单位固定 | | 扩展性 | 自由组合需要的数据 | 输出格式受限 | | 系统负载 | 可自定义负载算法 | 依赖特定命令输出 | 建议在MSYS2环境中优先使用/proc方案,但需注意:Windows子系统对某些统计项(如精确的I/O等待时间)的支持可能与原生Linux存在差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值