【发布时间】:2010-01-10 23:58:19
【问题描述】:
我正在评估具有 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
【问题讨论】:
-
我想看看这个问题的答案。你的情况对我来说似乎很奇怪。但人们可能会觉得有帮助的一件事......
uname -a的输出是什么? -
“我还没有接近耗尽系统的内存” 但是缓存(特别是 CPU 缓存 L1)呢?现实世界的性能受到缓存使用情况的严重影响。
-
@dmckee:缓存争用可能是个问题;有没有简单的方法来验证这一点?
-
@Omnifarious:添加了 uname 信息
-
另一个随机建议,oprofile (oprofile.sourceforge.net) 可能会让您知道发生了什么。
标签: linux performance memory hsqldb numa