我正在评估具有16GB RAM的8核机器上的实验系统设置的性能。我有两个主内存Java RDBMS(hsqldb)正在运行,并针对其中每个运行TPCC客户端(派生自jTPCC / BenchmarkSQL)。
我有启动内容的脚本,例如hsqldb实例以:
开头./hsqld.bash 0 &
./hsqld.bash 1 &
如果我几乎在同一时间启动客户:
./hsql-tpcc.bash 0 &
./hsql-tpcc.bash 1 &
然后,每个客户的初始费率都在500-1000 tpmC左右(这基本上是每分钟交易次数),然后快速(在不到一秒钟内)稳定在200-250 tpmC左右。 OTOH,如果我在开始第二个客户之前等待一两秒钟:
./hsql-tpcc.bash 0 &
sleep 1
./hsql-tpcc.bash 1 &
然后每个客户运行2500+ tpmC。等待超过一秒钟并没有什么不同。
这很奇怪,因为客户端0只与服务器0通信,而客户端1只与服务器1通信。目前还不清楚为什么会出现如此剧烈的性能干扰。
我认为这可能是由于客户端的CPU调度程序亲和性,但在运行缓慢时它们只占单个核心的1-3%(快速运行时为20-25%)。另一个怀疑是客户端的NUMA绑定(同一内存节点上的内存争用),但机器显然只有1个内存节点(只有/ sys / devices / system / node / node0),而且每个客户端只占0.8%记忆。
它似乎也不是由于hsqldb实例的CPU绑定,因为只需重新启动客户端(等待/不等待一秒钟)就可以看到快速和慢速行为,让相同的hsqldb实例运行两者(即hsqldb不必重新启动)。 hsqldb在慢速时占用4-8%CPU,在快速时占用80%CPU,以及4.3%内存。
为什么会发生这种情况还有其他想法?没有涉及磁盘IO,我也不会耗尽系统的内存。提前致谢。其他相关信息如下:
$ uname -a
Linux hammer.csail.mit.edu 2.6.27.35-170.2.94.fc10.x86_64 #1 SMP Thu Oct 1 14:41:38 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
答案 0 :(得分:1)
在测试之前,您的“两个主内存Java RDBMS(hsqldb)”运行了多长时间?如果您在测试之前启动它们,请先尝试将它们加热一下。让热点做它的事情,并通过数据库中的所有if (first_time) { do_initialization(); }
代码,以便垃圾收集器可以安定下来。
此外,同时启动两件事(无论它们是什么)意味着最低限度,两者都试图同时完成所有的init工作(分配内存,在swap中分配页面,查找和加载库)等)。因此,这两个程序在I / O争用中花费了他们生命中的第一毫秒。