我正在评估一个在8核机器和16 on上设置的实验系统的性能。我有两个运行在内存中的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绑定(同一个内存节点上的内存争用),但是机器显然只有一个内存节点(只有/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
发布于 2010-01-11 10:15:43
你的“两个主内存Java RDBMS(Hsqldb)”在测试前已经运行了多长时间了?如果你在测试前启动了它们,试着先把它们预热一下。让hotspot来做它的事情,把数据库中的所有if (first_time) { do_initialization(); }
代码都读完,这样垃圾回收器就可以安顿下来了。
此外,同时启动两件事(无论它们是什么)意味着,在最低限度上,这两件事都试图同时完成它们的所有初始化工作(分配内存、在交换中分配页面、查找和加载库等)。因此,这两个程序都在I/O争用中度过了生命的前几毫秒。
https://stackoverflow.com/questions/2039178
复制相似问题