10

背景

我们一直在努力尝试为“高性能”应用程序提供解决方案。该应用程序基本上是一个高吞吐量的内存管理器,可以同步回磁盘。“读取”和“写入”非常高,每秒大约 3000 个事务。我们尝试在内存中做尽可能多的事情,但最终数据会变得陈旧,需要刷新到磁盘,这就是一个巨大的“瓶颈”接踵而至的地方。该应用程序是多线程的,大约有 50 个线程。没有IPC(进程间通信)

尝试

我们最初是用 Java 编写的,它工作得很好,直到达到一定的负载,遇到瓶颈并且无法跟上。然后我们在 C# 中进行了尝试,也遇到了同样的瓶颈。我们使用非托管代码 (C#) 进行了尝试,尽管在初始测试中使用 MMF(内存映射文件)非常快,但在生产中,读取速度很慢(使用视图)。我们确实尝试了 CouchBase,但我们偶然发现了围绕高网络利用率的问题。这对我们来说可能是糟糕的配置!

额外信息:在我们的 Java 尝试(非 MMF)中,我们的线程与需要刷新到磁盘的信息队列构建到无法跟上“写入”磁盘的程度。在我们的 C# 内存映射文件方法中,问题是 READS 非常慢,而 WRITES 工作完美。由于某种原因,视图很慢!

问题

所以问题是,您打算传输大量数据的情况;有人可以提供一种可能的方法或架构设计来提供帮助吗?我知道这似乎有点宽泛,但我认为高性能、高吞吐量的具体性质应该缩小答案的范围。

谁能保证在这样的水平上使用 Couchbase、MongoDB 或 Cassandra?其他想法或解决方案将不胜感激。

4

3 回答 3

3

首先,我想明确一点,我几乎没有(如果有的话)构建高性能、可扩展的应用程序的经验。

Martin Fowler 对 LMAX 架构进行了描述,该架构允许应用程序在单个线程上每秒处理大约 600 万个订单。我不确定它是否可以帮助您(因为您似乎需要移动大量数据),但也许您可以从中获得一些想法:http ://martinfowler.com/articles/lmax.html

该架构基于事件溯源,通常用于提供(相对)简单的可扩展性。

于 2012-08-17T08:33:16.700 回答
2

海量数据和磁盘访问。我们在谈论什么样的磁盘?如果您处理多个文件,HDD 往往会花费大量时间来移动磁头。(不过,如果您使用 SSD,这应该不是问题。)此外,您应该利用内存映射文件以页面大小的块进行管理的事实。如果可能,数据结构应与页面边界对齐。

但无论如何,你必须确保你知道瓶颈是什么。例如,如果您实际上由于线程同步而浪费时间,那么优化数据结构就没有多大帮助。而且,如果您使用的是 HDD,页面对齐可能不会像将所有内容以某种方式填充到单个文件中那样有帮助。因此,请使用适当的工具来确定哪些制动器仍在阻碍您。

使用通用数据库实现可能不会像您希望的那样帮助您。毕竟,它们是通用的。如果性能确实是一个很大的问题,那么考虑到您的要求的特殊实现可能会胜过这些更通用的实现。

于 2012-08-17T07:01:30.783 回答
-1

如果您想快速避免持久性和尽可能多的写入队列,并在读取时使用内存疮/缓存。

语言与它无关。\

于 2012-11-02T08:55:43.837 回答