Linux优化之IO子系统监控与调优(1)


Linux优化之IO子系统

作为服务器主机来讲,最大的两个IO类型 :

1.磁盘IO

2.网络IO

这是我们调整最多的两个部分所在

磁盘IO是如何实现的

在内存调优中,一直在讲到为了加速性能,linux内核一般情况下都会尝试将磁盘上的慢速设备上的文件缓存至内存中,从而达到加速效果;

虚拟内存的概念:

读写都在内存中完成,当某一进程在cpu运行的时候,进程要访问自己地址空间中的某一内存页,当进程需要访问页面中的数据,而这个页面最终是要对应在物理内存中的某个物理页面,而进程只能看到自己的线性地址空间,而这个地址并不存在,一旦访问这个地址,那么会通过MMU内存管理单元)机制中的存储当前进程的线性地址到物理地址的映射表

由此通过MMU实现对应的地址查询于是得到了其映射的地址,最终进程虽然访问的数据是来自于映射过的地址,这种访问访问我们被称为虚拟地址或虚拟内存

如果由于我们使用交换内存或其他方式有可能这个进程所打开的文件长时间没有被访问,这个文件所对应的内存已经被清出去了,所以使用mmu地址转换后的地址对应的数据在内存中不存在了,这时候会产生页错误,我们也被称为缺页异常

缺页异常

缺页异常分为大异常和小异常:

如果数据不存在使得不得不在磁盘中载入页面文件,这时CPU就会进入内核模式,访问磁盘,每次CPU访问内存就要3个周期,访问磁盘需要N个周期,首先需要定位数据的准确位置,而后定位物理内存中开辟数据空间,最后将数据总线贯通,从而将数据从磁盘转入到内存--blockin

当我们找一个空闲空间,而事实上当进程访问这段数据就需要访问新位置的数据,所以我们要更新这个映射表,明确说明所要访问的逻辑地址所要对应的空间的转换的位置,并且让进程重新发起一次访问,这时需要先查找TLB缓存缓冲器),再次进行查表

而将磁盘装入内存的过程就会发生IO,如果进程修改了数据,最终数据还需要写到磁盘中去,而写到磁盘中去,过程使得数据比原来的文件更大了

具体是由文件系统模块根据进程发起的请求,内核指挥文件系统模块开辟更多的存储块而后将数据存储,这种过程被称为 block out

#缓冲器负责将之前缓冲过的缓存下来,那么如果N个条目,而缓冲器只能缓存有限的几个,那么命中率可能会很低,如果我们使用大页面的话,那么命中率可以大大提高。

机械硬盘的特性

同一方向的操作是合并起来完成的,而后在这个方向结束之后则是另外一方向的

对硬盘来讲,读写是不同类型的操作,读写是不能同时进行的

磁盘是如何操作的

将一个或多个进程的读操作合并到一起读

将一个或多个进程的写操作合并到一起写

所以读写操作是两类不同的操作而且是同一方向合并的

如果是读文件,这个文件一定是来自于磁盘的

如果是写文件,那么写入到内存中,对于进程来讲是已经完成的,那么用户对计算机性能感知是来自于读,因为读一定是与IO相交互

1.读是在同方向合并的

2.写也是需要合并的,而且两者是不同方向的操作

因为在同一方向可以节省很多资源

读必须优先满足,而写也不能等太久,因此必须有一种良好的算法让其尽可能都得到满足,而又不能让用户感到性能下降

因此在IO系统上有个非常重要的模块---IO调度器

IO调度器

用来实现合并同一方向的读写操作并且将读写操作尽可能理想的这种状况,IO调度器本身的完成,最终用户实现写的时候进程级别所看到的数据是文件接口,那么文件接口输出的时候就意味着将磁盘空间以文件接口的方式输出,其需要文件系统,也就意味着进程与磁盘上的数据打交道是依赖文件系统的,所以用户的请求先到文件系统,而文件系统通过内核输出是虚拟文件接口VFS) 通过VFS找到各特定文件系统相关模块,当然对应的文件是哪个那么则通过vfs转换成什么即可,文件系统将数据接下来之后,最终存储为磁盘块的方式保存在磁盘上,因此这些文件系统最终还要转换数据为磁盘块,所以接下来还要有块层

块层主要是将数据转换为磁盘块格式,而后再由磁盘块格式转换成调度以后存储在磁盘上

如下图所示:

wKiom1QdhnPy6EQQAAH_P6Mmz0A257.jpg

  • 1)用户进程实现写操作 实现系统调用
  • 2)用户的写操作一定是跟VFS进行交互的
  • 3)VFS需要将其换换为特定的文件系统
  • 4)单个文件在虚拟文件系统存放都会转换成页面方式page cache)
  • 5)写完之后通过block buffer快缓冲知所以进行缓冲是因为磁盘太慢了,所以写的时候需要缓冲下来)
  • 6)然后由bio将每个page cache转换成块,并且在块缓冲这个层次上缓存下来


相关内容