2011-01-25 43 views
8

我正在开发一个在读取日志文件和在磁盘中写入派生结果非常密集的C++应用程序(在Linux框中运行)。我想知道哪些是优化这些应用程序的最佳实践:哪些是高清数据密集读写的最佳实践?

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

是否有一个良好的阅读,哪儿能找到这种基础,所以我可以适应现有的诀窍我的问题呢?

感谢

+0

数据保存在缓存和写尽可能少,它太慢了。 – BlackBear 2011-01-25 14:57:01

回答

6

压缩当然可以有很大的帮助,比调整操作系统要简单得多。请查看Boost.IOStreams库中的gzipbzip2支持。尽管如此,这会对处理器产生影响。

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

+0

通过duing`zcat bigfile.gz | ourprogram` vs`ourprorogram nos 2011-01-25 18:22:40

2

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

缓冲帮助了很多,这样可以最大限度地减少写作量。

3

1)检查你的磁盘的扇区大小。
2)确保磁盘被整理。
3)为了提高缓存局部性(缓存由操作系统执行,许多硬盘也有内置缓存),读取“本地”数据。
4)连续写入数据。

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

为了获得最佳读取性能,您可以双重读取缓冲区。因此,让我们说你在读取时缓存16K块。将第一个16K从磁盘读入块1.启动对块2中的第二个16K的异步读取。开始工作块1.当完成块1同步时,读取块2,并开始异步读取到块1中第3个16K块放入块1.现在在块2上工作。完成第3个16K块的读取同步后,启动第4个16K的异步读入块2,并在块1上工作。冲洗并重复,直到处理完所有数据。

如前所述,你必须阅读的时间就越少会失去从磁盘读取,因此很可能是值得一读的压缩数据和花费的CPU时间扩大读上每个块的数据就越少。在写入之前同等压缩块会节省磁盘时间。无论这是否胜利,取决于您对数据处理的CPU密集程度。

此外,如果在块的处理是不对称的(即处理块1能够采取的3倍,只要处理块2)然后考虑三重或多种缓冲剂进行读取。

2

由于这是这里所说的,你应该检查块的大小。你用stat系列功能来做到这一点。 在struct stat中,此信息位于st_blksize字段中。

第二件事是功能posix_fadvise(),它给出建议OS约分页。你告诉系统你将如何使用文件(甚至文件的片段)。您可以在手册页上找到更多信息。

+0

posix_fadvise()我不知道这个 - 谢谢你! :d – 2011-01-25 16:49:33

0

在Windows,用CreateFile()用FILE_FLAG_SEQUENTIAL_SCAN和/或FILE_FLAG_NO_BUFFERING而不是fopen()函数 - 至少在写这篇立即返回,而不是等待数据刷新到磁盘