执行查询报memory is temporarily unavailable

问题描述:客户执行查询的时候报memory is temporarily unavailable

告警信息:ERROR: memory is temporarily unavailable

处理过程:

连接报错DN,执行该报错语句,并在另一个是窗口中反复执行查看PV_TOTAL_MEMORY_DETAIL视图,关注dynamic_used_memory的变化。

执行查询报memory is temporarily unavailable_第1张图片

执行查询报memory is temporarily unavailable_第2张图片

如图,dynamic_used_memory越来越大,最后超过max_dynamic_memory后,
前台报错(也可能在快超过max_dynamic_memory的时候报错)
由此,可推断需修改max_process_memory使其可分配更多的max_dynamic_memory

 根因:

max_process_memory为服务器节点上LibrA实例的最大可用内存,
包括共享内存(shared_buffers)最大值,cstore_buffers最大值,
comm_usable_memory最大值(comm_tcp_mode=false时生效)和执行时动态分配内存,
当作业申请的内存超过了给定限制时,会因为内存申请失败触发异常处理。
当并发高的时候,max_process_memory设置太小DN的内存就会不够用

解决方法: 

使用free -g核实客户机器性能:

由此,通过计算公式:
 CN:(RAM * 0.8)/ (CN+1)=(128 * 0.8) / (3+1)=25.6
 DN:(RAM * 0.8)/ (DN+1)=(128 * 0.8) / (3+1)=25.6

使用如下命令重新设置max_process_memory大小:
 gs_guc set -Z coordinator -D datadir -c "max_process_memory=25G"
 gs_guc set -Z datanode -D datadir -c "max_process_memory=25G"

重启后生效:
gs_om -t stop && gs_om -t start

原文链接:https://support.huawei.com/enterprise/zh/knowledge/KB1001591807/

你可能感兴趣的:(postgresql)