【发布时间】:2021-09-22 11:03:39
【问题描述】:
我在 64gb 内存的服务器上安装了 Centos,似乎内存使用被抑制了。
我通过运行插入语句得出了这个结论,在该语句中,我将 1000 万行插入到 Timescaledb 和托管在 Docker 上的标准 Postgres 实例中的 Postgres 表中。
我以三种不同的方式监控插入过程:
- Docker stats timescaledb:
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
timescaledb 73.14% 10.42 MiB / 62.75 GiB 0.02% 8.46 kB / 8.39 kB 0 B / 15.1 GB 12
- free -i 给出以下结果:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16298 avahi 20 0 16.2g 762356 759908 R 41.5 1.2 0:22.72 postgres
16127 avahi 20 0 16.2g 693080 691968 S 4.3 1.1 0:01.29 postgres
16129 avahi 20 0 16.2g 17748 16712 S 2.3 0.0 0:00.87 postgres
1578 root 30 10 1232780 86976 11568 S 0.7 0.1 0:46.34 osqueryd
17014 root 20 0 162264 2480 1596 R 0.7 0.0 0:00.03 top
928 root 20 0 90608 3212 2352 S 0.3 0.0 0:03.47 rngd
16128 avahi 20 0 16.2g 132064 131016 S 0.3 0.2 0:00.18 postgres
- free -h 给出以下结果
total used free shared buff/cache available
Mem: 62G 1.0G 58G 1.1G 3.1G 56G
Swap: 62G 0B 62G
我知道 Timescaledb 是 Postgres 的扩展,它带有自己的内存配置,但是 Timescaledb 的 Docker 容器会自动为您配置这些(例如,有效缓存大小设置为 48gb,而不是 Postgres 提供的默认 4gb和)。我还使用 Apache spark 运行了一个类似的过程,分配给 worker 16gb,它遇到了 oom 错误。此外,我在另一个较小的 VM 上进行了类似的测试,内存使用量按预期增加。所有这一切让我相信这是我在某处遗漏的 Centos 配置设置,与 Timescale/Postgres 无关?
我在 /etc/sysctl.conf 中的 vm.overcommit_memory = 2 和 vm.overcommit_ratio = 95 中添加了以下参数并运行 sysctl -p 来实现这些设置,但这并没有什么不同。
kernel.shmall = 8224280
kernel.shmmax = 33686650880
kernel.shmmni = 4096
vm.overcommit_memory = 2
vm.overcommit_ratio = 95
下面是 cat /proc/meminfo 的输出
MemTotal: 65794240 kB
MemFree: 61098656 kB
MemAvailable: 59252660 kB
Buffers: 2120 kB
Cached: 3467144 kB
SwapCached: 0 kB
Active: 2817620 kB
Inactive: 884816 kB
Active(anon): 1109220 kB
Inactive(anon): 234708 kB
Active(file): 1708400 kB
Inactive(file): 650108 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 65535996 kB
SwapFree: 65535996 kB
Dirty: 88 kB
Writeback: 0 kB
AnonPages: 233188 kB
Mapped: 1175120 kB
Shmem: 1110756 kB
Slab: 204044 kB
SReclaimable: 142700 kB
SUnreclaim: 61344 kB
KernelStack: 7232 kB
PageTables: 14672 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 128040524 kB
Committed_AS: 18709300 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 408824 kB
VmallocChunk: 34325399548 kB
Percpu: 9216 kB
HardwareCorrupted: 0 kB
AnonHugePages: 96256 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 133604 kB
DirectMap2M: 66965504 kB
我可以尝试增加内存使用量吗?是否有我在这里遗漏的配置设置?
提前感谢您的帮助
【问题讨论】:
-
您有 3.1GB 的缓冲区/缓存。这很容易大到足以存储 1000 万个“通常大小”的行。这里没有证据表明存在问题。
-
谢谢 jjanes,不过我的查询确实需要很长时间。在问题服务器上插入需要 22 秒,而在较小的测试虚拟机上只需要 8 秒。我也在问题服务器上测试了更复杂的查询,这些查询通常会占用大量内存,并且所有查询花费的时间都比预期的要长得多。另外,spark oom 错误怎么办?
-
没有证据表明 PostgreSQL 存在问题。我不知道火花。如果您有缓慢的查询,请查看它们。
EXPLAIN (ANALYZE, BUFFERS),并开启track_io_timing。
标签: postgresql memory memory-management centos timescaledb