《Linux从小白到高手》综合应用篇:深入理解Linux磁盘及IO优化

news2025/1/17 3:14:32

1. 前言

其实磁盘优化和IO优化,我在前面的其他Linux调优博文中已经讲述过或者涉及过了,但是太过零碎,所以本篇就来集中深入讨论下Linux磁盘和IO调优。

2.磁盘调优

结合我多年的经验,本人认为磁盘调优最重要的是读写性能的提升和冗余度两个方面(当然还有其他优化方法,但是效果不是那么明显,只是在某些方面有提升)。因为作为和内存相连,并且是存放大量数据的地方,读写和数据安全是最最重要的。

2.1 提升磁盘的读写性能

  1. 磁盘读写性能优化
    对于磁盘,最容易实现但也是最有效果的,就是利用硬盘发展技术,选择读写性能和可靠性更好的磁盘,比如固态硬盘(SSD),相较于传统的机械硬盘(HDD),SSD具有更高的读写速度和更低的访问延迟,是提升磁盘性能的首选,但是价格也会更贵。另外企业级磁盘驱动器也具有更高的性能和可靠性,适用于对读取和写入速度要求较高的场景。
  2. 使用RAID磁盘阵列技术:
    RAID(冗余阵列磁盘)是一种将多个磁盘组合成一个逻辑单元的多磁盘整合技术,可以同时提高磁盘的读写性能和数据冗余度。关于RAID,写一节会详细介绍下。
  3. 将磁盘分区对齐:
    磁盘分区对齐‌是指将分区的起始位置与硬盘物理层的页边界对齐。这种对齐可以显著提高数据访问的效率,因为硬盘在读写时是以页为单位进行的。如果分区没有对齐,可能会导致额外的读写操作,从而影响性能。特别是对于‌SSD,4K对齐可以显著提高读写速度并延长硬盘寿命。可以使用fdisk和parted命令来实现磁盘分区对齐(具体的操作不在本篇演示,有兴趣的家人们可以自行在虚拟机测试研究下,不难)。
    对于SSD,确保分区起始位置与硬盘物理扇区对齐(即4K对齐),可以避免读写操作跨多个存储单元,从而提高数据读写效率。
    4.文件系统选择与优化
    Linux主要的文件系统有以下类型:
    **EXT4:**是 Linux 系统中广泛使用的文件系统。它支持日志功能,能在系统崩溃后快速恢复文件系统的一致性。在挂载 EXT4 文件系统时,可以通过设置挂载选项来优化性能。例如,使用noatime选项可以避免每次访问文件时更新文件的访问时间,减少磁盘 I/O 操作。在/etc/fstab文件中,对于 EXT4 分区的挂载行可以添加noatime选项,像/dev/sda1 / ext4 defaults,noatime 0 0。
    **XFS:**对于处理大文件和高并发写入场景表现出色。它具有高效的日志机制和可扩展性。在创建 XFS 文件系统时,可以使用-f选项强制覆盖现有文件系统(需谨慎使用),如mkfs.xfs -f /dev/sda2。在挂载时,也可以设置一些参数,如logbufs来调整日志缓冲区大小,提高性能。
    **Btrfs:**提供了高级功能,如快照、压缩和数据冗余。通过使用mount命令挂载 Btrfs 文件系统时,可以启用压缩功能来减少磁盘空间占用,例如mount -o compress=zstd /dev/sda3 /btrfs_partition,其中zstd是一种高效的压缩算法。
  4. 文件系统参数调整:
    对于 EXT4 文件系统,可以通过tune2fs命令调整文件系统参数。例如,tune2fs -m 1 /dev/sda1可以将保留的文件系统块百分比设置为 1%,减少磁盘空间预留,释放更多空间用于存储数据。
    XFS 文件系统可以使用xfs_admin命令来调整一些参数。比如,通过xfs_admin -u [新的UUID] /dev/sda2可以修改文件系统的 UUID。
  5. 磁盘调度策略优化(这个我测试过,好像不怎么明显,有懂得大佬可以请教下):
    常见的磁盘调度算法:
    **CFQ(Completely Fair Queuing):**完全公平队列调度算法,将 I/O 请求按照进程进行公平排队,每个进程都能获得相对公平的磁盘 I/O 资源。它适用于多用户桌面系统和通用服务器场景。
    **NOOP(No Operation):**这是一种简单的电梯算法实现,基本没有对 I/O 请求进行复杂的排序,适合固态硬盘(SSD),因为 SSD 的随机 I/O 性能较好,不需要复杂的调度算法。
    **DEADLINE:**保证每个 I/O 请求在一定时间内得到服务,它对延迟敏感的应用比较友好,会优先处理接近截止时间的请求。
    了解磁盘调度算法:
    CFQ(Completely Fair Queuing):完全公平队列调度算法,将 I/O 请求按照进程进行公平排队,每个进程都能获得相对公平的磁盘 I/O 资源。它适用于多用户桌面系统和通用服务器场景。
    NOOP(No Operation):这是一种简单的电梯算法实现,基本没有对 I/O 请求进行复杂的排序,适合固态硬盘(SSD),因为 SSD 的随机 I/O 性能较好,不需要复杂的调度算法。
    DEADLINE:保证每个 I/O 请求在一定时间内得到服务,它对延迟敏感的应用比较友好,会优先处理接近截止时间的请求。
    修改磁盘调度算法:可以通过echo命令修改/sys/block/[磁盘设备名]/queue/scheduler文件的内容来选择调度算法。例如,要将磁盘设备sda的调度算法设置为 DEADLINE,可以使用
echo deadline > /sys/block/sda/queue/scheduler
  1. 磁盘缓存优化
    操作系统缓存:
    Linux 内核有页缓存(page cache)和块缓存(block cache)机制。页缓存用于缓存文件系统的页面,块缓存用于缓存磁盘块。可以通过调整/proc/sys/vm/dirty_ratio和/proc/sys/vm/dirty_background_ratio参数来控制磁盘写缓存。dirty_ratio表示当系统中脏页(已修改但未写入磁盘的页面)达到这个百分比时,系统会主动将脏页写入磁盘;dirty_background_ratio是在后台开始将脏页写入磁盘的阈值。这就意味着你要根据系统的具体情况来做出权衡,如果你的系统对查询性能和实时性要求很高,那就要尽量利用大内存,反之,如果你的内存是瓶颈资源,而且对实时性和查询性能要求不高,那就要多利用磁盘。例如,
echo 5 > /proc/sys/vm/dirty_background_ratio
echo 15 > /proc/sys/vm/dirty_ratio

磁盘硬件缓存:许多磁盘和存储设备本身带有缓存。对于有缓存的磁盘,可以通过磁盘制造商提供的工具或者设备的 BIOS/UEFI 来优化缓存设置。一些高端磁盘可以设置缓存的读写策略。

2.2 提升磁盘的冗余度

  1. RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列),是一种磁盘组合冗余技术,常见的raid有以下几种(关于Linux的磁盘raid创建后续我会专门博文介绍,这里重点介绍raid 01/raid5/raid10):
    RAID 0+1(但可理解为RAID 0与RAID 1的组合):
    工作原理:先将数据条带化分布在多个硬盘上(RAID 0),然后再对这些条带化的数据进行镜像成RAID 1。但实际操作中,这种组合方式并不常见,且可能带来复杂的管理和性能问题。
    性能:由于结合了RAID 0的高性能和RAID 1的数据冗余,具有较高的读写速度和数据安全性。
    冗余:提供数据冗余,但冗余度取决于具体的实现方式。
    磁盘空间使用率:较低,因为镜像会占用额外的磁盘空间。
    在这里插入图片描述
    RAID 5:
    工作原理:RAID 5结合了RAID 0的条带化技术和数据校验信息。它将数据和校验信息分散存储在多个硬盘上,当某个硬盘出现故障时,可以利用其他硬盘上的数据和校验信息来恢复丢失的数据。
    性能:RAID 5具有和RAID 0相近的数据读取速度,但写入速度稍慢,因为每次写入数据都需要计算和写入校验信息。然而,由于其提供了数据冗余和容错能力,这种性能上的折衷是可以接受的。
    冗余:允许一个硬盘故障而不影响数据的完整性。
    磁盘空间使用率:较高,因为不需要像RAID 1那样进行完全的数据镜像。
    在这里插入图片描述
    RAID 10(RAID 1+0)
    工作原理:RAID 10是先组成RAID 1镜像对,然后再将多个镜像对组成RAID 0条带化。这种组合方式既提供了数据冗余(通过RAID 1),又提高了数据传输速度(通过RAID 0)。
    性能:RAID 10提供了非常高的读写速度和数据安全性。由于数据分散存储在多个镜像对上,因此即使某个硬盘出现故障,数据仍然可以从其他镜像对上读取和恢复。
    冗余:提供100%的数据冗余,因为每个数据块都有一个镜像副本。
    磁盘空间使用率:较低,因为每个数据块都需要存储一个镜像副本。此外,由于RAID 10需要至少4个硬盘(每个镜像对需要2个硬盘,而RAID 0至少需要2个镜像对),因此其成本也相对较高。
    在这里插入图片描述
    不同raid组合对比如下表所示:
    在这里插入图片描述
  2. LVM(Logical Volume Manager,逻辑卷管理器)与磁盘镜像
    原理:LVM 可以将多个物理磁盘或分区组合成一个逻辑卷。通过在 LVM 上创建镜像逻辑卷,可以实现数据的冗余。当一个物理磁盘出现故障时,LVM 可以自动切换到镜像磁盘上。
    配置方法:
  3. 使用pvcreate命令将物理磁盘或分区创建为物理卷(PV)。例如,pvcreate /dev/sda和pvcreate /dev/sdb。
    然后,使用vgcreate命令创建卷组(VG),将多个物理卷组合在一起。例如,vgcreate myvg /dev/sda /dev/sdb。
  4. 使用lvcreate命令创建逻辑卷(LV),并指定镜像选项。例如,lvcreate -L 200G -m1 -n mylv myvg创建一个大小为 200GB 的镜像逻辑卷。
  5. 格式化并挂载这个逻辑卷,如mkfs.ext4 /dev/mylv和mount /dev/mylv /mnt。

3.磁盘读写 IO监控优化最重要的2个命令

  1. iostat
    功能:监控磁盘使用情况。
    输出内容:包括CPU使用情况、设备(磁盘)的I/O统计信息等:
    在这里插入图片描述
    经验总结:
    –%idle值高,表示CPU较空闲。若%idle值高但系统响应慢,可能是CPU等待分配内存,此时应加大内存容量。
    –%idle小于70,I/O压力较大。
    –%idle值如果持续低于10,表明系统中最需要解决的资源是CPU。
    –如果%util比较大,说明I/O请求太多,硬盘可能存在瓶颈。
    –await大于svctm,差值越小,说明队列时间越短;反之差值越大,队列时间越长,说明系统出现了问题。
    –avgqu-sz队列长度也可衡量I/O负荷,avgqu-sz是单位时间内的平均值。
  2. iotop
    iotop 的功能
    实时监测磁盘 I/O 活动:
    –iotop 可以实时显示系统中各个进程的磁盘读写情况,让用户能够清楚地了解哪些进程正在频繁进行磁盘 I/O 操作,对于及时发现磁盘性能瓶颈和排查问题非常有帮助。
    识别高 I/O 消耗进程:
    –通过对进程的磁盘 I/O 速度进行监测和排序,iotop 可以快速定位那些消耗大量磁盘资源的进程,有助于管理员采取针对性的措施,如优化进程的行为、调整其优先级或限制其磁盘访问。
    –可以区分磁盘读取和写入操作,帮助用户确定是哪个方向的 I/O 活动较为频繁。
    输出内容
    进程信息:
    PID:进程的标识符,用于唯一确定一个进程。
    USER:启动该进程的用户。
    DISK READ:进程的磁盘读取速度,通常以字节 / 秒或更易读的单位(如 KB/s、MB/s)显示。
    DISK WRITE:进程的磁盘写入速度,单位与磁盘读取速度相同。
    SWAPIN:表示进程从交换分区读取数据的速度。
    IO>:综合的磁盘 I/O 速度,是磁盘读取和写入速度的总和。
    COMMAND:正在运行的进程的命令名称。
    表头说明:
    TID:线程标识符(如果显示线程级别的信息)。
    PRIO:进程的优先级。
    NI:Nice 值,表示进程的优先级调整值。
    % CPU:进程占用的 CPU 百分比。
    TIME+:进程运行的累计时间。
    在这里插入图片描述
    本篇完结。
    码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,家人们的点赞和关注是我笔耕不辍的动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2214487.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 实战案例全解析 实现时间停止效果+世界变灰

画面里运动的那个小玩意这么写 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Partol : MonoBehaviour {public Transform pos1;public Transform pos2;public float speed;private Transform target;void Start() {target p…

SpringBoot智能推荐:健康生活新选择

3系统分析 3.1可行性分析 通过对本基于智能推荐的卫生健康系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本基于智能推荐的卫生健康系统采用SSM框架&#…

二叉查找树(Binary Search Tree)Java语言实现

一、二叉查找树 二叉查找树(Binary Search Tree),也称为二叉搜索树、有序二叉树(Ordered Binary Tree)或排序二叉树(Sorted Binary Tree)。 是指一棵空树或者具有下列性质的二叉树&#xff1a…

Unity DOTS中的Archetype与Chunk

Unity DOTS中的Archetype与Chunk 在Unity中,archetype(原型)用来表示一个world里具有相同component类型组合的entity。也就是说,相同component类型的entity在Unity内部会存储到一起,共享同一个archetype。 使用这样的设…

JAVA毕业设计191—基于Java+Springboot+vue的电子产品商城管理系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue的电子产品商城管理系统(源代码数据库)191 一、系统介绍 本项目前后端不分离,分为用户、管理员两种角色 1、用户: 注册、登录、商品…

C++在vscode中的code runner配置/环境配置

C在vscode中快捷运行(code runner) 一、配置tasks.json 在vscode中创建文件夹或打开文件夹,会发现文件夹下多了一个.vscode文件夹,在该文件夹下创建tasks.json文件,并添加一下内容 {"version": "2.0…

弘景光电:以创新为翼,翱翔光学科技新蓝海

在科技日新月异的今天,光学镜头及模组作为智能设备的核心组件,其重要性日益凸显。广东弘景光电科技股份有限公司(以下简称“弘景光电”)正是在这一领域中,凭借其卓越的研发实力和市场洞察力,即将在创业板上…

工具篇:(二)MacOS 下载 MySQL 并进行配置连接,使用 VSCode 创建 Node 项目-亲测有效

MacOS 下载 MySQL 并进行配置连接,使用 VSCode 创建 Node 项目 我们将介绍如何在 macOS 上下载和配置 MySQL 数据库,并使用 VSCode 创建一个 Node.js 项目进行测试。通过这些步骤,您将能够顺利地设置开发环境并进行基本的数据操作。 一、删…

【国际学术会议之都,IEEE出版】第四届计算机科学、电子信息工程和智能控制技术国际会议(CEI 2024,2024年11月8-10日)

第四届计算机科学、电子信息工程和智能控制技术国际会议(CEI 2024) 2024 4th International Conference on Computer Science, Electronic Information Engineering and Intelligent Control Technology 官方信息 会议官网:www.ic-cei.org …

AFSim仿真系统 --- 系统简解_10处理器 (Processors)

处理器 (Processors) 处理器提供了为特定平台定义行为的能力。 大多数处理器由用户使用 AFSIM 脚本语言定义。 以下是一些预定义的处理器类型: WSF_DIRECTION_FINDER_PROCESSORWSF_TRACK_PROCESSORWSF_MESSAGE_PROCESSORWSF_GUIDANCE_COMPUTERWSF_IMAGE_PROCESS…

Android11 USB Camera会出现预览绿屏问题

目录 一、问题描述 二、问题原因 三、解决方法 一、问题描述 DDR容量是4G及以上的机器,USB Camera会出现预览绿屏问题。 串口中会刷如下log: 二、问题原因 RGA2使用超过4G内存会异常,导致USB Camera调用rga相关操作报错,从而预览绿屏 三…

深度学习基础—神经风格迁移

1.什么是神经风格迁移 神经风格迁移就是将一张图片的风格迁移到另一张图片上,生成具有第一张图片风格的新的图片。新图片的主体还是第二张图片,但是风格是第一张图片的。 如下两组图片都是神经风格迁移的例子: 将绘画的风格迁移到真实建筑图片…

树型名称前面插入图片

需求&#xff1a; 搜索树、树型要显示连线&#xff0c;还有名称前带图片 ui组件&#xff1a;https://devui.design/components/zh-cn/overview 直接上代码 [checkable] false 表示取消复选框 <div class"p-sm"><div class"row"><d-sea…

软件开发----Java基础每日刷题(转载于牛客)

1. 对抽象类的描述正确的是() A 抽象类的方法都是抽象方法 B 一个类可以继承多个抽象类 C 抽象类不能有构造方法 D 抽象类不能被实例化 正确答案&#xff1a;D 解析&#xff1a; A.抽象类可以有非抽象的方法&#xff0c;而接口中的方…

Flythings学习(三)界面交互

文章目录 1 界面切换1.1 打开界面1.2 关闭界面 2 界面活动周期2.1 打开不存在页面的活动流程2.2 打开已存在界面&#xff08;被隐藏的界面&#xff09;2.3 关闭界面的流程 1 界面切换 界面切换的相关函数如下 1.1 打开界面 如果需要打开一个界面&#xff0c;在其他界面的控件…

WebSocket状态码及异常报错1006

文章目录 1.WebSocket协议简介2.WebSocket状态码的作用&#xff1a;3.WebSocket状态码1006详解1.问题原因2.解决方案 1.WebSocket协议简介 WebSocket协议是一种基于TCP的协议&#xff0c;它通过在浏览器和服务器之间建立一条持久的双向通信通道&#xff0c;实现了实时的数据传…

【论文阅读】SAM 2: 分割一切图像和视频

导言 继SAM模型发布以来&#xff0c;Meta公司于2024年8月发布第二个图像分割大模型SAM2。相较于第一代SAM模型&#xff0c;论文提出了第二代“分割任意物体模型” (SAM 2)&#xff0c;旨在解决视频中的可提示视觉分割任务&#xff08;Promptable Visual Segmentation, PVS&…

TVS常规过压保护

一、前言 上一篇文章 TVS选型-CSDN博客https://blog.csdn.net/qq_39543984/article/details/142825929?spm=1001.2014.3001.5501我们介绍了如何通过理论计算选择合适的TVS,TVS主要是防止瞬间过压,因为他的名字就叫瞬态二极管(Transient Voltage Suppressor)。本文就通过理…

自动化检查网页的TDK,python+selenium自动化测试web的网页源代码中的title,Description,Keywords

首先&#xff0c;TDK是什么&#xff1f;对于新手小白来说&#xff0c;可能是懵逼的&#xff0c;所以这里给出一个官方的解说‌网页的TDK是指标题&#xff08;Title&#xff09;、描述&#xff08;Description&#xff09;和关键词&#xff08;Keywords&#xff09;的集合‌。这…

智慧船舶物联网实训室建设方案

第一章 建设背景 随着全球海洋经济的蓬勃发展与智能化技术的日新月异&#xff0c;数字船舶物联网&#xff08;Internet of Things for Maritime, IoT-Maritime&#xff09;与人工智能&#xff08;Artificial Intelligence, AI&#xff09;的结合已成为推动航运业转型升级的关键…