我正在开展一个项目,我们需要更多的性能。随着时间的推移,我们不断改进设计以实现更多的并行工作(线程和分布式)。最新的一步是将其一部分转移到一台具有 16 核的新机器上。我发现我们需要重新思考如何在共享内存模型中扩展到这么多核心。例如,标准内存分配器不够好。

人们会推荐哪些资源?

到目前为止我找到了萨特的专栏博士。多布斯是一个良好的开端。我刚刚收到《多处理器编程的艺术》和《O'Reilly》有关英特尔线程构建模块的书

有帮助吗?

解决方案

其他一些有帮助的书是:

另外,考虑减少对并发进程之间共享状态的依赖。如果您可以避免这种情况,那么您的扩展能力就会好得多,因为您将能够分配独立的工作单元,而不必在它们之间进行太多的同步。

即使您需要共享某些状态,也看看是否可以将共享状态与实际处理分开。这将使您能够并行执行尽可能多的处理,而无需将已完成的工作单元集成回共享状态。显然,如果工作单元之间存在依赖关系,则这不起作用,但值得研究,而不是仅仅假设状态始终会共享。

其他提示

您可能想查看 Google 的性能工具. 。他们发布了用于多线程应用程序的 malloc 版本。它还包括一组很好的分析工具。

Jeffrey Richter 非常热衷于线程。他的书中有一些关于线程的章节,请查看他的博客:

http://www.wintellect.com/cs/blogs/jeffreyr/default.aspx.

正如 monty python 所说的“现在是完全不同的事情”——您可以尝试一种不使用线程,但使用进程和消息传递(无共享状态)的语言/环境。最成熟的之一是 erlang (以及这本优秀而有趣的书: http://www.pragprog.com/titles/jaerlang/programming-erlang)。可能与您的情况并不完全相关,但您仍然可以学到很多可以应用于其他工具的想法。

对于其他环境:

.Net 有 F#(用于学习函数式编程)。JVM 有 Scala(它有 actor,非常像 Erlang,并且是函数式混合语言)。另外还有 Doug Lea for Java 的“fork join”框架,它可以为您完成大量艰苦的工作。

FreeBSD 中的分配器最近获得了 FreeBSD 7 的更新。新的叫做 杰马洛克 并且对于多线程来说显然更具可扩展性。

您没有提到您正在使用哪个平台,所以也许这个分配器可供您使用。(我相信 Firefox 3 使用 jemalloc, ,即使在 Windows 上。所以端口一定存在于某个地方。)

看一眼 如果您正在进行大量内存分配。

滚动你自己的 锁定空闲列表. 。这里有一个很好的资源 - 它是用 C# 编写的,但其中的想法是可移植的。一旦您习惯了它们的工作方式,您就会开始看到可以使用它们的其他地方,而不仅仅是在列表中。

我有时会去看看 Hoard、Google Perftools 和 jemalloc。目前,我们使用英特尔线程构建模块中的可扩展_malloc,它的性能足够好。

无论好坏,我们在 Windows 上使用 C++,尽管我们的大部分代码都可以用 gcc 编译。除非有令人信服的理由迁移到 redhat(我们使用的主要 Linux 发行版),否则我怀疑迁移是否值得头痛/政治麻烦。

我很想使用 Erlang,但现在有很多方法可以重做。如果我们考虑一下电信环境中 Erlang 开发的要求,就会发现它们与我们的世界(电子交易)非常相似。阿姆斯特朗的书在我的书架上:)

在从 4 核扩展到 16 核的测试中,我学会了了解代码并行部分中任何锁定/争用的成本。幸运的是,我们有很大一部分可以随数据扩展,但即使这样,由于额外的锁和内存分配器,一开始也不起作用。

我维护一个并发链接博客,可能会引起人们持续的兴趣:

http://concurrency.tumblr.com

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top