返回
GaussDB(DWS)内存报错排查方法:内核不中断下动态内存使用大范围超过最大值时,如何排查?
后端
2023-10-09 15:20:37
如何保障内核操作不中断:限制动态内存使用
在数据库系统的内核中,为了确保关键操作不会因为内存不足而中断,通常会对用户执行 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,从而保证内核操作不中断,保障数据库系统的稳定运行。