LWN: 数据库开发者对Linux kernel的要求

SQLite和PostgreSQL开发者在LinuxPlumbersConference上指出,Linuxkernel缺乏明确的I/O接口行为定义,特别是在错误处理和文件系统特性方面,这给数据库开发带来了不确定性。会议强调了kernel与user-space开发者之间沟通的重要性。
640
点击上方蓝色“Linux News搬运工”关注我们~

Better guidance for database developers

By Jake Edge


LPC

在2019 Linux Plumbers Conference (LPC)会议内第一次的Databases microconference会议上,两位为不同数据库系统工作的开发者针对Linux环境下的开发工作提出了类似的抱怨意见。Richard Hipp,是SQLite数据库的创始人,而Andres Freund是来自PostgreSQL项目,他们都觉得Linux kernel里缺少I/O接口行为的明确定义,尤其是在某些特殊情况下。会议过程表明kernel跟user-space的开发者需要多多交流。

SQLite

Hipp简介了一下SQLite(他的发音是“ess-kyew-ell lite”),与其他数据库系统有什么区别,要点可以参见他的ppt(https://sqlite.org/lpc2019/doc/trunk/slides/sqlite-intro.html  )。他的主要话题是“SQLite开发者希望Linux文件系统开发者知道的一些信息”。

640

SQLite到处都在用,甚至我的索尼相机里都可能有使用SQLite。总之汽车、手机、电视等等都有用到。世界上有25亿安卓手机,每台里面都有至少200个SQLite数据库在用。每台手机每天估计有超过5GB的SQLite I/O操作。

SQLite跟其他数据库系统最大的不同,就是它其实是application里面编译进去的一个库文件。没有服务器线程。大多数数据库都是为数据中心设计的。SQLite是运行在网络的端侧的,直接用一个文件存放整个数据库,在日志文件系统上可以支持atomic commit功能。SQLite没有配置文件,会自动在运行时检测系统的能力。

同时可能会有多个进程同时访问数据库,毫无关联。通常数据库可以有三种机制来提供atomicity, consistency, isolation, durability (ACID,原子性,一致性,隔离性,耐久性)保证。最常见的是rollback journal(回退日志),这个方法最慢。还有write-ahead log,会快一些,如果已知数据库文件不是放在一个网络文件系统上就可以用这个方法,不过很难确认是否真的不在网络文件系统。

一位听众说可以用statfs()来确认文件系统类型,Hipp说是可以,不过SQLite就得维护一个各种网络文件系统的列表。通常SQLite是静态链接到application里的,很难更新这个列表。

SQLite也可以用F2FS的atomic write能力。这是Linux特有的方案,不过确实非常快。他听说如果把一台旧手机的ext4文件系统格式化成F2FS的话,用起来就感觉是一个全新手机一样。可以用一个ioctl()接口来确认这个功能是否可用。要是能有一个通用一点的方法来确认,那就更好了。

会议中他提到了几个具体的问题,其实还有很多其他问题。首先他提到,没有一个可靠方法来查询文件系统属性。例如创建文件并写入数据后,调用fsync(),那么你是否需要再打开这个文件所在的目录也进行一次fsync()来保证数据确实存入目录了?是不是每个文件系统行为都一致?

内核文件系统开发者Jan Kara说POSIX标准要求使用目录的fsync()来确保数据存储完成,通常来说,文件系统开发者除了POSIX的规定以外不愿意多做保证,否则就会束缚他们自己。世纪来说,ext4会自己进行目录的fsync()操作,因此在ext4系统上并不需要额外的fsync()操作,至少目前是这样。SQLite会永远都确保对目录进行fsync(),如果没有并发访问的话,这个动作倒也耗时不多。Kara提供的这些信息,对Hipp来说,恰恰就是他想知道的信息,并且是来自权威人士的。

Hipp还想知道SQLite是否需要告诉文件系统文件的哪一部分没有被用到。今后这一部分可能会被用到,不过至少在某些时候这部分只是被分配出来,其中的数据SQLite完全不关心。有人觉得是不是文件系统能利用这个信息来对SSD进行TRIM操作,不过通常人们觉得没有这个必要。Kara说,除非没用到的这些部分的大小是GB级别,否则用不着关心它。

PostgreSQL

Freund一上来就抱怨说,在PostgreSQL里面进行durability handling非常困难:每个Linux文件系统都有不同的行为。大多数系统调用都没有描述出错之后的详细行为。比如fsync()的错误值直到Linux 4.13才能正常报出来,不过目前文档里还是没有描述错误值的含义,以及是否需要application重新发起。

640

Kara基本赞同他的说法,他说标准里面只定义了正常情况的行为。POSIX也没有也没有定义这些durabiilty方面的信息,他跟Freund都有同样的烦恼。

Freund接着描述了另一个文档问题:durability操作,例如sync_file_range()都会附有很吓人的警告("This system call is extremely dangerous and should not be used in portable programs ..."),看起来根本不希望应用开发者使用一样。但是如果应用开发者碰到性能问题了,得到的建议经常是去用sync_file_range()。Kara说这个警告信息是因为某些文件系统会能确保存储这一段数据,但是有些文件系统就不能保证。Freund觉得这样的话,应用开发者就不得不仔细研读kernel代码才能决定是否可以使用这个函数了。

并且这里的出错行为在各种文件系统、块设备、内核版本上也都各不相同。某一个文件系统上你可能会在I/O error后拿到旧数据,换一个文件系统上就有可能拿到新数据,在NFS上甚至根本不会有错误信息,直到文件被关闭才会发现。应该有个文档描述清楚应用程序应该根据什么信息来判断出具体的行为。没有标准的话,写出来的代码行为肯定会有差异。

一位听众问道:“你希望描述得有多深入呢?” 文件系统开发者受限于块设备层开发者,而后者又受限于硬件设备本身。各种存储设备都可能会导致行为差异。

Freund说他们正在寻找这些不同行为中的共同点。比如,目前在一个"thin-provisioned(精简配置的) block device"上,可能某个系统调用就会返回一个文档中没有描述的ENOSPC错误。他其实觉得只要文件系统和块设备层的错误信息只要能保持一致就好,并不需要Linux需要隐藏设备的差异性。

他觉得,出错之后的行为还是要有文档描述。如果fsync()失败了,然后重新发起,那么会有什么后果?此前的sync操作是会重试,还是会直接丢弃新数据?后面这种行为他们也观察到过。应用开发者不得不在Linux kernel邮件讨论里面搜索这些信息。

除了错误情况下需要文档外,还需要有文档能描述一下如何安全的完成某件工作,有什么最好的办法。目前只能是猜测着来做,或者需要跟内核开发者喝酒的时候聊清楚。喝酒是很好,不过大家天各一方,也没法经常这么解决啊。

比如说,没有文档描述怎么能确保数据存储成功。应用开发者的各种实现方式,都有内核开发者抱怨。如果会导致性能下降,内核开发者会说这个application做得保护太过了;不过如果有人担心数据丢失,那么就会抱怨保护还不够。大家的观点让人无所适从。

还有个例子是如何能让文件rename操作确保原子性,怎么能在磁盘上保证这一点?某些文件系统开发者说需要对文件本身以及它所在的目录进行fsync(),然后再做rename(),然后再对新文件和所在目录进行fsync()。这个步骤是否必要,也经过了很多争论。不过Tomas Vandra说PostgreSQL经过大量测试之后,最终还是按照这个步骤做了,终于解决了那些数据丢失问题。

Kara赞同Freund说到的文档确实不完整。他的建议是在linux-fsdevel mailing list上提问,确保问题信息描述清楚。相关的回复邮件就可以被整理成文档放到kernel的Documentation目录下去。Kara也觉得atomic rename()的这个问题确实挺可惜的,建议应该发到mailing list上来讨论。

一位听众问Freund是否能接受知道一个最小集合的共同行为列表,因为多种文件系统对同一个问题会有多种回答。Freund说这样也行,毕竟针对某些性能敏感的代码,也是可以针对文件系统使用针对性的代码。在回答其他问题的时候,Freund说他最主要想知道在哪些error情况下需要retry重试来增大成功概率。

从这些讨论里来看,数据库开发者(可能还有其他user-space应用开发者)都需要找到更有效的方法来跟内核开发者合作,反之亦然。这次的microconference是第一次,后续还需要跟多的邮件讨论,来创建更好的文档。首先应该来提供一些引导教会应用开发者如何能确保数据安全,包括文件内容和metadata的一致性。

[I would like to thank LWN's travel sponsor, the Linux Foundation, for travel assistance to Lisbon for LPC.]

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

极度欢迎将文章分享到朋友圈 
热烈欢迎转载以及基于现有协议修改再创作~

长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~

640?wx_fmt=jpeg

内容概要:本文提出了一种基于非合作博弈理论的居民负荷分层调度模型,并结合双层鲸鱼优化算法(Two-level Whale Optimization Algorithm)进行高效求解,模型与算法均通过Matlab代码实现。研究针对电力系统中居民侧用电负荷的复杂调度问题,引入非合作博弈机制刻画各用户之间的利益竞争关系,实现负荷的分层优化分配;同时设计双层优化架构,上层优化资源配置,下层模拟用户自主决策行为,提升了模型的实用性与合理性。通过智能优化算法求解多层级、非凸非线性的博弈模型,有效提高了调度方案的收敛性与全局寻优能力,适用于现代智能电网中的需求侧管理与能源优化场景。; 适合人群:具备电力系统基础理论知识和Matlab编程能力,从事智能电网、能源优化调度、需求侧管理、博弈论应用等方向的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于居民区电力负荷的分层优化调度系统设计与仿真分析;②为非合作博弈在多主体能源系统建模中的应用提供方法论支持;③利用双层鲸鱼算法解决具有嵌套结构的复杂双层优化问题,提升求解效率与调度方案的可行性。; 阅读建议:建议读者结合提供的Matlab代码深入理解模型构建逻辑与算法实现流程,重点关注博弈模型的效用函数设计、纳什均衡求解思路以及双层优化结构的迭代机制,宜配合实际用电数据开展复现实验以验证模型有效性与鲁棒性。
内容概要:本文围绕基于自适应神经模糊推理系统(ANFIS)智能控制器的可再生能源微电网功率管理系统展开研究,结合Simulink仿真实现,深入探讨了微电网中功率的智能调控与经济机组组合调度问题。通过引入ANFIS控制器,有效应对风能、光伏等可再生能源出力的波动性与不确定性,提升系统运行的稳定性与电能质量。研究内容涵盖微电网多源协调控制策略、功率平衡管理、优化调度模型构建及仿真验证,实现了对分布式电源、储能系统和负荷的协同优化,兼顾经济性与可靠性目标,并通过仿真平台验证了所提方法的有效性与优越性。; 适合人群:具备电力系统、自动化或新能源相关专业背景,熟悉Matlab/Simulink仿真环境,从事微电网能量管理、智能控制、能源优化等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于高比例可再生能源接入场景下的微电网能量管理系统研发与教学实践;②为实现微电网功率稳定控制与经济高效运行提供先进的智能控制解决方案;③支撑高水平学术论文复现、科研课题攻关及实际工程项目的仿真验证与方案优化。; 阅读建议:建议结合提供的Simulink模型与相关代码进行动手实践,重点关注ANFIS控制器的设计流程、规则库构建与参数调优方法,并通过与传统PID或MPC控制策略的对比实验,深入理解其在动态响应与鲁棒性方面的优势。同时可进一步拓展文中提出的优化调度逻辑,应用于多目标、多约束的复杂实际应用场景中。
内容概要:本文档聚焦于“直流电机双闭环控制Matlab仿真”,系统阐述了基于Matlab/Simulink平台实现直流电机双闭环控制系统(主要包括速度环与电流环)的设计与仿真全过程。通过构建直流电机的数学模型,结合PI控制器进行调控,实现对电机转速和电枢电流的高精度动态控制,验证控制策略的稳定性与响应性能。文档详细介绍了仿真模型的搭建流程、关键参数的整定方法、系统动态波形的分析手段以及仿真结果的有效性验证,体现了经典自动控制理论在实际电机系统中的工程应用,是电机控制与电力电子技术相结合的典型研究案例。; 适合人群:具备自动控制原理、电机与拖动基础、电力电子技术和Matlab/Simulink仿真能力的电气工程、自动化、机电一体化等专业的本科生、研究生及从事电机驱动系统研发的工程技术人员。; 使用场景及目标:①作为高校课程设计或实验教学材料,帮助学生深入理解双闭环调速系统的工作机理与工程实现;②服务于科研项目,为新型电机控制算法(如滑模、模糊PID等)的开发与性能对比提供基础仿真验证平台;③作为工业界产品前期设计的仿真工具,用于评估不同控制策略在动态响应、抗干扰能力和稳态精度方面的可行性。; 阅读建议:建议读者在学习过程中紧密结合自动控制理论知识,亲手在Simulink环境中搭建完整的双闭环仿真模型,通过反复调整PI控制器的比例与积分参数,观察并分析转速、电流的阶跃响应曲线,从而深刻理解反馈控制的本质、系统稳定性条件以及参数整定对动态性能的影响,进而掌握电机控制系统的设计精髓。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值