-
linux中文件大于一个磁盘块大小时,系统怎么分配下一个磁盘块
2020-01-15 16:08:11ps:主要是想写一个模拟系统,但是对于磁盘分配知道的并不多,在网上没找到资料,不知道如何下手(可能是我搜索的方式不对,如果有一些资料链接的话欢迎丢过来)。希望有大佬可以指点一二。十分感谢! -
一行数据中的多个NULL字段值在磁盘上怎么存储?
2020-12-01 14:45:20这个所谓的NULL值列表,顾名思义,说的就是一行数据里可能有的字段值是NULL,比如有一个name字段,它是允许为NULL的,那么实际上在存储的时候,如果没给它赋值,它这个字段的值就是NULL。 那么假设这个字段的NULL值...1、为什么一行数据里的NULL值不能直接存储?
这个所谓的NULL值列表,顾名思义,说的就是一行数据里可能有的字段值是NULL,比如有一个name字段,它是允许为NULL的,那么实际上在存储的时候,如果没给它赋值,它这个字段的值就是NULL。
那么假设这个字段的NULL值我们在磁盘上存储的时候,就是按照“NULL”这么个字符串来存储,是不是很浪费存储空间?所以实际在磁盘上存储数据的时候,一行数据里的NULL值是肯定不会直接按照字符串的方式存放在磁盘上浪费空间的。
2、NULL值是以二进制bit位来存储的
对所有的NULL值,不通过字符串在磁盘上存储,而是通过二进制的bit位来存储,一行数据里假设有多个字段的值都是NULL,那么这多个字段的NULL,就会以bit位的形式存放在NULL值列表中。现在举个例子,假设有一张表,它的建表语句如下所示:
CREATE TABLE customer ( name VARCHAR(10) NOT NULL, address VARCHAR(20), gender CHAR(1), job VARCHAR(30), school VARCHAR(50) ) ROW_FORMAT=COMPACT;
上面这个表就是一个假想出来的客户表,里面有5个字段,分别为name、address、genderjob、school,就代表了客户的姓名、地址、性别、工作以及学校。其中有4个变长字段,还有一个定长字段,然后第一个name字段是声明了NOT NULL的,就是不能为NULL,其他4个字段都可能是NULL的。
那么现在来假设这个表里有如下一行数据,现在来看看,它在磁盘上是怎么来存储的:“jack NULL m NULL xx_school”,它的5个字段里有两个字段都是NULL。
3、结合案例来思考一行数据的磁盘存储格式
上面那个表里的那行案例数据,在磁盘上应该如何存储呢,因为他有多个变长字段,还有多个字段允许为NULL。前面说了,一行数据在磁盘上的存储格式应该是下面这样的:
变长字段长度列表 NULL值列表 头信息 column1=value1 column2=value2 ... columnN=valueN
如果这个变长字段的值是NULL,就不用在变长字段长度列表里存放它的值长度了,所以在上面那行数据中,只有name和school两个变长字段是有值的,把它们的长度按照逆序放在变长字段长度列表中就可以了,如下所示:
0x09 0x04 NULL值列表 头信息 column1=value1 column2=value2 ... columnN=valueN
接着来看NULL值列表,这个NULL值列表是这样存放的,所有允许值为NULL的字段,注意,是允许值为NULL,不是说一定值就是NULL了,只要是允许为NULL的字段,在这里每个字段都有一个二进制bit位的值,如果bit值是1说明是NULL,如果bit值是0说明不是NULL。
比如上面4个字段都允许为NULL,每个人都会有一个bit位,这一行数据的值是“jack NULL m NULL xx_school”,然后其中2个字段是null,2个字段不是null,所以4个bit位应该是:1010。但是实际放在NULL值列表的时候,它是按逆序放的,所以在NULL值列表里,放的是:0101,整体这一行数据看着是下面这样的:
0x09 0x04 0101 头信息 column1=value1 column2=value2 ... columnN=valueN
另外就是实际NULL值列表存放的时候,不会说仅仅是4个bit位,一般起码是8个bit位的倍数,如果不足8个bit位就高位补0,所以实际存放看起来是如下的:
0x09 0x04 00000101 头信息 column1=value1 column2=value2 ... columnN=valueN
4、磁盘上的一行数据到底如何读取出来的?
看上面的磁盘数据存储格式:
0x09 0x04 00000101 头信息 column1=value1 column2=value2 ... columnN=valueN
首先必然要把变长字段长度列表和NULL值列表读取出来,通过综合分析一下,就知道有几个变长字段,哪几个变长字段是NULL,因为NULL值列表里谁是NULL谁不是NULL都一清二楚。此时就可以从变长字段长度列表中解析出来不为NULL的变长字段的值长度,然后也知道哪几个字段是NULL的,此时根据这些信息,就可以从实际的列值存储区域里,把每个字段的值读取出来了。
如果是变长字段的值,就按照值长度来读取,如果是NULL,就知道是个NULL,没有值存储,如果是定长字段,就按照定长长度来读取,这样就可以完美的把一行数据的值都读取出来了!
-
mac high sierra开机按option怎么只有一个磁盘_Mac系统版本低无法更新系统
2020-11-23 07:48:19玩机软件是一个“绿色、实用、免费”平台,我们致力于帮助更多用户掌握电脑知识、手机技巧、互联网知识,并推荐电脑和手机等各种优质工具,发布各种实用软件及安装教程。如果你喜欢本文,请点击右下角的在看,并分享...玩机软件是一个“绿色、实用、免费”平台,我们致力于帮助更多用户掌握电脑知识、手机技巧、互联网知识,并推荐电脑和手机等各种优质工具,发布各种实用软件及安装教程。如果你喜欢本文,请点击右下角的在看,并分享到朋友圈。
AppStore无法更新系统
方法一:通过 macOS 恢复功能重新安装【安装大概需要4-8个小时】
利用 macOS 恢复功能,您可以轻松重新安装 Mac 操作系统,即使您需要先抹掉启动磁盘也是如此。您只需连接到互联网即可。如果有可用的无线网络,则您可以从菜单栏的 Wi-Fi 菜单
中选取相应网络。macOS 恢复功能中也提供了这个菜单。
1. 通过 macOS 恢复功能启动
要通过 macOS 恢复功能启动,请开启 Mac 并立即按住键盘上的以下组合键之一。当您看到 Apple 标志、旋转的地球或其他启动屏幕时,请松开这些按键。
Command (⌘)-R
重新安装您的 Mac 上装有的最新 macOS(建议操作)
Option-⌘-R
升级到与您的 Mac 兼容的最新 macOS。
Shift-Option-⌘-R
重新安装 Mac 随附的 macOS 或与它最接近且仍在提供的版本。
系统可能会提示您输入密码,例如固件密码,或这台 Mac 的管理员用户的密码。请输入要求的密码以继续。
当您看到实用工具窗口时,即表示您已通过 macOS 恢复功能启动。
2. 确定是否要抹掉(格式化)您的磁盘
除非您要出售、折抵换购或赠送您的 Mac,或者遇到一个需要您抹掉磁盘的问题,否则您可能不需要抹掉磁盘。如果您在安装 macOS 之前需要抹掉磁盘,请从“实用工具”窗口中选择“磁盘工具”,然后点按“继续”。进一步了解何时以及如何抹掉。
3. 安装 macOS
在做好重新安装 macOS 的准备后,请从“实用工具”窗口中选取“重新安装 macOS”。然后,点按“继续”,并按照屏幕上的说明进行操作。系统将提示您选取一个作为安装目标的磁盘。
- 如果安装器要求解锁您的磁盘,请输入您在登录 Mac 时所使用的密码。
- 如果安装器无法识别您的磁盘,或者指出它无法安装到您的电脑或宗卷上,您可能需要先抹掉磁盘。
- 如果安装器适用的 macOS 版本与您预期的版本有所不同,请了解 macOS 恢复功能例外情况。
请不要将 Mac 置于睡眠状态或合上上盖,以便安装完成。在安装过程中,Mac 可能会多次重新启动并显示进度条,并且屏幕可能每次都处于空白状态并持续几分钟时间。如果您的 Mac 重新启动并进入设置助理,但您要出售、折抵换购或赠送这台 Mac,请按下 Command-Q 以退出助理而不完成设置。然后点按“关机”。当新的所有者启动这台 Mac 时,他们可以使用自己的信息来完成设置。
macOS 恢复功能例外情况
在某些情况下,macOS 恢复功能提供的 macOS 版本可能有所不同:- 如果这台 Mac 上从未安装过 macOS Sierra 10.12.4 或更高版本,则 Option-Command-R 会安装您的 Mac 随附的 macOS 或与它最接近且仍在提供的版本。此时,Shift-Option-Command-R 不可用。
- 如果您抹掉了整个磁盘而不是仅抹掉磁盘上的启动宗卷,则 macOS 恢复功能可能只提供您的 Mac 随附的 macOS 或与它最接近且仍在提供的版本。您可以在之后升级到更高版本。
- 如果您的 Mac 配备 Apple T2 安全芯片,并且您从未安装过 macOS 更新,则 Option-Command-R 会安装您的 Mac 上曾安装过的最新版 macOS。
- 如果您在近期的维修过程中更换了 Mac 的主板,则 macOS 恢复功能可能只提供与您的 Mac 兼容的最新版 macOS。
4、打开 “应用程序→实用工具→终端”,将下面的一段命令复制并粘贴进去:如要制作 macOS Mojave 启动盘,U盘名称要改成「Mojave」(必须与下面命令对应),然后拷贝这段命令:sudo /Applications/Install\ macOS\ Mojave.app/Contents/Resources/createinstallmedia --volume /Volumes/Mojave /Applications/Install\ macOS\ Mojave.app --nointeraction
如要制作 macOS High Sierra 启动盘,U盘名称要改成「HighSierra」(要与下面命令对应),拷贝这段命令:sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/HighSierra --applicationpath /Applications/Install\ macOS\ High\ Sierra.app --nointeraction
如要制作「旧版本的 macOS Sierra」,U盘名称改成「Sierra」(要与下面命令对应),拷贝这段命令:sudo /Applications/Install\ macOS\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/Sierra --applicationpath /Applications/Install\ macOS\ Sierra.app --nointeraction
5、回车并执行该命令,这时会提示让你输入管理员密码,便会开始制作过程了:
6、如上图,这时系统已经在制作中了,请耐心等待,出现下图字样即表示大功告成了!win系统制作:上期发过制作U盘教程,回复关键字获取官网链接。于很多使用苹果电脑的读者在安装windows的时候出现了各种问题,但是又将苹果自带的苹果系统删除导致不仅没装成win反而连自带的苹果mac系统也没了,如果要恢复系统又要漫长的等待,这样买回来的苹果电脑就成了摆设,今天小编教读者在windows7下制作苹果mac os x 10.10Yosemiteu盘启动盘,有了u盘启动盘后安装苹果系统只需要在一小时内就能完成。二、win7下制作mac os x启动U盘步骤如下1、下载TransMac启动盘制作工具,并安装好;2、插入准备好的U盘,U盘数据要转移,打开TransMac,右键U盘选择“Format Disk for Mac”,将U盘格式化成Mac下的格式(链接带有操作流程)使用启动管理器
在您使用启动管理器选择启动磁盘时,您的 Mac 将从相应磁盘启动一次,然后继续使用在“启动磁盘”偏好设置中选择的磁盘。- 将 Mac 开机或重新启动后,立即按住 Option (Alt) 键。
- 当您看到“启动管理器”窗口时,松开 Option 键。如果您的 Mac 受固件密码保护,则您可以在系统要求您输入密码时松开这个按键。
- 选择启动磁盘,然后点按这个磁盘图标下的箭头或按下 Return 键。 选择系统盘按回车
抹掉启动磁盘
- 从 macOS 恢复功能启动。
- 从 macOS 恢复功能的“实用工具”窗口中,选择“磁盘工具”。然后,点按“继续”。
- 确保“磁盘工具”中的边栏显示启动磁盘的名称。除非您另外重新命名,否则代表启动磁盘的宗卷是 Macintosh HD。没看到它的名称?
- 查找具有相同名称的“Data”宗卷,例如“Macintosh HD - Data”。如果您有这样的宗卷,请选择它。然后,从菜单栏中选取“编辑”>“删除 APFS 宗卷”,或者点按“磁盘工具”工具栏中的删除宗卷按钮 (–)。
当收到提示要求确认时,点按“删除”按钮。请勿点按“删除宗卷组”。执行相同的操作以删除启动磁盘上可能存在的其他宗卷,名为“Macintosh HD”的宗卷除外。
- 删除所有数据宗卷后,在边栏中选择“Macintosh HD”。
- 点按“抹掉”按钮或标签页,然后填写以下各项:
- 名称:输入您希望宗卷在被抹掉后使用的名称,例如“Macintosh HD”。
- 格式:选取“APFS”或“Mac OS 扩展(日志式)”作为 Mac 宗卷的格式。默认情况下,“磁盘工具”会显示推荐的 Mac 格式。
完成后,退出“磁盘工具”以回到“实用工具”窗口。 如果您希望 Mac 能够再次从此宗卷启动,请从“实用工具”窗口中选取“重新安装 macOS”,然后按照屏幕上的说明操作,在宗卷上重新安装 macOS。如不重新安装 macOS,Mac 启动时可能会出现一个闪烁的问号 (?)。如何更改磁盘的分区图(方案)
在某些情况下,您可能需要在抹掉时更改分区图(方案)。如果您遵循的说明要求选取方案,则“磁盘工具”中的操作步骤与上述步骤不同。- 打开“磁盘工具”后,从菜单栏中选取“显示”>“显示所有设备”。
- 现在,边栏不仅显示宗卷,还显示包含这些宗卷的磁盘(设备)。在下面的示例中,APPLE SSD 是磁盘,Container disk1 是这个磁盘上的容器,而 Macintosh HD 是这个容器中的宗卷。(只有 APFS 格式的磁盘才包含容器。)
- 选择要抹掉的磁盘,例如 Apple SSD。
- 查看窗口右侧显示的信息,找到当前正在使用的分区图:
- GUID 分区图适用于 Mac 磁盘。
- 主引导记录适用于与 PC 或“启动转换”一起使用的外置驱动器。
- 名称:输入您希望磁盘在被抹掉后使用的名称,例如“Apple SSD”。
- 格式:要格式化为 Mac 磁盘,请选取“APFS”或“Mac OS 扩展(日志式)”。默认情况下,“磁盘工具”会显示兼容的格式。
- 方案:选取适当的分区图方案。
格式是:MAC OS 扩展(日志式),方案选:GUID
3.点击左上角第一个红色按钮,关了这个磁盘工具
4.把电脑右上角的无线关了,有网线也拨出来。点屏幕顶部菜单栏,右边的{实用工具}找到终端
在终端中直接输入 date 122014102017.30【10.14.6系统】,英文和数字之间有空格,输完回车。
5.点菜单上面的终端两个字,退出终端。
6.直接点 安装macOS(第二项),点继续。
下载TransMac启动盘制作工具及官网系统链接,点击【U盘安装mac系统】 回复关键词获取!!!
还请小伙伴们多多支持
,顺手给作者加个鸡腿
,非常感谢
-
磁盘0没有初始化_多个磁盘怎么组成阵列?磁盘阵列模式怎么变更?这里有你要的答案...
2021-01-06 12:50:32作为一名影音爱好者,经常拍摄和处理高清视频、照片是常有的事,因此也常常会遇到一件很头痛的事情。那就是海量视频的转移、处理和存储问题,一般我们单机处理是没有太大的问题,但是如果要进行视频剪辑渲染、然后将...作为一名影音爱好者,经常拍摄和处理高清视频、照片是常有的事,因此也常常会遇到一件很头痛的事情。那就是海量视频的转移、处理和存储问题,一般我们单机处理是没有太大的问题,但是如果要进行视频剪辑渲染、然后将视频进行转移到其他媒介时,这时候就很头大了。
虽然现在电脑上都配置有高速端口,如苹果的闪电接口,目前已经发展到了闪电3(Thunderbolt3 )了,其理论速度技术比USB3.0快8倍(达到40Gbps),但是光有接口的支持是不够的,我们还得有相应的硬盘的足够大的存储空间来匹配,这时候我们就需要到磁盘阵列了。
所谓磁盘阵列就是使用将多个硬盘组合成一个容量较大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能,不同的阵列模式能够带来不同的可靠性、空间使用率和传输速度的差异体验。
铁威马(TERRA MASTER)D2-330 双盘位雷电3磁盘阵列盒(以下简称:铁威马D2-330磁盘阵列),作为一款定位影视非编存储柜,希望解决的就是海量高清视频的处理和存储问题,利用雷电接口的高速和磁盘阵列的高速和安全,带来快如闪电般的视频工作流。
磁盘阵列采用银色铝合金外壳,兼顾了轻巧与安全,有效保护硬盘和数据物理安全。
左侧是两个硬盘工作指示灯和电源指示灯,最下方是电源开关。
铁威马D2-330磁盘阵列拥有两个硬件位,可最大支持总28TB硬盘(单个最多14TB)。可选用3.5寸 SATA硬盘、2.5寸 SATA硬盘或者是2.5寸 SSD硬盘。
227mm*119mm*133mm的尺寸,1.46g净重,配合上方的手柄使用,还是非常方便的,这样外带录影、拷片或者是送样片也都比较轻松。
为了保证硬盘的长时间有效高速工作,铁威马D2-330磁盘阵列配置了一个80mm*80mm的大风扇,风扇是温度控制,自动调节的。
右侧从上到下分别是:12V直流供电电源输入口(自带电源转换器)、DP1.2接口、两个闪电3接口。
铁威马D2-330磁盘阵列支持4种阵列模式,RAID0、RAID1、SINGLE和JBOD模式,RAID0速度最快,但是无备份。RAID1则是兼顾和速度与安全,但是容易只有一半。SINGLE模式两个硬盘独立使用模式,而JBOD只是将硬盘简单地组成了一个大硬盘。
用户可以依据自己的需要来调整不同的阵列工作模式,调整后,我们需要通过RESET来复位硬盘,并且初始化后才能正常使用磁盘阵列。
所有的调整、安装过程中要使用到的小工具,厂家都附送好了。
【安装】
向外抬起硬盘安装盒下方的开关即可取下安装盒
这里我们选用两块同样规格的西数4TB SATA 3.5英寸硬盘,西部作为全球知名的硬盘厂商,也是历史最悠久的硬盘厂商之一,其品质和性能也是非常有保证的,这对于我们后期视频处理打下硬基础,毕竟好马配好鞍才能跑得快。
使用附送的螺丝刀和螺丝将硬盘安装好在硬盘安装盒上。
将硬盘嵌入到磁盘阵列中,这里要注意好方向。
安装过程还是非常简单的,其杠杆式的设计,既省力又能保证硬盘安装的牢固可靠,这点对于磁盘阵列的移动性保障非常重要。
安装好后,为了方便识别,我们还可以给硬盘贴上标签。
使用闪电3的连接线将硬盘和电脑连接好,再将电源连接好,开机。
【测试】
我们首先进行RAID0模式的测试,将模式调整到RAID0,长按RESET进行硬盘的复位。(非切换模式不要随意复位,每次切换模式都要硬盘初始化,数据就没有了)
此时电脑会提示我们硬盘没有初始化,我们点击初始化,进入上面的界面,这里我们可以看到在RAID0下,两个硬盘是组成了一个高速硬盘,完整存储空间为8TB。我们通过抹掉来进行硬盘格式化。
格式化由于没有设定名字,因此硬盘名叫未命名,对其使用blackmagic disk speed test进行读写测速。
高速模式下西数SATA硬盘的写入速度327.5MB/s,读取速度为339.8MB/s,支持的各种高清格式视频格式的支持和处理速率还是不错的。如果使用SSD固态硬盘的话,相信结果会更出色。
再切换到SINGLE模式,我们可以看到两个独立的硬盘,都是4TB,这时我们测试其中一个硬盘的读写性能,可以看到读和写速度分别在179.1MB/s和174.9MB/s。
个人一般日常使用高速在RAID1上,保证速度的同时也让数据更加安全。实际影片剪辑处理也非常流畅,体验不错。
【总结】
铁威马(TERRA MASTER)D2-330 双盘位雷电3磁盘阵列盒,作为一款定位影视非编存储柜,能够非常高效快速地帮我们解决海量高清视频的处理和存储问题,为我们带来非凡地高速体验。多种阵列模式可选,方便用户使用。雷电3接口带来的高速传输,配合西数或者相关优秀的SATA或SSD硬盘,让我们的工作更有效率,更加安全。
-
ctf up怎么写 write_write文件一个字节后何时发起写磁盘IO?
2021-01-09 11:42:31在前文《read文件一个字节实际会发生多大的磁盘IO?》写完之后,本来想着偷个懒,只通过读操作来让大家了解下Linux IO栈的各个模块就行了。但很多同学表示再让我写一篇关于写操作的。既然不少同学都有这个需求,那我...在前文《read文件一个字节实际会发生多大的磁盘IO?》写完之后,本来想着偷个懒,只通过读操作来让大家了解下Linux IO栈的各个模块就行了。但很多同学表示再让我写一篇关于写操作的。既然不少同学都有这个需求,那我就写一下吧。
Linux内核真的是太复杂了,源代码的行数已经从1.0版本时的几万行,到现在已经是千万行的一个庞然大物了。直接钻进去的话,很容易在各种眼花缭乱的各种调用中迷失了自己,再也钻不出来了。我分享给大家一个我在琢磨内核的方法。一般我自己先想一个自己很想搞清楚的问题。不管在代码里咋跳来跳去,时刻都要记得自己的问题,无关的部分尽量少去发散,只要把自己的问题搞清楚了就行了。
现在我想搞明白的问题是,在最常用的方式下,不开O_DIRECT、不开O_SYNC(写文件的方法有很多,有sync模式、direct模式、mmap内存映射模式),write是怎么写的。c的代码示例如下:
#include <fcntl.h> int main() { char c = 'a'; int out; out = open("out.txt", O_WRONLY | O_CREAT | O_TRUNC); write(out,&c,1); ... }
进一步细化我的问题,我们对打开的文件写入一个字节后
- write函数在内核里是怎么执行的?
- 数据在什么时机真正能写入到磁盘上?
我们在讨论的过程中不可避免地要涉及到内核代码,我使用的内核版本是3.10.1。如果有需要,你可以到这里来下载。https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/。
write函数实现剖析
我花了不短的时候跟踪write写到ext4文件系统时的各种调用和返回,大致理出来了一个交互图。当然为了突出重点,我抛弃了不少细节,比如DIRECT IO、ext4日志记录啥的都没有体现出来,只抽取出来了一些我认为关键的调用。
图1 write函数内部实现 在上面的流程图里,所有的写操作最终到哪儿了呢?在最后面的_block_commit_write中,只是make dirty。然后大部分情况下你的函数调用就返回了(稍后再说balancedirty_pages_ratelimited)。数据现在还在内存中的PageCache里,并没有真正写到硬盘。
为什么要这样实现,不直接写硬盘呢?原因就在于硬盘尤其是机械硬盘,性能是在是太慢了。一块服务器级别的万转盘,最坏随机访问平均延迟都是毫秒级别的,换算成IOPS只有100多不到200。设想一下,假如你的后端接口里每个用户来访问都需要一次随机磁盘IO,不管你多牛的服务器,每秒200的qps都将直接打爆你的硬盘,相信作为为百万/千万/过亿用户提供接口的你,这个是你绝对不能忍的。
Linux这么搞也是有副作用的,如果接下来服务器发生掉电,内存里东西全丢。所以Linux还有另外一个“补丁”-延迟写,帮我们缓解这个问题。注意下,我说的是缓解,并没有彻底解决。
再说下balance_dirty_pages_ratelimited,虽然绝大部分情况下,都是直接写到Page Cache里就返回了。但在一种情况下,用户进程必须得等待写入完成才可以返回,那就是对balance_dirty_pages_ratelimited的判断如果超出限制了。该函数判断当前脏页是否已经超过脏页上限dirty_bytes、dirty_ratio,超过了就必须得等待。这两个参数只有一个会生效,另外1个是0。拿dirty_ratio来说,如果设置的是30,就说明如果脏页比例超过内存的30%,则write函数调用就必须等待写入完成才能返回。可以在你的机器下的/proc/sys/vm/目录来查看这两个配置。
# cat /proc/sys/vm/dirty_bytes 0 # cat /proc/sys/vm/dirty_ratio 30
内核延迟写
内核是什么时候真正把数据写到硬盘中呢?为了快速摸清楚全貌,我想到的办法是用systemtap工具,找到内核写IO过程中的一个关键函数,然后在其中把函数调用堆栈打出来。查了半天资料以后,我决定用do_writepages这个函数。
#!/usr/bin/stap probe kernel.function("do_writepages") { printf("--------------------------------------------------------n"); print_backtrace(); printf("--------------------------------------------------------n"); }
systemtab跟踪以后,打印信息如下:
0xffffffff8118efe0 : do_writepages+0x0/0x40 [kernel] 0xffffffff8122d7d0 : __writeback_single_inode+0x40/0x220 [kernel] 0xffffffff8122e414 : writeback_sb_inodes+0x1c4/0x490 [kernel] 0xffffffff8122e77f : __writeback_inodes_wb+0x9f/0xd0 [kernel] 0xffffffff8122efb3 : wb_writeback+0x263/0x2f0 [kernel] 0xffffffff8122f35c : bdi_writeback_workfn+0x1cc/0x460 [kernel] 0xffffffff810a881a : process_one_work+0x17a/0x440 [kernel] 0xffffffff810a94e6 : worker_thread+0x126/0x3c0 [kernel] 0xffffffff810b098f : kthread+0xcf/0xe0 [kernel] 0xffffffff816b4f18 : ret_from_fork+0x58/0x90 [kernel]
从上面的输出我们可以看出,真正的写文件过程操作是由worker内核线程发出来的(和我们自己的应用程序进程没有半毛钱关系,此时我们的应用程序的write函数调用早就返回了)。这个worker线程写回是周期性执行的,它的周期取决于内核参数dirty_writeback_centisecs的设置,根据参数名也大概能看出来,它的单位是百分之一秒。
# cat /proc/sys/vm/dirty_writeback_centisecs 500
我查看到我的配置是500,就是说每5秒会周期性地来执行一遍。回顾我们的问题,我们最关心的问题的啥时候写入的,围绕这个思路不过多发散。于是沿着这个调用栈不断地跟踪,跳转,终于找到了下面的代码。如下代码里我们看到,如果是for_background模式,且
over_bground_thresh
判断成功,就会开始回写了。static long wb_writeback(struct bdi_writeback *wb, struct wb_writeback_work *work) { work->older_than_this = &oldest_jif; ... if (work->for_background && !over_bground_thresh(wb->bdi)) break; ... if (work->for_kupdate) { oldest_jif = jiffies - msecs_to_jiffies(dirty_expire_interval * 10); } else ... } static long wb_check_background_flush(struct bdi_writeback *wb) { if (over_bground_thresh(wb->bdi)) { ... return wb_writeback(wb, &work); } }
那么
over_bground_thresh
函数判断的是啥呢?其实就是判断当前的脏页是不是超过内核参数里dirty_background_ratio或dirty_background_bytes的配置,没超过的话就不写了(代码位于fs/fs-writeback.c:1440,限于篇幅我就不贴了)。这两个参数只有一个会真正生效,其中dirty_background_ratio配置的是比例、dirty_background_bytes配置的是字节。在我的机器上的这两个参数配置如下,表示脏页比例超过10%就开始回写。
# cat /proc/sys/vm/dirty_background_bytes 0 # cat /proc/sys/vm/dirty_background_ratio 10
那如果脏页一直都不超过这个比例怎么办呢,就不写了吗? 不是的。在上面的wb_writeback函数中我们看到了,如果是for_kupdate模式,会记录一个过期标记到work->older_than_this,再往后面的代码中把符合这个过期条件的页面也写回了。dirty_expire_interval这个变量是从哪儿来的呢? 在kernel/sysctl.c里,我们发现了蛛丝马迹。哦,原来它是来自/proc/sys/vm/dirty_expire_centisecs这个配置。
1158 { 1159 .procname = "dirty_expire_centisecs", 1160 .data = &dirty_expire_interval, 1161 .maxlen = sizeof(dirty_expire_interval), 1162 .mode = 0644, 1163 .proc_handler = proc_dointvec_minmax, 1164 .extra1 = &zero, 1165 },
在我的机器上,它的值是3000。单位是百分之一秒,所以就是脏页过了30秒就会被内核线程认为需要写回到磁盘了。
# cat /proc/sys/vm/dirty_expire_centisecs 3000
结论
我们demo代码中的写入,其实绝大部分情况都是写入到PageCache中就返回了,这时并没有真正写入磁盘。我们的数据会在如下三个时机下被真正发起写磁盘IO请求:
- 第一种情况,如果write系统调用时,如果发现PageCache中脏页占比太多,超过了dirty_ratio或dirty_bytes,write就必须等待了。
- 第二种情况,write写到PageCache就已经返回了。worker内核线程异步运行的时候,再次判断脏页占比,如果超过了dirty_background_ratio或dirty_background_bytes,也发起写回请求。
- 第三种情况,这时同样write调用已经返回了。worker内核线程异步运行的时候,虽然系统内脏页一直没有超过dirty_background_ratio或dirty_background_bytes,但是脏页在内存中呆的时间超过dirty_expire_centisecs了,也会发起会写。
如果对以上配置不满意,你可以自己通过修改/etc/sysctl.conf来调整,修改完了别忘了执行sysctl -p。
最后我们要认识到,这套write pagecache+回写的机制第一目标是性能,不是保证不丢失我们写入的数据的。如果这时候掉电,脏页时间未超过dirty_expire_centisecs的就真的丢了。如果你做的是和钱相关非常重要的业务,必须保证落盘完成才能返回,那么你就可能需要考虑使用fsync。
欢搜索微信公众号开发内功修炼!
-
root创建的文件夹其他用户无法传输文件怎么解决_ubuntu中实现多用户访问多个磁盘...
2021-01-25 01:22:011 当前设备的情况服务器上有四个磁盘, 一个500G的固态, 三个2T的机械。 目前的话系统是装在一个2T的机械盘上边, 导致其他用户无法访问其他盘的情况。 采用的解决方案是, 使外置硬盘开机自动挂载到root用户下,然后... -
磁盘不见了只剩一个c盘_电脑硬盘分区不见了怎么恢复数据?
2021-01-12 03:26:16电脑硬盘分区不见了怎么恢复数据?电脑硬盘分区不见了怎么办?丢失的分区和数据还能恢复吗?...根据用户需要,一块硬盘可以分成一个或多个分区,用于安装系统、存放个人数据等。电脑硬盘上的这些分区并不是... -
怎么在电脑上看磁盘分配单元的大小_电脑磁盘怎么分区?电脑磁盘分区指南
2020-11-18 06:33:19新电脑,新硬盘都是只有一个分区,所以有很多小伙伴在买下新电脑或者新硬盘时,不知道该不该分区,又该如何分区,这个事难倒了众多网友。不过从今天开始,这个问题不再是问题,小编这就来给大家讲一讲分区得的那些事... -
电脑怎么分盘win10_win10怎么分盘两个磁盘
2020-11-11 15:15:57展开全部给电脑硬盘进行格式化并2113且分区,一般分4个分区为5261好,尤4102其是MBR引导形式的硬盘,如果分区1653超过四个就得建立一个扩展分区,在扩展分区里再建立一个或者多个逻辑分区,比较麻烦,不推荐!... -
怎么格式化电脑_电脑怎么格式化磁盘?内存满了可以用这个
2020-11-16 09:59:18有时候我们的电脑磁盘因为存放的数据和资料太多满了,又不想一个一个的删除,这时候您就可以通过格式化的方法来快速释放磁盘空间了,下面来看看具体操作步骤。电脑怎么格式化磁盘1.小编这里以win7系统为例说明,双击... -
磁盘阵列raid5怎么做_服务器配置方案第一篇 - 磁盘阵列
2020-11-16 12:30:311、RAID0RAID0技术把多块(至少两块)物理硬盘设备通过软件或硬件的方式串联在一起,组成一个大的卷组,并将数据依次写入到各个物理硬盘中。这样,在最理想的情况下,硬盘设备的读写性能会提升数倍,但是若任... -
怎么在电脑上看磁盘分配单元的大小_电脑磁盘分区指南!一分钟就学会
2020-11-16 04:45:32新电脑,新硬盘都是只有一个分区,所以有很多小伙伴在买下新电脑或者新硬盘时,不知道该不该分区,又该如何分区,这个事难倒了众多网友。不过从今天开始,这个问题不再是问题,小编这就来给大家讲一讲分区得的那些事... -
win7磁盘清理_为什么要清理磁盘碎片,win7电脑怎么清理磁盘碎片
2020-10-23 09:07:27小强一键重装系统学习电脑技能,提升能力,优秀人士的聚集地。...二:win7电脑怎么清理磁盘碎片具体操作方法如下:1、打开计算机,右键单击一个盘符,选择属性选项,如图所示:2、切换到工具选项卡,并点击立即清... -
win备份linux磁盘_心得:怎么在MacBook中分多个区并直接使用win软件?
2020-11-28 14:50:47但很多Mac book用户通常在实际使用过程中会有下面这些多样的需求和烦恼:1、 在mac下安装双系统,一台电脑顶两台使用。但是每次使用不同系统都需要重启电脑,无法在macos中直接使用win软件。2、在mac里装虚拟机,... -
ipad分屏大小怎么调整_怎么调整磁盘分区的大小
2020-10-29 02:38:28一般情况下在装机时都将一个磁盘分成4个分区,有时候是系统分区C盘太小,数据盘太多或C盘太多,其它数据盘太小。甚至还有一个硬盘的所有容量都划分给系统盘使用。总之就是磁盘分区可能不合理,这时怎么解决呢?这时... -
怎么在电脑上看磁盘分配单元的大小_【视频】电脑只有一个分区如何快速分区?简单2步教会你!...
2020-11-22 01:52:09#新机只有一个C盘可以使用那么想要拥有更多的分区该怎么操作呢?今天小微就来给大家详细介绍一下Windows 10系统磁盘分区的操作方法!一起来看看吧~一、关闭C盘系统保护Step1:右击【此电脑】选择【属性】,点击右侧... -
怎么调整磁盘分区的大小
2017-11-29 15:56:00一般情况下在装机时都将一个磁盘分成4个分区,有时候是系统分区C盘太小,数据盘太多或C盘太多,其它数据盘太小。甚至还有一个硬盘的所有容量都划分给系统盘使用。总之就是磁盘分区可能不合理,这时怎么解决呢?这时... -
学习笔记 - tikv节点磁盘坏了怎么修复
2020-10-01 19:50:43在asktom的论坛里面,看到有人提问:一个tikv节点磁盘坏了,现在是down状态,tikv.log里面不停写入太多关于这个节点访问不了的日志信息,占据大量磁盘,她的处理方式如下: a、根据ip地址,找到这个节点的store id ... -
磁盘位置_Win10创建和附加虚拟硬盘|Win10怎么创建VHD虚拟磁盘
2021-01-10 19:21:49VHD虚拟磁盘,就是在C盘划分一定的空间出来,然后利用这个空间虚拟一个硬盘。VHD虚拟磁盘装系统不受分区限制,也不用格式化某个分区,只要是NTFS的磁盘分区格式就能创建,一般用于安装多个操作系统。这篇文章是本站... -
该磁盘可能被另一个进程锁定。_daemon程序没写好导致的磁盘满问题
2020-11-24 02:57:55之前在《如何让程序真正地后台运行》一文中提到了程序后台运行的写法,但是里面的示例程序在某些场景下是会有问题的,这里先不说什么问题,我们先看看这个磁盘满的问题是怎么产生的,通过这篇文章你将会学习到大量... -
.dat数据文件怎么打开_linux磁盘空间满了怎么办?教你快速清理磁盘
2020-11-24 13:32:08请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1. 前言大多数系统管理员会...跟agedu工具打个招呼(发音为'age dee you') - 它会扫描一个目录... -
win10只有c盘怎么分区_新买的电脑只有一个C盘分区吗?小编手把手教你对磁盘分区...
2020-11-18 06:32:58我们新买的笔记本电脑,买回来的时候发现只有一个C盘分区,怎么办呢?很多用户都喜欢将工作、生活和游戏的资源分类存放,这样就需要给硬盘分区了。下面由小编手把手带大家进行磁盘的分区。 第一步:首先我们点击... -
GHOST后,整个磁盘就剩下一个C盘了
2010-03-26 21:16:002010年3月26日星期五GHOST后,整个磁盘就剩下一个C盘了 Ghost操作失误,装操作系统...磁盘中还有很多重要的数据,这可怎么恢复呀。这个案例中最主要的原因是,在Ghost时,把磁盘的分区表弄丢了。要想找到以前的盘符, -
推荐一个好的分区软件win7调整磁盘的大小
2012-05-31 00:37:29一般情况下在装机时都将一个磁盘分成4个分区,有时候是系统分区C盘太小,数据盘太多或C盘太多,其它数据盘太小。甚至还有一个硬盘的所有容量都划分给系统盘使用。总之就是磁盘分区可能不合理,这时怎么解决呢?这时... -
U盘“请插入多卷集的最后一张磁盘”怎么处理
2019-08-02 17:53:57最近在用U盘的时候,一直弹出请插入多卷集的最后一张磁盘,然后单击‘确定’继续,而且你点了还有,点了还有,很影响界面操作,第一反应是U盘中病毒了,但是用金山毒霸查杀之后仍然有此问题,可见不是中病毒了。... -
电脑二维码怎么扫描_电脑磁盘深度垃圾清理工具
2020-10-21 22:10:43平时大家用电脑很多时候让人头疼的是电脑没装多少软件,也没有多少文件 磁盘就莫名其妙的满了,这是什么原因呢?安装了的软件我已经卸载了 文件已经删除了怎么空间也没大...今天就分享给大家一个专门清理这些垃圾... -
dbf文件怎么创建_ASM介绍及管理(四)--磁盘组,ASM磁盘及文件概念
2020-11-22 05:38:36磁盘组概览磁盘组是一个或多个磁盘的逻辑分组,ASM 将其作为一个集合来管理。每个磁盘组都包含与自身相关联的元数据。在概念上,ASM 磁盘组类似于...但是,一个磁盘组可以包含属于多个数据库的文件,而一个数据库可...
-
java发送文件和图片_java web图片上传和文件上传
-
Mycat 实现 MySQL的分库分表、读写分离、主从切换
-
FFmpeg4.3系列之16:WebRTC之小白入门与视频聊天的实战
-
软件综合实习.zip
-
RTCtongxin.rar
-
51单片机条形码识别设计.rar
-
MySQL 高可用(DRBD + heartbeat)
-
LVS + Keepalived 实现 MySQL 负载均衡与高可用
-
财务费用年度支出记账管理系统excel表格模板.7z
-
MT7681_v1.2_SDK
-
2021-02-28
-
java 实例化bean_Spring中实例化bean的四种方式详解
-
java中io流拒绝访问_JAVA IO流常见问题
-
【DVWA】SQL Injection------------------------Medium
-
关于Windows安装两个不同版本的MySQL详细步骤
-
家庭每月收支记账表.7z
-
团体程序设计天梯赛-练习集 L1-046 整除光棍 (20 分)
-
【ssm项目源码】校园活动信息平台.zip
-
java 实现 openmp_使用openmp并行函数调用
-
MySQL 触发器