Dan*_*lia 10 c# performance design-patterns
背景
我们一直在努力尝试为"高性能"应用程序提出解决方案.该应用程序基本上是一个高吞吐量的内存管理器,具有同步回磁盘."读取"和"写入"非常高,每秒约3000次交易.我们尝试做尽可能多的内存,但最终得到的数据陈旧,需要刷新到磁盘中,而这正是一个巨大的"瓶颈"随之而来.该应用程序是多线程的,有大约50个线程.没有IPC(进程间通信)
尝试
我们最初是用Java编写的,它运行得很好,直到一定的负载,瓶颈被击中而且它无法跟上.然后我们在C#中尝试了它,并且达到了相同的瓶颈.我们尝试使用非托管代码(C#),虽然在初始测试中使用MMF(内存映射文件)非常快,但在生产中,读取速度很慢(正在使用视图).我们确实尝试过CouchBase,但我们偶然发现了围绕高网络利用率的问题.这可能是我们的配置不佳!
额外信息:在我们的Java尝试(非MMF)中,我们的线程与需要刷新到磁盘的信息队列构建到无法跟上"写入"磁盘的程度.在我们的C#Memory-Map文件方法中,问题是READS非常慢,而且WRITES工作正常.由于某种原因,视图很慢!
题
所以问题是,你打算传输大量数据的情况; 有人可以协助一种可能有帮助的方法或建筑设计吗?我知道这似乎有点宽泛,但我认为高性能,高吞吐量的具体性质应该缩小答案范围.
任何人都可以保证在这样的水平上使用Couchbase,MongoDB或Cassandra吗?其他想法或解决方案将不胜感激.
海量数据和磁盘访问。我们正在谈论什么样的磁盘?如果您处理多个文件,HDD 往往会花费大量时间来移动磁头。(不过,如果您使用 SSD,这应该不是问题。)此外,您应该利用内存映射文件以页面大小的块进行管理的事实。如果可能的话,数据结构应与页边界对齐。
但无论如何,您必须确保知道瓶颈是什么。例如,如果您实际上由于线程同步而损失了时间,那么优化数据结构不会有太大帮助。如果您使用的是 HDD,页面对齐可能不如将所有内容以某种方式填充到单个文件中更有帮助。因此,请使用适当的工具来找出哪些刹车仍然阻碍您。
使用通用数据库实现可能不会像您希望的那样为您提供帮助。毕竟,它们是通用的。如果性能确实是一个重要问题,那么考虑到您的需求的特殊实现可能会优于这些更通用的实现。