数据仓库服务 GAUSSDB(DWS)-GaussDB(DWS) PL/Java语言函数:相关GUC参数

时间:2024-12-09 15:13:09

相关GUC参数

  • udf_memory_limit

    系统级别的GUC参数,用于限制每个CN、DN执行UDF可以使用的物理内存量,默认为0.05 * max_process_memory。可通过修改postgresql.conf文件进行配置,配置后需要重启数据库服务后才可生效。

    • udf_memory_limit是max_process_memory的一部分。每个CN、DN启动时,会预留(udf_memory_limit - 200MB)内存供UDF Worker进程使用。CN、DN和UDF Worker是不同的进程,但CN、DN自动少用一部分内存,把这部分内存节省下来供UDF Worker进程使用。

      例如:在某DN上把max_process_memory设置为10GB,udf_memory_limit设置为4GB,则此DN最多使用10GB - (4GB - 200MB)=6.2GB内存。即使用户没有执行任何UDF,则此DN也最多只能使用6.2GB内存。默认情况下,udf_memory_limit为0.05 * max_process_memory。查询pv_total_memory_detail视图时可以发现,process_used_memory永远不会超过max_process_memory - (udf_memory_limit - 200MB)。

    • UDF进程断连时会有报错提示。当出现“memory in UDF Work Process is limited by cgroup: [usage: xxx, max_usage_history: xxx, limit: xxx]”时,可以根据提示判断当前内存使用情况。报错中的usage表示UDF进程被KILL后剩余UDF进程的总物理内存使用量;max_usage_history表示UDF实例启动后历史上使用过的最大内存量,limit表示UDF进程使用内存的最大限制量。如果max_usage_history值接近limit值说明当前集群存在内存超过限制的风险,需要优化业务或按实际情况调整udf_memory_limit参数限制。
    • 一个CN执行最简单的Java UDF函数,使用的物理内存量大约为50MB,用户可以根据自己Java函数的内存使用量和并发度设置此参数。新增此参数后,不再建议用户设置UDFWorkerMemHardLimit和FencedUDFMemoryLimit。
    • 当UDF进程并发度过大,内存超出udf_memory_limit设置值时会导致进程退出等非预期情况,该场景下执行结果可能不可靠,强烈建议根据实际情况进行参数设置,保留足够内存余量。如果系统记录有/var/log/messages,可查看该日志文件是否存在因超过cgroup内存限制而造成内存不足。内存严重不足时,甚至可能导致UDF master进程退出,可以查看UDF日志进行分析,默认的UDF日志路径在$GAUSS LOG /cm/cm_agent/pg_log下。例如,出现以下日志时就说明内存资源严重不足,导致了UDF master进程退出,需要检查udf_memory_limit参数设置。

      0 [BACKEND] FATAL: poll() failed: Bad address, please check the parameter:udf_memory_limit to make sure there is enough memory.

  • FencedUDFMemoryLimit

    会话级别的GUC参数,用户限制会话发起的单个Fenced UDF Worker进程的最大虚拟内存使用量,设置方法如下:

    SET FencedUDFMemoryLimit='512MB';

    该参数的取值范围为 (150MB, 1G],当设置大于1G时会立即报错,当设置小于等于150MB时,则会在调用函数时报错。

    • FencedUDFMemoryLimit设置为0,表示不控制Fenced UDF Worker的虚拟内存使用量。
    • 建议通过设置udf_memory_limit控制Fenced UDF Worker使用的物理内存量。不建议用户使用FencedUDFMemoryLimit,尤其在使用Java UDF时不建议用户设置此参数。但是如果用户非常清楚设置该参数带来的影响,可以参考下列信息进行设置:
      • C UDF worker启动之后,占用的虚拟内存约为200MB,占用的物理内存约为16MB。
      • Java UDF worker启动之后,占用的虚拟内存约为2.5GB,占用的物理内存约为50MB。
support.huaweicloud.com/devg-910-dws/dws_04_0509.html