哪些是HD中数据密集型读写的最佳实践?

时间:2011-01-25 14:54:31

标签: c++ c performance io disk

我正在开发一个C ++应用程序(在Linux机器中运行),它非常密集地读取日志文件并将派生结果写入磁盘。我想知道哪些是优化这类应用程序的最佳实践:

  • 哪种操作系统调整可以提高性能?
  • 哪种编程模式可以提高IO吞吐量?
  • 预处理数据(转换为二进制,压缩数据等)是一种有用的措施吗?
  • 分块/缓冲数据是否有助于提高性能?
  • 我应该注意哪些硬件功能?
  • 哪些实践最适合分析和衡量这些应用程序的性能?
  • (在这里表达我缺少的担忧)

有一个很好的阅读,我可以得到这个的基础知识,所以我可以调整现有的技术诀窍我的问题?

由于

5 个答案:

答案 0 :(得分:6)

压缩当然可以帮助很多,并且比调整操作系统简单得多。查看Boost.IOStreams库中的gzipbzip2支持。不过,这会对处理器产生影响。

使用time命令开始测量这些类型的作业。如果系统时间与用户时间相比非常高,那么您的程序会花费大量时间进行系统调用。如果挂钟(“实际”)时间与系统和用户时间相比较高,则它正在等待磁盘或网络。 top命令显示程序的CPU使用率低于100%,这也是I / O瓶颈的一个标志。

答案 1 :(得分:3)

1)检查磁盘的扇区大小 2)确保磁盘已碎片整理 3)读取您为改善缓存局部性而进行的最后读取的“本地”数据(缓存是由操作系统执行的,许多硬盘驱动器也有内置缓存)。
4)连续写入数据。

对于写入性能,缓存内存中的数据块,直到达到扇区大小的倍数,然后启动异步写入磁盘。在您确定已写入数据(即同步写入)之前,请勿覆盖当前正在写入的数据。双重或三重缓冲可以在这里提供帮助。

为获得最佳读取性能,您可以将缓冲区读取加倍。因此,假设您在读取时缓存16K块。从磁盘读取第1个16K到块1.启动第2个16K到块2的异步读取。开始在块1上工作。完成块1后,同步读取块2并启动异步读取到块1第3个16K块进入块1.现在在块2上工作。完成同步读取第3个16K块后,启动第4个16K到块2的异步读取并在块1上工作。冲洗并重复直到处理完所有数据。

如前所述,您需要读取的数据越少,从磁盘读取的时间就越少,因此读取压缩数据并花费CPU时间来扩展读取的每个块可能是值得的。在写入之前同等地压缩块将节省磁盘时间。这是否胜利真的取决于CPU处理数据的密集程度。

此外,如果对块的处理是不对称的(即处理块1可能需要3倍于处理块2),则考虑对读取进行三次或更多次缓冲。

答案 2 :(得分:2)

获取有关您要写入/读取的卷的信息,并创建与卷的特征匹配的缓冲区。例如10 * clusterSize。

缓冲有很大帮助,最大限度地减少你必须做的写作量。

答案 3 :(得分:2)

正如这里所说,你应该检查块的大小。您可以使用stat系列函数执行此操作。 在struct stat中,此信息位于字段st_blksize。

第二件事是函数posix_fadvise(),它向操作系统提供有关分页的建议。您告诉系统您将如何使用文件(甚至文件的片段)。您可以在手册页上找到更多信息。

答案 4 :(得分:0)

在Windows上,使用带有FILE_FLAG_SEQUENTIAL_SCAN和/或FILE_FLAG_NO_BUFFERING的CreateFile()而不是fopen() - 至少在写入时立即返回而不是等待数据刷新到磁盘

相关问题