《Linux从小白到高手》综合应用篇:深入理解Linux磁盘及IO优化
1. 前言
其实磁盘优化和IO优化,我在前面的其他Linux调优博文中已经讲述过或者涉及过了,但是太过零碎,所以本篇就来集中深入讨论下Linux磁盘和IO调优。
2.磁盘调优
结合我多年的经验,本人认为磁盘调优最重要的是读写性能的提升和冗余度两个方面(当然还有其他优化方法,但是效果不是那么明显,只是在某些方面有提升)。因为作为和内存相连,并且是存放大量数据的地方,读写和数据安全是最最重要的。
2.1 提升磁盘的读写性能
- 磁盘读写性能优化
对于磁盘,最容易实现但也是最有效果的,就是利用硬盘发展技术,选择读写性能和可靠性更好的磁盘,比如固态硬盘(SSD),相较于传统的机械硬盘(HDD),SSD具有更高的读写速度和更低的访问延迟,是提升磁盘性能的首选,但是价格也会更贵。另外企业级磁盘驱动器也具有更高的性能和可靠性,适用于对读取和写入速度要求较高的场景。 - 使用RAID磁盘阵列技术:
RAID(冗余阵列磁盘)是一种将多个磁盘组合成一个逻辑单元的多磁盘整合技术,可以同时提高磁盘的读写性能和数据冗余度。关于RAID,写一节会详细介绍下。 - 将磁盘分区对齐:
磁盘分区对齐是指将分区的起始位置与硬盘物理层的页边界对齐。这种对齐可以显著提高数据访问的效率,因为硬盘在读写时是以页为单位进行的。如果分区没有对齐,可能会导致额外的读写操作,从而影响性能。特别是对于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是一种高效的压缩算法。 - 文件系统参数调整:
对于 EXT4 文件系统,可以通过tune2fs命令调整文件系统参数。例如,tune2fs -m 1 /dev/sda1可以将保留的文件系统块百分比设置为 1%,减少磁盘空间预留,释放更多空间用于存储数据。
XFS 文件系统可以使用xfs_admin命令来调整一些参数。比如,通过xfs_admin -u [新的UUID] /dev/sda2可以修改文件系统的 UUID。 - 磁盘调度策略优化(这个我测试过,好像不怎么明显,有懂得大佬可以请教下):
常见的磁盘调度算法:
**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
- 磁盘缓存优化
操作系统缓存:
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 提升磁盘的冗余度
- 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组合对比如下表所示:
- LVM(Logical Volume Manager,逻辑卷管理器)与磁盘镜像
原理:LVM 可以将多个物理磁盘或分区组合成一个逻辑卷。通过在 LVM 上创建镜像逻辑卷,可以实现数据的冗余。当一个物理磁盘出现故障时,LVM 可以自动切换到镜像磁盘上。
配置方法: - 使用pvcreate命令将物理磁盘或分区创建为物理卷(PV)。例如,pvcreate /dev/sda和pvcreate /dev/sdb。
然后,使用vgcreate命令创建卷组(VG),将多个物理卷组合在一起。例如,vgcreate myvg /dev/sda /dev/sdb。 - 使用lvcreate命令创建逻辑卷(LV),并指定镜像选项。例如,lvcreate -L 200G -m1 -n mylv myvg创建一个大小为 200GB 的镜像逻辑卷。
- 格式化并挂载这个逻辑卷,如mkfs.ext4 /dev/mylv和mount /dev/mylv /mnt。
3.磁盘读写 IO监控优化最重要的2个命令
- 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是单位时间内的平均值。 - 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+:进程运行的累计时间。
本篇完结。
码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,家人们的点赞和关注是我笔耕不辍的动力。
相关文章:

《Linux从小白到高手》综合应用篇:深入理解Linux磁盘及IO优化
1. 前言 其实磁盘优化和IO优化,我在前面的其他Linux调优博文中已经讲述过或者涉及过了,但是太过零碎,所以本篇就来集中深入讨论下Linux磁盘和IO调优。 2.磁盘调优 结合我多年的经验,本人认为磁盘调优最重要的是读写性能的提升和…...

【Linux】内存文件系统的I/O、重定向
文章目录 1. 系统中的文件2. 回顾C中的文件接口3. 文件类的系统调用3.1 open3.2 文件描述符 4. IO的基本过程5.重定向5.1 引入重定向5.2 系统中的重定向接口 6. 缓冲区问题7. 简单版shell的实现 1. 系统中的文件 在学习完Linux权限后,我们清楚的知道:文…...
力扣10.18
1463. 摘樱桃 II 给你一个 rows x cols 的矩阵 grid 来表示一块樱桃地。 grid 中每个格子的数字表示你能获得的樱桃数目。 你有两个机器人帮你收集樱桃,机器人 1 从左上角格子 (0,0) 出发,机器人 2 从右上角格子 (0, cols-1) 出发。 请你按照如下规则…...

cs木马图形化界面出现问题处理
一个月多月没用cs木马了,发现打开客户端之后显示不出图形化界面,且出现下面这样的报错。 、 最后发现是java版本的问题,kali的java自动更新了。把原来的openjdk11改到了openjdk23。 解决方法: 输入: sudo update-…...

数据结构与算法 - 树 #数的概念 #二叉树 #堆 - 堆的实现/堆排序/TOP-K问题
文章目录 前言 一、树 (一)、概念 1、树的定义 (二)、树的定义 1、树为什么是递归定义的? 2、如何定义树(如何表达一棵树) 解决方案一:假设我们得知该树的度 解决方案二:顺序表 解决方案三:左孩子右兄弟表示法 二、二叉…...

Git推送被拒
今天开发完成一个新的需求,将自己的分支合并到test分支后,推送到远程仓库,结果显示推送被拒: 原因是因为有人更新了test分支的代码,我在合并之前没有拉取最新的test分支代码,所以他提示我“推送前需要合并…...

Jmeter进行http接口测试
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 本文主要针对http接口进行测试,使用jmeter工具实现。 Jmeter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较…...

工业相机详解及选型
工业相机相对于传统的民用相机而言,具有搞图像稳定性,传输能力和高抗干扰能力等,目前市面上的工业相机大多数是基于CCD(Charge Coupled Device)或CMOS(Complementary Metal Oxide Semiconductor)芯片的相机。 一,工业相机的分类 …...
RAID 矩阵
在架构设计中,RAID矩阵(RAID Log)是一个用于项目管理和风险管理的工具,帮助团队有效管理和跟踪项目中可能影响成功交付的关键因素。与存储技术中的 RAID 不同,这里的 RAID 是一个缩写,代表: R:…...

详细分析Redisson分布式锁中的renewExpiration()方法
目录 一、Redisson分布式锁的续期 整体分析 具体步骤和逻辑分析 为什么需要递归调用? 定时任务的生命周期? 一、Redisson分布式锁的续期 Redisson是一个基于Redis的Java分布式锁实现。它允许多个进程或线程之间安全地共享资源。为了实现这一点&…...

实验3,网络地址转换
实验3:网络地址转换 实验目的及要求: 通过实验,掌握NAT技术的工作原理,了解三种不同类型NAT技术的主要作用以及各自的主要应用环境。能够完成静态NAT和复用NAT技术的应用,并熟练掌握NAT技术相关的配置命令。 实验设…...
Java 中的 String 字符串是不可变的
文章目录 什么是不可变字符串?举个例子直观理解 不可变的原理1. 内部实现2. 字符串常量池3. 线程安全 为什么要设计成不可变?什么时候用可变字符串?示例 总结推荐阅读文章 在 Java 编程中,字符串(String)是…...
计算机网络架构实例
小型企业网络 1. 终端设备: - 员工的台式电脑和笔记本电脑,用于日常办公,如文档处理、邮件收发、业务软件使用等。 - 智能手机和平板电脑,方便员工在外出或移动办公时也能接入公司网络,查看邮件和处理紧急事务。 2.…...

Chrome与Firefox浏览器HTTP自动跳转HTTPS的解决方案
一、背景介绍 随着网络安全意识的不断提高,越来越多的网站开始采用HTTPS协议,以确保数据传输的安全性。然而,有时用户在浏览网页时,可能会遇到HTTP请求被自动跳转至HTTPS的情况导致网站打不开,提示安全问题࿰…...

众数信科荣登“2024 CHINA AIGC 100”榜单
2024年10月17日,由非凡产研推出的「2024 CHINA AIGC 100」榜单隆重发布,众数信科凭借领先的企业AI智能体解决方案能力荣登榜单。 非凡产研AIGC 100 评选旨在挖掘国内具有高潜力的AI应用,为AI产业的高质量发展注入新动力。榜单覆盖了教育、医疗…...

【AI知识】距离度量和相似性度量的常见算法
本文介绍一些AI中常见的距离度量和相似性度量算法: 1. 欧几里得距离(Euclidean Distance) 欧几里得距离是最常见的距离度量方法,用来计算两个向量之间的“直线距离”,也被成为L2范数。 公式如下,其中 x…...

LeetCode1004.最大连续1的个数
题目链接:1004. 最大连续1的个数 III - 力扣(LeetCode) 1.常规解法(会超时) 遍历数组,当元素是1时个数加一,当元素是0时且已有的0的个数不超过题目限制时,个数加一,若上…...

Parallels Desktop20虚拟机软件能让你在Mac上无缝运行Windows
Code 生成器:Parallels Desktop 20最新版本虚拟机的奇妙世界 🌟【轻松跨越操作系统界限】🌟 你是否常常感到在Mac和Windows之间切换太麻烦?Parallels Desktop 20最新版,让你不再为跨系统操作而烦恼。这款虚拟机软件能让…...

Golang | Leetcode Golang题解之第476题数字的补数
题目: 题解: func findComplement(num int) int {highBit : 0for i : 1; i < 30; i {if num < 1<<i {break}highBit i}mask : 1<<(highBit1) - 1return num ^ mask }...

Spring 实现 3 种异步流式接口,干掉接口超时烦恼
大家好,我是小富~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...