【问题标题】:Starting processes at same time is slower than staggering; why?同时启动进程比惊人的慢;为什么?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 我已经尝试在启动客户端之前重新启动 hsqldb 服务器(即它们在测试之前已经运行了接近 0 时间),并且也没有在测试之间重新启动它们(即它们'在测试前已经运行了很多分钟,并且经过了几次测试)。这些测试至少运行一分钟,因此异常不是因为缺少预热时间。
猜你喜欢
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 2018-05-09
  • 2016-03-02
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多