我正在设置postgres 10.4的新安装,在负载测试期间,我一直收到内存不足的错误.
配置:
$ cat /etc/security/limits.conf
postgres hard memlock 508559360
postgres soft memlock 508559360
$ cat /etc/sysctl.conf
vm.nr_hugepages = 248320
vm.hugetlb_shm_group = 118
vm.overcommit_memory=2
vm.swappiness=1
vm.vfs_cache_pressure=50
kernel.sem = 250 32000 32 128
Run Code Online (Sandbox Code Playgroud)
系统规格:
$ cat /proc/cpuinfo | grep "core id" | wc -l
32
Run Code Online (Sandbox Code Playgroud)
每个CPU都是Intel(R)Xeon(R)CPU E5-2695 v4 @ 2.10GHz.16个物理核心,32个逻辑如上所示.
$ free -m
free -m
total used free shared buff/cache available
Mem: 510969 498048 2434 3098 10485 8343
Swap: 1071 1071 0
Run Code Online (Sandbox Code Playgroud)
注意:我们将memlock设置为大约485 GB直接专用于postgres,显示在高"used"列中.
$ df -h /dev/shm …Run Code Online (Sandbox Code Playgroud) 我正在使用逻辑复制将数据从 Postgres 10.4 复制到另一个 Postgres 10.4 实例。
订阅者有多个触发器将事件记录到单个表中。该表有一个触发器,它执行另一个函数(返回一个触发器)来为下游侦听器调用 NOTIFY。
审计表上的触发器如下所示:
CREATE TRIGGER queue_insert
AFTER INSERT ON schema_name.table_name FOR EACH ROW
EXECUTE PROCEDURE notify_downstream()
GO
Run Code Online (Sandbox Code Playgroud)
通知下游定义:
CREATE OR REPLACE FUNCTION schema_name.notify_downstream () RETURNS trigger AS
'
declare
message character varying;
begin
raise log ''notify running!'';
message := ''
{ "id": 'edited for brevity' }
'';
execute ''notify chan_name, '''''' || message || '''''''';
raise log ''Value: %'', message;
return new;
end;
'
LANGUAGE 'plpgsql'
GO
Run Code Online (Sandbox Code Playgroud)
使用日志记录,我能够证明这是在触发。我还可以看到有数据使用:
select pg_notification_queue_usage()
Run Code Online (Sandbox Code Playgroud)
问题是在我插入表中(读作:逻辑复制之外)以触发触发器之前,没有任何侦听器收到消息,然后侦听器收到通知应该从逻辑复制发送的所有消息。
所有这些都运行良好,直到我们转向逻辑复制(我们有一个已退役的本土解决方案,我对此一无所知)。
我没有收到任何可以给我任何线索的错误或奇怪的消息。我也打开了日志记录的详细程度,除了我添加到函数中以验证它们正在运行的日志语句之外,没有看到任何与 …