Gitlib Gitlib
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)

Ravior

以梦为马,莫负韶华
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)
  • 操作系统

    • 学习笔记

      • 鸟哥的Linux私房菜学习笔记01-计算机概论
      • 鸟哥的Linux私房菜学习笔记02-磁盘分区
      • 鸟哥的Linux私房菜学习笔记03-日志文件
      • 寄存器
      • 汇编语言
      • 零拷贝
      • 内存管理单元MMU
      • 内存管理基础知识
      • 文件系统
      • 系统调用
      • 写时复制
      • 虚拟地址
      • 虚拟内存
      • 中断
      • CPU
      • DMA
      • mmap
      • Swap分区
    • Shell

    • Linux命令

    • RAID分类详解
    • Page Cache与Page回写
    • 磁盘IO与swap分区
      • 硬盘的物理结构
      • 磁盘读写时间
        • 寻道时间
        • 旋转延迟
        • 传输时间
      • 磁盘调度算法
        • 先来先服务算法(FCFS)
        • 最短寻道时间算法(SSFT)
        • 扫描算法(SCAN)
        • 循环扫描算法(CSCAN)
      • 磁盘IO优化
        • 预读
        • 延迟写
        • 优化物理分布
      • Swap分区
        • 增加swap分区操作
  • 计算机网络

  • 数据结构和算法

  • MySQL

  • Redis

  • Nginx

  • MongoDB

  • 其他

  • 计算机基础
  • 操作系统
Ravior
2018-12-21
目录

磁盘IO与swap分区

在了解磁盘IO之前,我们先从硬盘的物理结构说起。

# 硬盘的物理结构

硬盘内部主要部件为磁盘盘片、传动手臂、读写磁头和主轴马达。实际数据都是写在盘片上,读写主要是通过传动手臂上的读写磁头来完成。实际运行时,主轴让磁盘盘片转动,然后传动手臂可伸展让读取头在盘片上进行读写操作。

IO

由于单一盘片容量有限,一般硬盘都有两张以上的盘片,每个盘片有两面,都可记录信息,所以一张盘片对应着两个磁头。盘片被分为许多扇形的区域,每个区域叫一个扇区,硬盘中每个扇区的大小固定为512字节。盘片表面上以盘片中心为圆心,不同半径的同心圆称为磁道,不同盘片相同半径的磁道所组成的圆柱称为柱面。

IO

硬盘上磁盘进行高速旋转,磁头臂在磁盘上来回移动进行数据的读取和写入。磁盘由圆心向外被划分为多个磁道,所谓摆臂在磁道上来回移动也就是摆臂在磁道间的来回移动,

IO

IO

# 磁盘读写时间

在了解了硬盘的基本原理之后,不难推算出,磁盘上数据读取和写入所花费的时间可以分为三个部分。

# 寻道时间

所谓寻道时间,其实就是磁臂移动到指定磁道所需要的时间,这部分时间又可以分为两部分:

寻道时间=启动磁臂的时间+常数*所需移动的磁道数

其中常数和驱动器的的硬件相关,启动磁臂的时间也和驱动器的硬件相关

# 旋转延迟

旋转延迟指的是把扇区移动到磁头下面的时间。这个时间和驱动器的转数有关,我们通常所说的7200转的硬盘的转就是这个,旋转延迟只和硬件有关。

# 传输时间

传输时间指的是从磁盘读出或将数据写入磁盘的时间,这个时间等于:所需要读写的字节数/每秒转速*每扇区的字节数

# 磁盘调度算法

通过上面硬盘读写数据所分的三部分时间不难看出,大部分参数是和硬件相关的,操作系统无力优化。只有所需移动的磁道数是可以通过操作系统来进行控制的,所以减少所需移动的磁道数是减少整个硬盘的读写时间的唯一办法。

因为操作系统内可能会有很多进程需要调用磁盘进行读写,因此合理的安排磁头的移动以减少寻道时间就是磁盘调度算法的目的所在,几种常见的磁盘调度算法如下。

# 先来先服务算法(FCFS)

这种算法将对磁盘的IO请求进行排队,按照先后顺序依次调度磁头。这种算法的特点是简单,合理,但没有减少寻道时间。

# 最短寻道时间算法(SSFT)

这种算法优先执行所需读写的磁道离当前磁头最近的请求。这保证了平均寻道时间的最短,但缺点显而易见:离当前磁头比较远的寻道请求有可能一直得不到执行,这也就是所谓的“饥饿现象”。

# 扫描算法(SCAN)

这种算法在磁头的移动方向上选择离当前磁头所在磁道最近的请求作为下一次服务对象,这种改进有效避免了饥饿现象,并且减少了寻道时间。但缺点依然存在,那就是不利于最远一端的磁道访问请求。

# 循环扫描算法(CSCAN)

也就是俗称的电梯算法,这种算法是对最短寻道时间算法的改进。这种算法就像电梯一样,只能从1楼上到15楼,然后再从15楼下到1楼。这种算法的磁头调度也是如此,磁头只能从最里磁道到磁盘最外层磁道。然后再由最外层磁道移动到最里层磁道,磁头是单向移动的,在此基础上,才执行和最短寻道时间算法一样的,离当前磁头最近的寻道请求。这种算法改善了SCAN算法,消除了对两端磁道请求的不公平。

# 磁盘IO优化

除去上面通过磁盘调度算法来减少寻道时间之外,还可以通过以下几个手段来减少磁盘的IO。

# 预读

磁盘读取依靠的是机械运动,分为寻道时间、旋转延迟、传输时间三个部分,这三个部分耗时相加就是一次磁盘IO的时间,这个成本是访问内存的十万倍左右,所以说磁盘IO是非常昂贵的操作。

预读:每一次IO时,不仅仅把当前磁盘地址的数据加载到内存,同时也把相邻数据也加载到内存缓冲区中,这样当访问一个地址数据的时候,与其相邻的数据很快也会被访问到。

每次磁盘IO读取的数据我们称之为一页(page)。一页的大小与操作系统有关,一般为4k或者8k。这也就意味着读取一页内数据的时候,实际上发生了一次磁盘IO。

# 延迟写

延迟写:最近被访问的数据有可能再次被访问,因此当数据更改之后不马上写回磁盘,而是继续放在内存中,以备接下来的请求读取或者修改,是减少磁盘IO的另一个有效手段。

# 优化物理分布

根据磁盘原理不难看出,如果所请求的数据在磁盘物理磁道之间是连续的,那么会减少磁头的移动距离,从而减少了寻道时间。因此相关的数据放在连续的物理空间上会减少寻道时间。

# Swap分区

Swap分区,即交换区,Swap空间的作用可简单描述为:

当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。

那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换, Swap交换的操作是磁盘IO的操作。

分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错误。通常情况下,Swap空间应大于或等于物理内存的大小,最小不应小于64M,通常Swap空间的大小应是物理内存的2-2.5倍。

# 增加swap分区操作

  • 创建swap分区文件
# 创建1G大小的swap分区文件
dd if=/dev/zero of=/home/swap bs=1M count=1024
1
2
  • 格式化交换文件
mkswap /home/swap
1
  • 启动交换分区文件
swapon /home/swap
1
  • 停用交换分区文件
swapoff/home/swap
1
#Linux
上次更新: 2022/12/01, 11:09:34
Page Cache与Page回写
深入理解IO模型

← Page Cache与Page回写 深入理解IO模型→

最近更新
01
常用游戏反外挂技术总结
11-27
02
Golang开发实践万字总结
11-11
03
Redis万字总结
10-30
更多文章>
Theme by Vdoing | Copyright © 2011-2022 Ravior | 粤ICP备17060229号-3 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式