是否值得同步 I/O 密集型线程以提高总磁盘性能?

     2023-02-25     44

关键词:

【中文标题】是否值得同步 I/O 密集型线程以提高总磁盘性能?【英文标题】:Is it worth synchronizing I/O intensive threads in order to increase total disk performance? 【发布时间】:2015-04-19 19:06:39 【问题描述】:

我们的 Windows .NET 应用程序有多个 I/O 密集型线程,它们不断地写入磁盘(旋转介质)。来自一个线程的写操作是在它不知道另一个线程的写操作的情况下完成的,因此这意味着写请求以与恰好执行调用相同的顺序到达 Windows I/O 管理器。

我们的项目中已经讨论过这是否是正确的方法,或者我们是否可以通过同步写入操作来获得一些性能,以便只有一个(或几个)线程执行写入操作同时到磁盘(可能通过共享锁)。从理论上讲,这会减轻 CPU 的压力,并为我们提供更好的吞吐量(请注意,我们已经在所有操作中使用异步 I/O)。

我对整个想法有点怀疑,因为我认为我们将完成操作系统最初旨在解决的部分工作。现在已经进行了一些实验,它指出了根本没有任何好处的方向。我的印象是,只要缓冲区大小足够,何时将块写入磁盘的决定最好留给操作系统来决定。

那么有人可以启发我们吗?从多线程进程同步磁盘访问以获得性能是一个好主意吗?例如,Windows 或 Linux 在这方面有什么不同吗?

【问题讨论】:

您正在编写的文件有多大?数据总共有多大? 在这个用例中,我们不断地写入磁盘,当文件达到一定大小时,我们关闭它们并开始一个新的,所以每个可能 50 MB。总数可能是可用磁盘的 75%。这完全取决于保留时间。 这对于写入来说不是那么重要,因为操作系统可以延迟和电梯排序它们。如果同时发出不相关的读取和刷新,则会导致真正的性能问题,因为磁盘最终花费的时间比实际执行 I/O 的时间更多。 当然,所有这些问题对于不需要搜索的固态驱动器来说都变得微不足道了。 【参考方案1】:

理论上是这样可以减少 CPU 的压力

怎么可能?写入次数相同,但现在增加了同步。它会产生(一点)更多的 CPU 负载。

然后,我们将完成操作系统最初旨在解决的部分工作。

遗憾的是,Windows 无法执行任何类型的智能 IO 调度。我不确定磁盘驱动程序是做什么的。对于 NCQ 和 SATA,肯定会有一定程度的操作重新排序。但我从未观察到 Windows 在 IO 方面做了一些智能的事情(除了预取效果很好)。

主要问题是您是要执行顺序 IO 还是随机 IO。

    顺序:多个顺序流导致 Windows 将流分成 64KB 或 256KB 的块,使它们高度随机。这真是太可怕了。在这种情况下,您可以通过智能地发出大型 IO 来获得数量级的性能。 随机:一次发出许多 IO,以便磁盘硬件可以重新排序它们。例如,SQL Server 有时会发出数千个问题(并在此期间完全阻止其他进程 - 请注意这一点。Windows 没有实际可行的 IO 公平概念。)

我对 Linux 了解不多,但至少它某种 IO 调度。 Windows 团队似乎不想解决这个问题。

【讨论】:

在 SSD 上这应该无关紧要,但在 HDD 上,我经常注意到两个并发的顺序 IO 操作由于它们之间的大量不必要的查找而彼此减慢了很多。但由于这些通常是文件副本,因此是读取和写入的混合,我不确定纯写入在多大程度上是正确的,可以缓冲。 @CodesInChaos 试试看。从一个卷复制到下一个卷,并使用具有高级输出的 procmon 查看物理 IO。它不漂亮。通常,NTFS 甚至会完美交错地分配集群,从而导致最大碎片。因此,除了低效的 IO 调度之外,我们还在 NTFS 层获得了最大的碎片。在这里很难找到任何积极的方面。 另外,这在 SSD 上也很重要,因为随机 SSD IO 比顺序慢 10 倍。对于磁盘,它是 100 倍。 如果我离开的印象是最好的做法是尽可能多地进行处理,然后在最后将其全部写出来,而不是将所有内容写成我去? @jpmc26 最好的办法是确保 IO 是顺序的。对于未缓存的 IO:只要单个 IO 足够大以保证磁盘搜索,您可以以涓涓的方式写入数据,没问题。缓存 IO:您可以毫无问题地进行涓流写入。写入首先进入 Windows 缓存,然后在后台以大顺序写入刷新。

使用线程池和blockingqueue重新构建i/o密集型javaweb服务

我创建并且目前在PROD中存在的Java项目是I/O密集型的。我想重构它以优化性能-不是我被要求这样做但我觉得还有改进的余地。所以在为时已晚之前处理它。几个步骤可以并行化并更好地利用多个核心。什么服务呢?它是一个Web服... 查看详情

如何理解cpu密集型和i/o密集型(代码片段)

  说在前面,CPU密集型与I/O密集型是在计算机上执行任务的两种策略,在并发执行任务场景下,我们需要选择使用多线程或多进程;  如果是IO密集型任务,使用多线程,如果是CPU密集型任务,使... 查看详情

爬虫高性能相关(代码片段)

...一个线程在运行。由此我们可以讨论:1.当一个程序是I/O密集型时,是该采用多线程还是应该采用多进程?我们知道当程序进入I/O(阻塞态)时,操作系统会自动剥夺我们程序的CPU使用权。如果我们程序采用多进程,即使给我们的... 查看详情

使用内存磁盘进行 I/O 单元测试

...理并以多个文件的形式写入磁盘(数量级约为1Gb,非常IO密集型)。在检索时,数据被读入(也是IO密集型),我的单元测试(nunit和MOQ,实际上是组件测试)将它们与原始数据进行 查看详情

nodejs密集型cpu解决方案

首先说一下nodejs单线程的优势:高性能,与php相比,避免了频繁创建切换线程的开销,执行更加迅速,资源占用小。线程安全,不用担心同一变量被多线程读写,造成程序崩溃。单线程的异步和非阻塞,其实nodejs底层访问I/O还是... 查看详情

codereview的理解

...规范方面检查项2.面向对象设计方面检查项-类设计和抽象是否合适-是否符合面向接口编程的思想-是否采用合适的设计模式3.性能方面检查项-对hashtable,vector等集合类数据结构的选择和设置是否合适-有无滥用String对象的现象-是... 查看详情

读java性能权威指南(第2版)笔记27_线程和同步性能上

...是,此时向线程池添加线程是有害的2.4.1. 适用于向CPU密集型或I/O密集型的数据库发送请求的REST服务器2.4.2. 增加线程数实际上会降低总体吞吐量2.5. 如果给瓶颈处增加负载,性能将大幅下降2.6. 如果当前瓶颈的负载... 查看详情

爬虫—使用协程构建高性能爬虫(代码片段)

使用协程构建高性能爬虫一、简介  在执行一些IO密集型任务的时候,程序常常会因为等待IO而阻塞。比如在网络爬虫中,如果我们使用requests库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后导致其... 查看详情

linux多线程(代码片段)

.../O操作结束的同时,程序可执行其他的计算任务6.计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现7.I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操... 查看详情

linux多线程(代码片段)

.../O操作结束的同时,程序可执行其他的计算任务6.计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现7.I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操... 查看详情

如何理解cpu密集型和i/o密集型(代码片段)

  说在前面,CPU密集型与I/O密集型是在计算机上执行任务的两种策略,在并发执行任务场景下,我们需要选择使用多线程或多进程;  如果是IO密集型任务,使用多线程,如果是CPU密集型任务,使... 查看详情

线程池线程数与(cpu密集型任务和i/o密集型任务)的关系

...的专栏,结合自身理解,来做一个关于(线程池线程数与(CPU密集型任务和I/O密集型任务)的关系)的总结:1.任务类型举例:     1.1:CPU密集型:          例如,一般我们系统的静态资源,... 查看详情

使用异步i/o大大提高应用程序的性能

...n/linux/l-async/AIO简介Linux中最常见的输入输出(I/O)模型是同步I/O。在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。这是很好的一种解决方案,因为调用应用程序在等待I/O请求完成时不需要使用任何中央... 查看详情

node.js性能优化

...分析影响其性能的因素原因,以及部分优化解决方案。CPU密集型计算CPU负责了程序的运行和业务逻辑的处理,而CPU密集型表示的主要 查看详情

磁盘i/o那些事

...传统硬盘。传统磁盘的I/O读写速度成为了计算机系统性能提高的瓶颈,制约了计算机整体性能的发展。硬盘性能的制约因素是什么?如何根据磁盘I/O特性来进行系统设计?针 查看详情

利用oracle分区表来减少磁盘i/o冲突

...库的性能    一分区表的原理与优势  分区表对于提高大表的访问性能会有很大的帮助如上图所示可以将一张产品信息表分按产品类别分为三个部分分别为成品信息零件信息和原材料信息然后将这三部分对应一个单独的分... 查看详情

cpu-bound(计算密集型)与i/o-bound(i/o密集型)

...池大小?有人回复了说,不谈并发类型(计算密集型或者IO密集型)的话,这个问题纯属瞎扯淡。下面是一些个人理解与在网上看到的比较好的解释。1、CPU-bound(计算密集型)计算密集型是说需要这个应用的运行... 查看详情

线程太多会对服务器有啥影响?

...吞吐率。线程池大小设置要考虑服务器的CPU、内存、计算密集型还是I/O密集型等方面,尤其是计算密集型和I/O密集型属 查看详情