【银河麒麟高级服务器操作系统】有关dd及cp测试差异的现象分析详解

news2025/3/1 16:27:14

了解更多银河麒麟操作系统全新产品,请点击访问

麒麟软件产品专区:https://product.kylinos.cn

开发者专区:https://developer.kylinos.cn

文档中心:https://documentkylinos.cn


dd现象

使用银河麒麟高级服务器操作系统执行两次dd用例后,表现不一致:

命令用例:/usr/bin/time dd if=/dev/zero of=/home/d.bin bs=2M count=4096

结果如图:

可以发现,在第二次执行dd时,速率只有412MB/S

现象猜测分析

基于上述的现象,猜测第一次dd没有等待数据完全落盘就结束了;而第二次dd是等待数据落盘之后才结束。

可以做如下复现和测试:

系统版本:

  1. Kernel:
  2. 4.19.90-89.11.v2401.ky10.x86_64
  3. Build:
  4. Kylin Linux Advanced Server
  5. release V10 SP3 2403/(Halberd)-x86_64-Build20/20240426

测试步骤:

执行:

  1. /usr/bin/time dd if=/dev/zero of=/home/d.bin bs=2M count=4096

再次执行:

  1. /usr/bin/time dd if=/dev/zero of=/home/d.bin bs=2M count=4096

可复现这个结果:

图1

分析和实验

删除d.bin后rm -rf d.bin,执行:

  1. strace -ttt -T -o strace_output_0.txt dd if=/dev/zero of=/home/d.bin bs=2M count=4096
  2. strace -ttt -T -o strace_output_1.txt dd if=/dev/zero of=/home/d.bin bs=2M count=4096

将生成两次对dd命令的系统调用报告,分析这两个output报告文件,对比close操作时,可以发现,第一次的dd,close耗时短,第二次的dd,close耗时更长

图2 strace系统调用对比

左边是第一次,close操作用不到1秒;

右边是第二次,close操作用了6秒,对比图1结果,第二次与第一次时间差接近6秒。

测试说明这个close()系统调用操作是导致第二次dd慢的原因。问题要从close调用的方向去分析。

根因分析

dd if=/dev/zero of=4G bs=1M count=4096在执行时,会以O_WRONLY|O_CREAT|O_TRUNC的方式打开文件,首次执行时,文件不存在则创建;

第二次执行时O_TRUNC就会发挥作用了,它会先把文件长度给TRUNC到0,然后再写数据;(这是dd程序本身执行的逻辑决定的)

而xfs文件系统,为了数据完整性,对这个这种情况做了加强——即:再检测到这种情况下,会在文件close时触发数据下刷,而且是同步的,就是导致dd性能降低的原因。

  1. 第一次运行时,由于目标文件/home/d.bin不存在,属于纯粹的内存操作,没有实际的磁盘IO开销。
  2. 第二次运行时,由于目标文件已存在且被写入了数据,而需要/dev/zero真实读取数据,并将数据写入磁盘文件。这就引入了额外的磁盘IO操作,成为了新的性能瓶颈。
  3. cpu占用率的差异就是由于落盘操作造成的,第一次dd时,都是操作的内存所以cpu占用率高;
  4. 第二次dd由于数据落盘会有IO等待,cpu占用率就会降下来。

验证猜测

使用watch监测页内存回写到硬盘

使用两个终端,并进行测试与观测,第一次dd

  1. rm -rf d.bin
  2. echo 3 > /proc/sys/vm/drop_caches
  3. time dd if=/dev/zero of=/home/d.bin bs=2M count=4096
  1. watch -n 1 cat /proc/meminfo

图三 第一次dd 的数据回写观测

第二次dd

  1. echo 3 > /proc/sys/vm/drop_caches
  2. time dd if=/dev/zero of=/home/d.bin bs=2M count=4096
  1. watch -n 1 cat /proc/meminfo

图4 第二次dd的数据回写观测

可以发现,第一次dd并没有writeback回写,即:没有从页内存往硬盘落数据,通过ls看到的d.bin的文件数据,是在内存中,只是因为有这个“机制”存在,让用户感觉这个数据落盘了;

第二次dd,由于出现了脏页(因为d.bin存在导致缓存数据不同),内核进行了数据落盘的操作,通过watch命令,观测到了在dd过程中,writeback就有数据流量。

使用sar观测I/O

  1. time dd if=/dev/zero of=/home/d.bin bs=2M count=4096
  1. sar -d 1

第一次dd的情况

图5 第一次dd的I/O情况

第二次dd的情况

图6 第二次dd的I/O情况

可以看到,第二次的磁盘I/O操作比第一次dd多很多,说明有很多I/O落盘的操作,佐证页缓存机制在工作。

如何让dd观测结果稳定?

优化dd测试方法

既然dd的运行逻辑决定了最后观测的结果,那么可以通过指定一些参数,来更准确的进行测试:

通过添加ofag=direct参数,不走系统缓存

测试命令和观测结果如下:

  1. [root@localhost home]# rm -rf d.bin
  2. [root@localhost home]# time dd if=/dev/zero of=/home/d.bin bs=2M count=4096 oflag=direct
  3. 记录了4096+0 的读入
  4. 记录了4096+0 的写出
  5. 8589934592字节(8.6 GB,8.0 GiB)已复制,11.2041 s,767 MB/s
  6. real0m11.205s
  7. user0m0.003s
  8. sys0m0.694s
  9. [root@localhost home]# time dd if=/dev/zero of=/home/d.bin bs=2M count=4096 oflag=direct
  10. 记录了4096+0 的读入
  11. 记录了4096+0 的写出
  12. 8589934592字节(8.6 GB,8.0 GiB)已复制,11.4382 s,751 MB/s
  13. real0m11.443s
  14. user0m0.000s
  15. sys0m0.700s
  16. [root@localhost home]#

图7 dd添加参数后

可以看到,在添加oflag=direct参数后,dd命令不管是第几次都稳定了;

通过观察页内存,可以发现,直接写时,数据落盘,没有通过脏页内存回写。

通过添加conv=notrunc方式,不截断输出文件

默认情况下,如果输出文件已经存在,dd命令会首先将其截断为0字节大小。然后再将输入数据写入该输出文件。

当指定conv=notrunc参数时,dd命令将保留输出文件已有的数据,而只是从输出文件的当前文件结尾处开始覆盖写入数据。

删除生成的d.bin文件

如果每次测试前,都删除d.bin文件,那么每次dd都是通过内存出来,速率也可以稳定

为什么FreeBSD的表现和Linux不同?

freebsd上使用zfs文件系统,而linux上使用了xfs文件系统,他们在数据下刷机制上也存在一些差异:

对于 XFS,代码中的 filemap_flush(VFS_I(ip)->i_mapping) 实际上是调用 VFS(虚拟文件系统)层的通用页高速缓存写入磁盘的操作。

具体来说,它会遍历给定映射(mapping)关联的所有脏页,将这些脏页写入对应的后备存储设备(通常是磁盘)。这个过程是同步执行的,即该函数直到所有脏页都被写入磁盘才会返回。

以上是XFS文件系统特有实现,而zfs实现不同,所以不存在同样的问题。

cp现象

在d6.bin存在的情况下,使用cp d.bin d6.bin进行拷贝,如果使用了truncate -s 0 d6.bin,会使拷贝速度急速上升的。为什么?

现象分析

cp a b慢

truncate -s 0 b; cp a b快

直接cp a b时对b文件打开是带O_TRUNC标志(d6.bin已存在),就会在close的时候进行同步下刷,速度就不会快;

而truncate -s 0 b; cp a b,cp对b的打开同样是带O_TRUNC标志的,但是由于在cp之前,执行了truncate的操作,根据xfs文件系统落盘的机制,在cp的时候O_TRUNC就不起作用了,也就是在close的时候不会进行同步下刷;=》内核会对同样的两次操作进行优化,避免做重复的工作。

xfs文件系统源码

先看紫色字的注释:

如果之前对该文件进行了截断操作,删除了旧的文件数据。我们希望在最后关闭该文件时,提前(early)将数据写出到磁盘。这个问题特别容易在以下情况发生:先截断文件,然后通过缓冲区写入(重写)数据(延迟分配delalloc),接着系统崩溃。我们在这里所做的,实际上是大大缩小了可能遇到这个问题的时间窗口。

所谓空文件问题,是指在截断、重写文件数据的过程中,如果系统崩溃,可能导致原有数据被删除,而新写入的数据还未持久化到磁盘,从而使文件内容变为空或不完整。

为了避免这种情况,XFS会在关闭经过截断和重写的文件时,主动提前将缓冲区数据刷新到磁盘。这样可以最大限度减小系统崩溃导致数据丢失的窗口期,从而提高数据完整性和一致性。

执行过程如下:

判断文件系统状态xfs_is_shutdown,执行以下操作:

a. 判断truncated状态:XFS_ITRUNCATED会把XFS_ITRUNCATED复位,返回true;如果flags里面没有XFS_ITRUNCATED置位,返回false

b. 如果上一步标志被清除(即之前发生了截断),调用 xfs_iflags_clear(XFS_IDIRTY_RELEASE) 清除 XFS_IDIRTY_RELEASE 标志。该标志表示需要在卸载时将延迟写入的元数据写入磁盘。

c. 如果上一步标志被清除,调用 filemap_flush(VFS_I(ip)->i_mapping) 将所有延迟的元数据写入磁盘。(数据下刷

所以手动执行truncate命令时,变量truncated=false,if(truncated)函数就不会执行,也就没有数据下刷的操作,观测结果“看上去”cp速度很快。

验证

这个情况同样可以用sar观测I/O被证实:

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

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

相关文章

【在Linux世界中追寻伟大的One Piece】自旋锁

目录 1 -> 概述 2 -> 原理 3 -> 优缺点及使用场景 3.1 -> 优点 3.2 -> 缺点 3.3 -> 使用场景 4 -> 纯软件自旋锁类似的原理实现 4.1 -> 结论 5 -> 样例代码 1 -> 概述 自旋锁是一种多线程同步机制,用于保护共享资源避免受并…

顺序表的使用,对数据的增删改查

主函数: 3.c #include "3.h"//头文件调用 SqlListptr sql_cerate()//创建顺序表函数 {SqlListptr ptr(SqlListptr)malloc(sizeof(SqlList));//在堆区申请连续的空间if(NULLptr){printf("创建失败\n");return NULL;//如果没有申请成功&#xff…

利用卷积神经网络进行手写数字的识别

数据集介绍 MNIST(Modified National Institute of Standards and Technology)数据集是一个广泛使用的手写数字识别数据集,常用于机器学习和计算机视觉领域中的分类任务。它包含了从0到9的手写数字样本,常用于训练和测试各种图像…

题解 - 取数排列

题目描述 取1到N共N个连续的数字(1≤N≤9),组成每位数不重复的所有可能的N位数,按从小到大的顺序进行编号。当输入一个编号M时,就能打印出与该编号对应的那个N位数。例如,当N=3时,可…

如何在 ASP.NET Core 3.1 应用程序中使用 Log4Net

介绍 日志记录是应用程序的核心。它对于调试和故障排除以及应用程序的流畅性非常重要。 借助日志记录,我们可以对本地系统进行端到端的可视性,而对于基于云的系统,我们只能提供一小部分可视性。您可以将日志写入磁盘或数据库中的文件&#xf…

监控易监测对象及指标之:宝兰德中间件JMX监控指标解读

监控易作为一款全面的IT监控软件,能够为企业提供深入、细致的监控服务,确保企业IT系统的稳定运行。在本文中,我们将详细解读监控易针对宝兰德中间件JMX的监控指标,以帮助用户更好地理解和应用这些监控数据。 监测指标概览&#x…

Ubuntu 安装 Samba Server

在 Mac 上如何能够与Ubuntu 服务器共享文件夹,需要在 Ubuntu 上安装 Samba 文件服务器。本文将介绍如何在 Ubuntu 上安装 Samba 服务器从而达到以下目的: Mac 与 Ubuntu 共享文件通过用户名密码访问 安装 Samba 服务 sudo apt install samba修改配置文…

数字化招聘系统如何帮助企业实现招聘效率翻倍提升?

众所周知,传统的招聘方式已经难以满足现代企业对人才的需求,而数字化招聘系统的出现,为企业提供了全新的解决方案。通过数字化招聘系统,企业可以自动化处理繁琐的招聘流程,快速筛选合适的候选人,从而大幅提…

C语言数组和字符串笔记

C语言数组和字符串笔记 1. 数组及其相关概念 1.1 为什么需要使用数组? 数组是一个有序的、类型相同的数据集合。这些数据被称为数组的元素。每个数组都有一个名字,数组名代表数组的起始地址。数组的元素通过索引或下标访问,索引从0开始。 …

u-boot移植、配置、编译学习笔记【刚开始就中止了】

教程视频地址 https://www.bilibili.com/video/BV1L24y187cK 【这个视频中途停更了…原因是实际中需要去改u-boot的情况比较少】 使用的u-boot的源码 视频中使用的是 u-boot-2017.03 学习到这里,暂停u-boot的移植、配置、编译学习,原因是经过与老师…

回归任务与分类任务应用及评价指标

能源系统中的回归任务与分类任务应用及评价指标 一、回归任务应用1.1 能源系统中的回归任务应用1.1.1 能源消耗预测1.1.2 负荷预测1.1.3 电池健康状态估计(SOH预测)1.1.4 太阳能发电量预测1.1.5 风能发电量预测 1.2 回归任务中的评价指标1.2.1 RMSE&…

【树莓派4B】MindSpore lite 部署demo

一个demo,mindspore lite 部署在树莓派4B ubuntu22.04中,为后续操作开个门! 环境 开发环境:wsl-ubuntu22.04分发版部署环境:树莓派4B,操作系统为ubuntu22.04mindspore lite版本:mindspore-li…

AI监控赋能健身馆与游泳馆全方位守护,提升安全效率

一、AI视频监控技术的崛起 随着人工智能技术的不断发展,AI视频监控正成为各行业保障安全、提升效率的关键工具。相比传统监控系统,AI技术赋予监控系统实时分析、智能识别和精准预警的能力,让“被动监视”转变为“主动防控”。 二、AI监控应用…

M|林中小屋

title: 林中小屋 The Cabin in the Woods time: 2024-12-13 周五 rating: 7 豆瓣: 7.6 上映时间: “2012” 类型: M恐怖 导演: 德鲁戈达德 Drew Goddard 主演: 克里斯汀康奈利 Kristen Connolly弗兰克朗茨 Fran Kranz 国家/地区: 美国 片长/分钟: 95分钟 M&#xff5…

Mysql中的sql语句怎么执行的?

1.连接MySQL 通过客户端使用TCP(数据传输协议)连接MySQL连接器,连接器接到请求后对它进行检验是否有权限,有就进行分配资源。(这个过程不能超过8小时) 2.成功连接(校验效验) 客户端发送sql语句&#xff…

流网络复习笔记

所以这里的19是118-019 <s , w> 1/3就是容量是3&#xff0c;流量是1 残留网络就是两个相对箭头上都是剩余对应方向还能同行的流量 所以s->w 3-1 2, w->s 1

Redis - 实战之 全局 ID 生成器 RedisIdWorker

概述 定义&#xff1a;一种分布式系统下用来生成全局唯一 ID 的工具 特点 唯一性&#xff0c;满足优惠券需要唯一的 ID 标识用于核销高可用&#xff0c;随时能够生成正确的 ID高性能&#xff0c;生成 ID 的速度很快递增性&#xff0c;生成的 ID 是逐渐变大的&#xff0c;有利于…

arXiv-2024 | VLM-GroNav: 基于物理对齐映射视觉语言模型的户外环境机器人导航

作者&#xff1a; Mohamed Elnoor, Kasun Weerakoon, Gershom Seneviratne, Ruiqi Xian, Tianrui Guan, Mohamed Khalid M Jaffar, Vignesh Rajagopal, and Dinesh Manocha单位&#xff1a;马里兰大学学院公园分校原文链接&#xff1a;VLM-GroNav: Robot Navigation Using Phys…

华为无线AC、AP模式与上线解析(Huawei Wireless AC, AP Mode and Online Analysis)

华为无线AC、AP模式与上线解析 为了实现fit 瘦AP的集中式管理&#xff0c;我们需要统一把局域网内的所有AP上线到AC&#xff0c;由AC做集中式管理部署。这里我们需要理解CAPWAP协议&#xff0c;该协议分为两种报文&#xff1a;1、管理报文 2、数据报文。管理报文实际在抓包过程…