我正在EC2服务器(c1.xlarge)上运行一个每晚使用CPU密集型的Java应用程序,该服务器有8个内核,7.5GBRAM(运行Linux / Ubuntu 9.10 (Karmic ) 64位)。
应用程序是以这样的方式设计的:构造了可变数量的工作人员(每个工作人员都在自己的线程中),并从队列中获取消息来处理它们。
吞吐量是这里关注的主要问题,性能是以处理后的消息/秒来衡量的。应用程序不受RAM限制.就我所能看到的来说,我没有去过任何地方。(虽然我不是Linux的明星。我使用dstat来检查I/O负载(相当低)和CPU等待信号(几乎不存在)。
当产生不同数量的工作人员(工作线程)时,我看到了以下情况。
我原以为吞吐量会呈近线性增长,但事实证明并非如此。
三个问题:
一些更多的背景资料:
流程(每个工人)如下:
最后一项资料:
- They share some heavily used static final maps (used as caches. The maps are memory-intensive, so I can't keep them local to a worker even if I wanted to). Operations that workers perform on these caches are: iterations, lookups, contains (no writes, deletes, etc.)
- These shared maps are accessed without synchronization (no need. right?)
- Workers populate their local data by selecting data from MySQL (based on keys in the received message). So this is a potential bottleneck. However, most of the data are reads, queried tables are optimized with indexes and again not I/O-bound.
- I have to admit that I haven't done much MySQL-server optimizing yet (in terms of `config -params`), but I just don't think that is the problem.
- Berkeley DB (using memcached(b)-client). All workers share one server.
- Lucene (using a home-grown low-level indexer). Each workers has a separate indexer.
这是一个巨大的帖子,我意识到了,但我希望你能给我一些关于这可能是什么,或如何开始监测/推断问题所在的指点。
发布于 2009-12-23 09:53:09
只有侧写才有帮助。
但要检查的是:
发布于 2009-12-23 10:05:44
如果我理解正确的话,多个工作人员都会从同一个队列中提取数据,进行计算,并将结果传递给他们的私人作者,例如:
/ [ worker ] - [ writer, queue ]
[ msg-queue ] - [ worker ] - [ writer, queue ]
\ [ worker ] - [ writer, queue ]工作人员可能会阻塞以进入msg队列,添加一个管理工作项队列的读取器可以解决此问题,如果出现此问题,如下所示:
/ [ worker ] - [ writer, queue ]
[ msg-queue ] - [ fetcher, queue ] - [ worker ] - [ writer, queue ]
\ [ worker ] - [ writer, queue ]我从您的描述中学到的另一件事是,计算以只读的方式使用了一组集合,因此并发性不应该是一个问题。研究使用哪种实现可能是个好主意,即使在代码中没有同步使用,默认情况下,集合类(如Vector )也会同步。
使用集合类的不可变版本将有助于确保默认情况下映射的使用是并行的。
发布于 2020-04-24 06:25:43
猜测您共享而不是阻塞数据结构会产生大量的内存隔离操作,破坏CPU现金。没有阻塞是不可用的。
https://stackoverflow.com/questions/1951546
复制相似问题