优化不当的危险

在优化系统以实现最佳性能方面,如果您不顾一切地采用其他人的做法,很容易出错。 一种这样的做法是在挂载文件系统时指定nobarrier。

这个音符是如何诞生的


我是Mail.Ru Cloud Solutions的工程师,主要处理用户虚拟机所在的块存储“周围和周围”的各种问题-因此,经常会出现有趣的案例,这些案例涉及在其中运行的虚拟机的性能和稳定性。应用程序-尤其是数据库。

通常,在“汇报”期间几乎有一半的情况下,我们会看到同一件事-使用nobarrier选项安装的文件系统。 然后,当我们问“为什么要编写此选项”时,我们几乎总是得到一个答案选项“被告知速度更快/我读到它速度更快/我像这样设置”-在此之后,我们礼貌地并仔细地尝试解释一下所以不需要。 怎么了 因为这是迈向数据丢失之路的第一步。

短途旅行


文件系统-结构非常复杂且负载很高。 为了确保最佳性能,在此过程中积极使用了缓存和并行记录。 因此,部分数据进入高速缓存,并在可能/必要或“按需”时被丢弃。 屏障是一项特殊操作,用于强制将所有缓存刷新到磁盘。

对于数据库,一方面,我们必须确保向客户端(客户端应用程序)确认的事务是持久性的,并且不会消失,另一方面,DBMS会积极使用自己的缓存来实现最高性能-并确保一致性,使用日记功能-将更改写入日志,“同步”日志,然后将更改写入数据(写入时将其放入缓存)。 当日志已满时,将对缓存中的所有数据进行强制同步,并且日志将再次开始填充。

同步操作


执行同步后,操作系统不仅会刷新页面缓存,而且默认情况下还会发送命令来刷新所有磁盘缓存(并且可能会重复执行此操作)-所谓的 冲洗 。 刷新缓冲区的操作“昂贵”并且要花费大量时间-但是这是必要的,因为在文件系统中写入顺序很重要-如果违反了写入顺序,那么(例如)可能会发现在文件突然重启期间会有垃圾代替数据-因为设备决定对记录重新排序。 当刷新强制刷新所有缓存时,这将确保首先写入刷新之前的内容,然后才写入刷新之后的内容,即创建一个“屏障”,将条目分为“屏障之前”和“屏障之后”(从此处开始)和名称“ barrier write”),这可以保证屏障之后的记录不会早于屏障之前的记录应用。

无障碍效应


nobarrier选项在文件系统运行时禁用发送强制刷新。 这导致记录可以重新排序的事实-如果发生故障,文件系统(通常是一般情况下的数据)可能会不一致-让我们回想一下上一段中关于记录顺序的内容。

为什么包含此选项? 对于低成本SSD,刷新操作非常昂贵-例如,低成本SSD(以及许多昂贵的SSD(定位为“服务器”的)固态硬盘)每秒执行10-20 000次写操作,而无需刷新,并且在刷新后下降到1-2 000。 在这种情况下,nobarrier可以显着提高性能,从而给上述数据完整性带来风险。

虚拟环境


以虚拟机为例-例如,如果我们谈论的是Linux虚拟机管理程序上虚拟机的经典配置,则我们有QEMU-一个实际上负责为来宾操作系统模拟I / O的过程。 最重要的是,如果我们在虚拟机中使用非文件支持的磁盘,则此类虚拟磁盘的缓存(突然!!)位于用户空间中-在相应QEMU进程的地址空间中。 而且,如果此进程崩溃(例如,根据SEGFAULT / SIGSEGV所述),则其所有缓存都将随之消失。 这种块设备驱动程序的一个示例是RBD(Ceph)驱动程序。

而且,即使您不使用Ceph而是使用iSCSI / FC,故障级别也不会消失-它只是从QEMU转移到主机操作系统(系统管理程序)。 系统管理程序掉线了-它的页面缓存消失了(io ='threads'与cache ='writeback'或cache ='unsafe'结合使用时确实如此)。 哎呀

s /云/外星人计算机/ g


当您的虚拟机部署在云中时...然后您不知道管理程序的配置方式,QEMU的配置方式,所涉及的磁盘驱动程序,主机页面缓存是否正常工作等,因此在大多数情况下您都无法影响这一点。 即使是在您的云中-您知道所有这些内容或多或少都对其进行了控制,虚拟机管理程序也不会“掉下”,这完全不是事实-埋藏了整个数据缓存。

总结


在云中使用nobarrier意味着您很有可能使数据面临风险。 您确定要以此类风险为代价提高生产率吗?

Source: https://habr.com/ru/post/zh-CN471906/


All Articles