【发布时间】:2012-11-02 16:55:43
【问题描述】:
背景
我们一直在努力尝试为“高性能”应用程序提供解决方案。该应用程序基本上是一个高吞吐量的内存管理器,可以同步回磁盘。 “读取”和“写入”非常高,每秒大约 3000 个事务。我们尝试在内存中做尽可能多的事情,但最终数据会变得陈旧,需要刷新到磁盘,这就是一个巨大的“瓶颈”接踵而至的地方。该应用程序是多线程的,大约有 50 个线程。没有IPC(进程间通信)
尝试
我们最初是用 Java 编写的,它工作得很好,直到达到一定的负载,遇到瓶颈并且无法跟上。 然后我们在 C# 中进行了尝试,也遇到了同样的瓶颈。 我们使用非托管代码 (C#) 进行了尝试,虽然在初始测试中使用 MMF(内存映射文件)非常快,但在生产中,读取速度很慢(使用视图)。 我们确实尝试了 CouchBase,但我们偶然发现了围绕高网络利用率的问题。这对我们来说可能是糟糕的配置!
额外信息:在我们的 Java 尝试(非 MMF)中,我们的线程与需要刷新到磁盘的信息队列构建到无法跟上“写入”的程度到磁盘。 在我们的 C# 内存映射文件方法中,问题是 READS 非常慢,而 WRITES 工作完美。由于某种原因,视图很慢!
问题
所以问题是,您打算传输大量数据的情况;有人可以提供一种可能的方法或架构设计来提供帮助吗?我知道这似乎有点宽泛,但我认为高性能、高吞吐量的具体性质应该缩小答案范围。
谁能保证在这样的级别上使用 Couchbase、MongoDB 或 Cassandra?其他想法或 解决方案将不胜感激。
【问题讨论】:
-
我不确定,但我认为当达到某个限制(但不是很大的数字,例如你现在使用的四分之一)时将其他线程中的数据写入磁盘,同时继续读取数据可以帮助。然后你可以释放这个内存并开始写其他的。我真的不知道答案我只是认为它可以提供帮助
-
不确定它是否适合您的数据传输问题,但加利福尼亚大学的一篇论文中显示了一种软件设计。 “SEDA:条件良好、可扩展的互联网服务架构”。 ACM ISBN 1-58113-389-8-1/01/10。它讨论了如何在多线程/分阶段系统中获得高吞吐量。
-
阿迪尔,谢谢我们正在这样做。 Coding.mof 将查看该论文,非常感谢。
-
如何在磁盘之间分片数据?此外,我个人不能保证 Mongo 在如此高的负载下的性能如何,但它们似乎非常重视速度,并提供了很多设施来尝试在多个服务器/磁盘之间分配读/写负载。跨度>
-
你说你已经尝试过 Java/C#/Unmanaged C# 并且一切都很慢。听起来架构和开发环境不是这里的问题,而是您只是试图在当前硬件上做太多事情。你需要一些强大的力量,我建议你在一些重要的硬件上花一些钱。
标签: c# performance design-patterns