PostgreSQL:具有多个运行功能而没有硬件瓶颈,性能下降

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL:具有多个运行功能而没有硬件瓶颈,性能下降相关的知识,希望对你有一定的参考价值。

我具有简单的功能,如果我运行它,大约需要40秒才能完成。

select * from f_cyklus1(100000000) 

但是如果我在8个独立的实例中运行此函数8次,这意味着所有8个函数都并行运行,则每个实例需要大约210至260秒的时间才能完成。这是性能的巨大下降。我尝试将其编译为8个单独的函数,然后再次运行,但性能没有变化。

select * from f_cyklus1(100000000); 
select * from f_cyklus2(100000000); 
select * from f_cyklus3(100000000); 
select * from f_cyklus4(100000000); 
select * from f_cyklus5(100000000); 
select * from f_cyklus6(100000000); 
select * from f_cyklus7(100000000); 
select * from f_cyklus8(100000000); 

那么,为什么要花40到210-260才能完成?我们的虚拟机有16个CPU,而物理硬件的利用率很低。在测试时,我也是唯一使用Postgre数据库的人。

create or replace function f_cyklus1 (p_rozsah int) returns bigint as -- drop function f_cyklus(int)
$body$
declare 

declare 
  v_exc_context        TEXT;
  v_result             INTEGER;

  p_soucet bigint :=0;
begin

for i in 0..p_rozsah
loop
p_soucet = p_soucet + i;
end loop;

return p_soucet;

EXCEPTION
  WHEN OTHERS THEN
    GET STACKED DIAGNOSTICS v_exc_context = PG_EXCEPTION_CONTEXT;
    PERFORM main.ut_log('ERR', SQLERRM || ' [SQL State: ' || SQLSTATE || '] Context: ' || v_exc_context );
    RAISE;
END;
$body$ LANGUAGE plpgsql

x86_64-pc-linux-gnu上的PostgreSQL 11.6,由gcc(GCC)4.8.5编译20150623(Red Hat 4.8.5-39),64位

虚拟机:Centos 7 + KVM

硬件:2个AMD EPYC 7351 + 256 GB RAM

注:我已经问过类似的问题,我认为这是异步处理造成的,但这表明问题实际上出在原始Postgres性能上,因此我删除了先前的问题并提出了新的问题。

答案

[据我了解,您有8个串行运行,每个40秒,总计320秒,而8个并行运行,总计260秒。并行运行时,各个运行速度较慢,但总并行运行速度较快

这很有意义,因为所有8次运行都共享数据库的资源;它的CPU,内存,磁盘I / O和网络。每个单独的运行都会较慢,但整体运行会更快。

您的函数只是简单地迭代并返回1亿个整数。这不会占用太多的CPU,内存或磁盘,但仍必须通过网络传输它们。每个发送1亿个8字节整数的8个功能约为6.4 GB。 可能的瓶颈是网络

以上是关于PostgreSQL:具有多个运行功能而没有硬件瓶颈,性能下降的主要内容,如果未能解决你的问题,请参考以下文章

服务器硬件及RALD配置实战

只有第一个 Mysqli Insert 查询与 PHP 工作,而其他人失败

操作系统定义功能特征介绍

虚拟主机知识全解

克莱因瓶的恐怖意义是啥?

PostgreSQL 11中具有自动分区创建功能的表分区?