原文:http://blog.csdn.net/cywosp/article/details/8767327
一、UNIX写盘操作模型。
1. 传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写(delayed write)(Bach [1986]第3章详细讨论了缓冲区高速缓存)。
2. 延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓冲区高速缓存中内容的一致性,UNIX系统提供了sync、fsync和fdatasync三个函数。
- sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束, 通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数。这就保证了定期冲洗内核的块缓冲区。命令sync(1)也调用sync函数。
- fsync函数只对由文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。fsync可用于数据库这样的应用程序,这种应用程序需要确保将修改过的块立即写到磁盘上。
- fdatasync函数类似于fsync,但它只影响文件的数据部分。而除数据外,fsync还会同步更新文件的属性。
二、sync、fsync,fdatasync详细分析
对于提供事务支持的数据库,在事务提交时,都要确保事务日志(包含该事务所有的修改操作以及一个提交记录)完全写到硬盘上,才认定事务提交成功并返回给应用层。
一个简单的问题:在*nix操作系统上,怎样保证对文件的更新内容成功持久化到硬盘?
1. write不够,需要fsync
#include <unistd.h> 2 int fsync(int fd);
1 #incude <sys/mman.h> 2 int msync(void *addr, size_t length, int flags)
msync需要指定同步的地址区间,如此细粒度的控制似乎比fsync更加高效(因为应用程序通常知道自己的脏页位置),但实际上(Linux)kernel中有着十分高效的数据结构,能够很快地找出文件的脏页,使得fsync只会同步文件的修改内容。
2. fsync的性能问题,与fdatasync
"Unfortunately fsync() will always initialize two write operations : one for the newly written data and another one in order to update the modification time stored in the inode. If the modification time is not a part of the transaction concept fdatasync() can be used to avoid unnecessary inode disk write operations."
多余的一次IO操作,有多么昂贵呢?根据Wikipedia的数据,当前硬盘驱动的平均寻道时间(Average seek time)大约是3~15ms,7200RPM硬盘的平均旋转延迟(Average rotational latency)大约为4ms,因此一次IO操作的耗时大约为10ms左右。这个数字意味着什么?下文还会提到。
Posix同样定义了fdatasync,放宽了同步的语义以提高性能:
1 #include <unistd.h> 2 int fdatasync(int fd);
"fdatasync does not flush modified metadata unless that metadata is needed in order to allow a subsequent data retrieval to be corretly handled."
3. 使用fdatasync优化日志同步
2.每次log文件创建时,先写文件的最后1个page,将log文件扩展为10MB大小
3.向log文件中追加记录时,由于文件的尺寸不发生变化,使用fdatasync可以大大优化写log的效率
4.如果一个log文件写满了,则新建一个log文件,也只有一次同步metadata的开销
接下来谈谈flush dirty page,也就是前面说的同步写(没写完的话阻塞后面,直到写完才返回)。为什么是刷脏页?脏页表示缓存中的页(一般也就是内存中)也物理设备上的页处于不一致,不一致是由于在内存中被修改。所以为了使内存中的修改持久化到物理磁盘上我们需要将其从内存中flush到物理磁盘上。根据我的理解,一般来说缓存分成这几种:1>应用程序自己带了缓存,比如InnoDB的buffer pool;2>os层面上的缓存 ;3>磁盘设备自己的缓存,比如raid卡一般都管理着自己的缓存;4>磁盘本身或许会有一点点缓存(这个不确定,自己猜想的,这个即使有估计也是极小的)。好了,那么大部分的时候我们说的flush dirty page都是指从应用程序的缓存->os的缓存->物理设备,如果物理设备没有缓存的话,此时也就相当于持久化成功,但是像磁盘做了raid,raid卡有缓存的话,实际上还没真正持久化成功,因为此时还只到了raid卡的缓存,没到物理设备,但是由于raid卡一般都带有备用电池,所以即使此时断电也不会造成数据丢失。
刚才说了很多时候应用自己也有缓存机制,那么你是否想过此时与os的缓存有重复呢?答案是:会的。刚才说了我是通过研究MySQL的一个参数innodb_flush_method注意这些的,innodb_flush_method表示flush策略,MySQL提供了fdatasync/O_DSYNC/O_DIRECT这三个选项,默认是fdatasync(详情可参看博文)我这里主要说明为什么会提供选项:O_DIRECT。这个选项告诉os,InnoDB在读写数据的时候都不经过os的缓存,因为刚才说过InnoDB会维护自己的缓存buffer pool,如果还使用os的缓存那么两者就会有一定的重复。在前面参考的文章里面说O_DIRECT对大量随即读写有效率提升,顺序读写则会下降。所以根据自己的需求来定,不过如果你的MySQL用在是OLTP上,基本上选择O_DIRECT没错。
三、dirty page解释:
由于页高速缓存的缓存作用,写操作实际上会被延迟,当页高速缓存中的数据比后台存储的数据更新时,该数据被称为脏数据。以下情况下脏页被写回磁盘:
1)当空闲内存低于一个特定的阈值时
2)当脏页在内存中驻留时间超过一个特定的阈值时
写回操作是由一组可并行执行的内核线程完成,这类线程叫做pdflush线程。
相关推荐
在IT领域,尤其是在操作系统和文件系统管理中,`sync`、`fsync`和`fdatasync`是三个至关重要的函数,它们用于确保数据的安全写入和系统一致性。以下是这三个函数的详细说明: 1. **sync函数**: `sync`函数的作用...
紧接着,课程深入到同步内核缓冲区的知识,讲解了sync、fsync和fdatasync函数的使用,这些函数涉及到文件数据的持久化操作,保证了数据能够及时且正确地写入磁盘。这对于理解Linux的文件系统以及保证数据的一致性...
本文总结了C++面试题网络编程篇中的重要知识点,包括dup和dup2函数、lseek函数、sync、fsync和fdatasync函数、fcntl函数、exit和_exit函数、setjmp和longjmp函数、记录锁、守护进程编程规范等。 1. dup和dup2函数 ...
# 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
# 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
矢量边界,行政区域边界,精确到区县,可直接导入arcgis使用
# 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
内容概要:本文详细介绍了基于Maxwell仿真的16极18槽轴向磁通永磁电机模型的设计与性能分析。该电机功率为1500W,外径190mm,输出转矩3.7Nm。文章从引言开始,逐步探讨了Maxwell模型的特点及其在电机设计中的应用。接着,通过对磁场分布、电流控制和效率分析等方面的深入讨论,展示了电机的高性能和稳定性。最后,通过波形图解析,验证了电机的稳定输出特性,证明其适用于多种应用场景。 适合人群:从事电机设计、电磁仿真领域的工程师和技术人员,以及相关专业的学生。 使用场景及目标:① 学习和掌握轴向磁通永磁电机的设计方法;② 理解Maxwell仿真工具在电机设计中的应用;③ 分析并优化电机的性能参数,如磁场分布、电流控制和效率。 其他说明:该电机模型不仅提供了理论支持,还为实际工程应用提供了宝贵的参考依据。
# 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
内容概要:本文介绍了基于Matlab GUI界面的数字图像处理系统,涵盖了图像增强、图像分割、图像变换、图像复原和图像编码五大功能模块。通过Matlab的强大数据处理能力和图形用户界面,用户能够便捷地执行多种图像处理任务。每个功能模块都提供了具体的算法选择,如直方图均衡化用于图像增强,阈值分割和边缘检测用于图像分割,仿射变换用于图像变换,去噪和锐化算法用于图像复原,以及JPEG和PNG编码用于图像压缩。文中还给出了部分功能的简单代码示例,帮助用户理解和应用。 适合人群:对数字图像处理感兴趣的初学者和有一定编程基础的研究人员。 使用场景及目标:适用于需要进行图像处理实验、研究或开发的应用场景,旨在提升图像质量和效率,满足不同领域的图像处理需求。 其他说明:该系统不仅提供直观的操作界面,还支持自定义算法集成,便于进一步扩展和优化。
带升压转换器和扰动观测算法的MPPT MATLAB Simulink中采用摄动与观测(P&O)算法的升压转换器MPPT 带P&O的MPPT将通过调整升压转换器的占空比来跟踪最大功率点,以在不断变化的条件下最大化输出功率。
内容概要:本文详细介绍了双向Buck-Boost变换器的技术特性及其在不同应用场景中的工作模式。首先对双向Buck-Boost变换器进行了概述,指出其作为高效电源转换器的重要地位。接着,文章重点探讨了三种主要工作模式——恒功率模式、恒电流模式和稳压模式的具体运作机制及其应用场景。恒功率模式适用于电池供电系统,能动态调整输出以保持稳定功率;恒电流模式则用于需要精确电流控制的场合,如电机驱动和LED照明;而稳压模式主要用于维持特定电压输出,保障电力系统的稳定性。此外,文中还分析了变换器的设计和技术细节,强调了其宽电压范围、高效率和电磁兼容性等特点。最后,文章探讨了双向Buck-Boost变换器在电源供应和电动汽车等领域的具体应用。 适用人群:从事电源管理、电力电子、电动汽车等领域工作的工程师和技术人员。 使用场景及目标:帮助读者深入了解双向Buck-Boost变换器的工作原理和技术细节,掌握其在不同应用场景中的配置方法,从而优化实际项目中的电源管理和能量转换效率。 其他说明:本文不仅提供了理论分析,还结合了实际案例,有助于读者更好地理解和应用这项技术。
# 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
# 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
内容概要:本文介绍了一款基于STM32单片机的智能加湿器的设计与实现。该加湿器结合了蓝牙语音控制、超声波传感器、温湿度传感器和舵机,实现了语音指令控制、环境温湿度监测、人机交互和智能喷雾控制等功能。系统通过蓝牙模块接收语音指令,温湿度传感器实时监测环境数据,超声波传感器检测用户距离并提供语音提示,舵机则用于调整喷雾角度。硬件部分包括STM32F103单片机、HC-05蓝牙模块、DHT11温湿度传感器、HC-SR04超声波传感器、SG90舵机、LCD显示屏和蜂鸣器。软件部分详细介绍了系统初始化、各模块功能设计及调试过程。最终测试表明该设计在功能、性能和可靠性方面表现出色,具有较高的市场价值和应用前景。 适合人群:对嵌入式系统和智能家居感兴趣的电子工程专业学生、硬件开发者及科研人员。 使用场景及目标:①适用于家庭、办公室等场景,提升室内环境舒适度;②通过语音控制、温湿度监测和智能喷雾等功能,实现便捷、高效的加湿体验;③为后续智能家居产品研发提供参考和技术支持。 其他说明:论文附有详细的C++源代码,可供读者深入研究和实际操作。未来可通过加入更多传感器(如空气质量传感器)和Wi-Fi模块,进一步扩展功能和提升用户体验。
内容概要:本文介绍了Python爬虫与JSON的基础知识及其结合应用。首先讲述了Python爬虫的概念、优势以及工作流程,包括发起请求、获取响应内容、解析内容和保存数据四个主要步骤。接着阐述了JSON的定义、语法结构及其在数据交互中的重要性,并详细讲解了Python内置json模块的使用方法。通过两个具体案例,演示了如何利用Python爬虫抓取网站数据并以JSON格式保存,以及如何从JSON数据中提取特定信息。最后讨论了应对反爬虫机制的方法和注意事项,强调了数据合法性和道德规范的重要性。 适合人群:对Python爬虫和JSON感兴趣,有一定编程基础的学习者,尤其是希望从事数据抓取、数据分析工作的技术人员。 使用场景及目标:①帮助读者理解Python爬虫的工作原理,掌握基本的爬虫技术和库的使用;②学会处理JSON格式的数据,包括解析、转换和保存;③了解如何应对常见的反爬虫机制,确保爬虫程序稳定运行;④培养数据合法性和道德意识,确保爬虫行为符合法律法规。 阅读建议:本文内容丰富,涵盖了从基础到进阶的知识点。建议读者在学习过程中,不仅要理解理论知识,还要动手实践,尝试编写简单的爬虫程序,逐步掌握Python爬虫与JSON的结合应用。同时,关注行业动态和技术发展,不断提升自己的技术水平。
内容概要:本文介绍了一种针对多目标点移动机器人的路径规划方法,该方法将改进后的A*算法与模拟退火算法相结合,用于解决室内环境下的旅行商问题。具体来说,改进A*算法负责计算各目标点间最短路径并确保路径符合实际行走规则(如仅限水平垂直移动),而模拟退火算法则用来确定最佳访问顺序。此外,文中还详细描述了如何处理路径中的特殊状况,如转弯处的处理以及避免与其他物体发生碰撞的方法。通过这种方式,不仅提高了路径规划效率,而且使得机器人能够更加平稳地完成任务。 适用人群:对机器人路径规划感兴趣的科研工作者、工程师和技术爱好者。 使用场景及目标:适用于需要精确路径规划的应用场合,特别是涉及多站点访问的任务,如办公楼内的送餐服务。主要目的是提高工作效率,减少因路径选择不当造成的延误或事故。 其他说明:文中提供了具体的算法实现细节,包括Python代码片段,有助于读者理解和复现相关技术。同时强调了实际应用中的注意事项,如考虑物理空间限制和动态环境变化等因素的影响。
内容概要:本文详细介绍了如何使用LSTM(长短期记忆)神经网络进行光功率预测。首先解释了LSTM的基本概念及其在处理序列数据中的优势,接着讨论了影响光伏发电的各种因素,如天气状况、季节变化、时间点和地理位置。然后,文章逐步讲解了构建LSTM光功率预测模型的具体步骤,包括数据预处理、模型构建、训练和预测。最后,通过一个实际案例展示了如何使用Python代码实现96点光伏发电功率的预测,并展示了预测结果的可视化图表。 适合人群:对机器学习和光伏能源感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于希望深入了解LSTM在光功率预测中的应用,掌握从数据准备到模型部署完整流程的人群。目标是提高光功率预测的准确性,从而优化电力系统的稳定性和效率。 阅读建议:读者可以通过跟随文中提供的代码示例,动手实践LSTM模型的搭建和训练,同时关注各影响因素对预测效果的作用机制。
内容概要:本文介绍了基于YOLOv5的布匹缺陷检测方法,强调了布匹质量检测在制造业中的重要性。YOLOv5作为一种高效的目标检测算法,在布匹缺陷检测方面表现出色。文中详细解析了YOLOv5的源码实现,包括模型初始化、图像加载与检测的具体步骤。同时,还讨论了构建高质量数据集的方法及其在模型训练中的作用。最后,阐述了该技术的实际应用场景,如自动化生产线中的实时检测,提高了生产效率和产品质量,减少了人工成本和错误率。 适合人群:从事计算机视觉、深度学习研究的技术人员,尤其是关注工业质检领域的开发者。 使用场景及目标:适用于希望利用深度学习提升布匹质量检测精度的企业和技术团队,旨在提高生产效率、降低人工成本和减少错误率。 其他说明:本文提供了完整的源码和数据集资源,便于读者快速上手实践,深入理解YOLOv5的工作原理及其在布匹缺陷检测中的具体应用。