注意:我正在寻找有关如何调试此问题的任何提示,不一定是此特定问题的直接答案。
我正在测量用于我们系统的 PipelineDB 的性能。我已经定义了一些连续的视图(计算总和,top-K 等),从单个流(大约 20 列,一些文本,主要是整数和布尔值)馈送。测试是用 Python 编写的,我使用 psycopg2 cursor.copy_from() 函数来实现最大性能。当连续视图指定的工作不太复杂时,PipelineDB 表现良好。但是,当我要求它计算许多 top-K 结果或许多 percentile_cont() 值时,测试挂起并出现以下症状:
- (单个)“worker0”进程开始占用 100% CPU
- 输入过程显示它正在运行COPY命令,从不切换到IDLE(正常工作时,它在COPY和IDLE之间切换)。
- 测试挂起(即 copy_from() 函数调用不返回)
下面是“ps -ef”命令的输出,显示了大约一分钟或运行测试后的所有 pipelinedb 进程。请注意,worker0 进程自测试开始以来正在消耗 100% 的 CPU。它永远不会恢复正常工作('top' 表明它正在消耗 100% 的 CPU)
测试日志显示它在前约 1 秒内运行正常,插入了约 30,000 个事件(每批 100 个),然后它挂起,因为对 copy_from() 函数的调用没有返回。
当我减少 PipelineDB 的工作量时(通过删除一些连续视图),测试工作正常,每秒插入次数高达 20,000 次,持续至少一分钟。
我想指出,所有事件都具有相同的时间戳,并且所有视图都有一个“GROUP BY minute”子句,因此在测试期间应该在每个连续视图中创建/更新一行。
我已经使用了一些配置参数,特别是与内存缓冲区大小、同步方法、时间间隔、max_wait 等、工作人员数量相关的配置参数,但找不到任何可以避免该问题的组合。
我不知道我遇到的是 PipelineDB 问题还是 PostgreSQL 问题。当然,这不是预期的行为,在实际应用中是不能容忍的。欢迎任何提示、猜测、直觉等。
[orens@rd10 ~]$ps -ef | grep pipelinedb
UID PID PPID C STIME TTY TIME CMD
orens 3005 3004 0 11:17 ? 00:00:00 pipelinedb: logger process
orens 3007 3004 0 11:17 ? 00:00:00 pipelinedb: checkpointer process
orens 3008 3004 0 11:17 ? 00:00:00 pipelinedb: writer process
orens 3009 3004 0 11:17 ? 00:00:00 pipelinedb: wal writer process
orens 3010 3004 0 11:17 ? 00:00:00 pipelinedb: autovacuum launcher process
orens 3011 3004 0 11:17 ? 00:00:00 pipelinedb: stats collector process
orens 3012 3004 0 11:17 ? 00:00:00 pipelinedb: pipelinedb scheduler process
orens 3014 3004 0 11:17 ? 00:00:00 pipelinedb: bgworker: reaper0 [pipeline]
orens 3015 3004 0 11:17 ? 00:00:00 pipelinedb: bgworker: queue0 [pipeline]
orens 3016 3004 0 11:17 ? 00:00:00 pipelinedb: bgworker: combiner1 [pipeline]
orens 3017 3004 0 11:17 ? 00:00:00 pipelinedb: bgworker: combiner0 [pipeline]
orens 3018 3004 0 11:17 ? 00:00:00 pipelinedb: bgworker: worker0 [pipeline]
orens 3046 3004 0 11:17 ? 00:00:00 pipelinedb: bgworker: reaper0 [db1]
orens 3050 3004 0 11:17 ? 00:00:00 pipelinedb: bgworker: queue0 [db1]
orens 3052 3004 0 11:17 ? 00:00:00 pipelinedb: bgworker: combiner0 [db1]
orens 3056 3004 90 11:17 ? 00:01:06 pipelinedb: bgworker: worker0 [db1]
orens 3132 3004 1 11:17 ? 00:00:01 pipelinedb: ut_user db1 ::1(58830) COPY
[orens@rd10 ~]$