2

我正在评估具有 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
4

1 回答 1

1

您的“两个主内存 Java RDBMS (hsqldb)”在测试前运行了多长时间?如果您在测试前就开始使用它们,请先尝试让它们热身。让热点做这件事,并通过if (first_time) { do_initialization(); }数据库中的所有代码,以便垃圾收集器可以安定下来。

此外,同时启动两件事(无论它们是什么)意味着至少,两者都试图同时完成所有的初始化工作(分配内存、在交换中分配页面、查找和加载库等)。 )。因此,这两个程序都在 I/O 争用中度过了它们生命的最初几毫秒。

于 2010-01-11T02:15:42.620 回答