linux - 同时启动进程比错开进程慢;为什么?

标签 linux performance memory hsqldb numa

我正在评估具有 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 绑定(bind)(同一内存节点上的内存争用),但机器显然只有 1 个内存节点(只有/sys/devices/system/node/node0),而且每个客户端只占用 0.8%内存。

它似乎也不是由于 hsqldb 实例的 CPU 绑定(bind),因为快速和慢速行为都可以通过重新启动客户端(并等待/不等待一秒钟)看到,让相同的 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

最佳答案

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

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

关于linux - 同时启动进程比错开进程慢;为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2039178/

相关文章:

Android - BitmapFactory.decodeByteArray - OutOfMemoryError (OOM)

linux - jq - 转义键名中的反斜杠

linux - ld 找不到 `-lnsl`

c++ - 我在哪里可以学习如何使 C++ 程序与操作系统 (Linux) 交互

android - 对于 android 开发,我可以在 ImageView 上使用 JPG 图像而不是 PNG 图像吗?

检索大数据库记录 (~5MB) 时 PHP(或 MySQL)崩溃

linux - 在 EC2 安全组规则中输入 IP 地址时使用什么格式?

performance - Hadoop 性能

performance - 我应该在 HBase 中使用 prefixfilter 还是 rowkey 范围扫描

java - Android 内存不足错误