Linux 文件系统备用知识点

最近因为一些需求,需要复习一下Linux的文件系统,简单对磁盘&&文件系统做一个归纳,温故而知新。

硬盘是怎么变成文件系统的

硬盘这东西不知道大家拆过没,里面是一片片带有磁性的盘片,每个盘片有两个面,都可记录数据。

  • 一个圆盘基于圆心又有好几个同心圆,这个圆就是磁道。
  • 每个磁道又按照512个字节为单位划分为等分,这就是存放数据的基本单位,即扇区。
  • 每个磁盘有两个面,每个面都有一个磁头,习惯用磁头号来区分。

    而磁盘就是由上面三个项构成的,磁盘容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数

而Linux 在使用磁盘的时候,会首先对磁盘进行初始化,即类似mkfs.ext3 /dev/hda1这种, 初始化会将磁盘分成3大块,

  • 超级块,存储整个文件系统的状态,比如整体的磁盘使用率等等。
  • 索引节点区,就是所谓的inode,他是一个结构体,这个结构体包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位
  • 数据块区,则用来存储文件数据
VFS

我们所知的Linux文件系统非常多,ext3,ext4,nfs,glusterfs等等等等,但我们在实际使用中似乎不太会关注怎么用这些不同的文件系统,对于我们写代码来说,我们只关注他挂在哪个本地路径,然后基于文件路径做对应的读写操作即可,因为这一块,Linux的VFS(虚拟文件系统)帮我们做了统一的封装,我们只需要调用统一的内核接口
进行文件读写而不需要关心他到底是ext3还是xfs。

文件是如何写入Linux的

玩Linux的都知道,Linux的设计哲学在于一切皆文件,即所有系统资源都是文件,当然也包括硬件资源,所以Linux在操作对应的硬件资源时,只要修改对应的资源文件即可。
那既然一切皆文件了,那不得不说的就是Linux的文件系统是如何实现的了。

先假设一个场景,有个服务进程,他运行后需要对目录/var/log/a.log

  • 进行日志写入,那这么一个简单的动作在文件系统上是怎么操作的呢?
  • 进程调用对应代码的write()方法(用户态)
  • 内核收到代码发来请求并转换成的统一系统调用(内核态)
  • 调用VFS统一接口进行磁盘写入(内核态)
  • VFS根据路径找到对应的文件系统(内核态)
  • 根据文件系统类型找到对应的通用块设备层(内核态)
  • 调用设备驱动(内核层)
  • 写入磁盘(硬件)

可以看到,仅仅是写入一个日志,Linux就干了这么多事,可放在实际工作中,其实也有一点不对,比如我们执行一条sql,返回了1条数据,为什么返回不是一个个字节返回的,然后直接一个table返回的? 这是因为Linux的IO机制。

IO机制

Linux下磁盘IO过程不是简单的一个读写,传统的IO方式,以read(),write()为例,当我们要read() 一个文件的时候,首先要将数据从磁盘中拷贝到内核空间的页缓存中,然后再将页缓存的数据拷贝到用户空间来,同理,write()一个文件的时候,也会将数据先写入内核空间的页缓存,然后再写入磁盘。

除此之外,还有其他一些IO方式,比如阻塞/非阻塞,同步/异步,直接读写等, 而日常工作中遇到的IO文件,大多是这些不同的机制导致的。

排查思路

一般的IO慢可以根据以下思路(工具)进行排查:

  • vmstat , 先看下是不是内存满了,导致用到了swap,从而拖慢了IO。
root@dev: vmstat 1

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

 0  1      0 6809322  1368 887443    0    0 32640     0   52  478  1  0 50 49  0

 0  1      0 6776631   1368 889433    0    0 32640     0   33  490  0  0 
  • iostat 最常用的磁盘 I/O 性能观测工具, 一般用来看是哪个指标比较高,是IOPS还是吞吐量还是响应时间,如果IOPS比较高,可以看下小文件操作是不是太多了,吞吐量可以看看最近是不是大文件拷贝之类的,响应时间的话,建议看看raid卡是不是有点啥硬件问题。
 -d -x 表示显示所有磁盘 I/O 的指标

$ root@dev:iostat -d -x 1 

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util 

loop0            0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00    0.00    0.00   0.00     0.00     0.00   0.00   0.00 

vda              0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00    0.00    0.00   0.00     0.00     0.00   0.00   0.00 

vdb              0.00    0.00      0.00      0.00     0.00     0.00   0.00   0.00    0.00    0.00   0.00     0.00     0.00   0.00   0.00 
  • top -d 3 , 看下top,直观的先找找哪个应用负载比较高
  • strace -p pid, 如果找到了PID,那么直接strace 这个进程,看下是不是代码的问题,比如是否有疯狂调用write()啊之类的
  • 查代码源码,找到证据后就只能看代码为啥要这么操作IO了
个人公众号, 分享一些日常开发,运维工作中的日常以及一些学习感悟,欢迎大家互相学习,交流

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值