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