返回

GaussDB(DWS)内存报错排查方法:内核不中断下动态内存使用大范围超过最大值时,如何排查?

后端

如何保障内核操作不中断:限制动态内存使用

在数据库系统的内核中,为了确保关键操作不会因为内存不足而中断,通常会对用户执行 SQL 语句时动态分配的内存进行特殊处理。理论上,这些动态分配的内存(称为“dynamic_used_memory”)应该不会大幅超过系统设定的最大动态内存值(“max_dynamic_memory”)。

问题现象:动态内存超限告警

然而,在某些情况下,dynamic_used_memory 可能会超出 max_dynamic_memory。当这种情况发生时,系统将打印以下告警信息:

[INFO][Src:mem_control.cpp:192]Proc mem cgroup usage DynamicUsedMemory:xxx, is bigger than MaxDynamicMemory:xxx.

如果不及时处理,此告警会一直打印,不仅影响系统性能,还可能导致其他问题。

排查步骤:

  • 查看当前动态内存使用情况:
gaussdb=# select sum(cur_dynamic_used_memory) from pg_stat_activity;
  • 查看最大动态内存值:
gaussdb=# show max_dynamic_memory;
  • 查看当前内存使用情况:
free -m
  • 查看当前内存使用情况:
sar -r
  • 查看当前内存使用情况:
vmstat 1 10
  • 查看当前内存使用情况:
top - 10
  • 查看当前内存使用情况:
ps -ef | grep gaussdb

常见问题:

  • 内存使用超过最大内存时,系统会打印告警,告警一直打印,可能会影响系统性能。

  • 内存使用超过最大内存时,系统可能会出现性能问题,如查询速度变慢、系统响应速度变慢等。

解决方案:

  • 查看当前内存使用情况,确定哪个进程占用了较多的内存。
  • 查看哪个进程使用了较多的动态内存:
gaussdb=# select * from pg_stat_activity where state = 'active' order by cur_dynamic_used_memory desc;
  • 确定哪个 SQL 语句导致了内存使用超过最大内存。
  • 优化 SQL 语句,减少内存使用。
  • 增加 max_dynamic_memory 的值。
  • 调整内核参数,如 vm.overcommit_memory 和 vm.swappiness。

注意事项:

  • max_dynamic_memory 参数不能设置的过大,否则可能会导致系统性能问题。
  • 调整内核参数时,请谨慎操作,避免对系统造成负面影响。
  • 如果不确定如何调整内核参数,请咨询系统管理员或 GaussDB 技术支持。

代码示例:

gaussdb=# show max_dynamic_memory;
gaussdb=# select * from pg_stat_activity where state = 'active' order by cur_dynamic_used_memory desc;
vm.overcommit_memory = 1
vm.swappiness = 0

结论:

通过采取上述措施,可以有效防止 dynamic_used_memory 大幅超过 max_dynamic_memory,从而保证内核操作不中断,保障数据库系统的稳定运行。