【问题标题】:Centos not using available memoryCentos 不使用可用内存
【发布时间】:2021-09-22 11:03:39
【问题描述】:

我在 64gb 内存的服务器上安装了 Centos,似乎内存使用被抑制了。

我通过运行插入语句得出了这个结论,在该语句中,我将 1000 万行插入到 Timescaledb 和托管在 Docker 上的标准 Postgres 实例中的 Postgres 表中。

我以三种不同的方式监控插入过程:

  1. 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
  1. 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
  1. 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


【解决方案1】:

PostgreSQL 也使用“未使用”内存,因为它使用缓冲 I/O。所以这个“未使用的内存”被内核用来缓存文件——在数据库服务器的情况下,这些将是数据库文件。这样一来,PostgreSQL 的 I/O 请求就可以从内核缓存中得到处理,而不是引起磁盘 I/O 请求。

【讨论】:

  • 感谢 Laurenz,但我看到另一个虚拟机上的预期内存使用量增加了完全相同的测试。而且我在使用 spark 时也遇到了问题服务器上的内存问题,所以我认为这不是 Postgres 特有的问题?
猜你喜欢
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 2011-02-01
  • 2017-05-21
  • 2013-07-06
相关资源
最近更新 更多