设置PL / pgSQL存储过程的处理器优先级

时间:2010-12-06 18:54:37

标签: linux postgresql plpgsql scheduling

我想知道当用户将其调用到PostgreSQL时是否有一种方法可以为PL / pgSQL存储过程设置较低的优先级。当我调用此过程时,调度程序将几乎100%的CPU设置为我编写的存储过程,使其他进程几乎无人看管。

系统信息:Linux 2.6.30.10-105.2.23.fc11.x86_64框中的PostgreSQL 8.3.11。

2 个答案:

答案 0 :(得分:1)

不,不可能。

答案 1 :(得分:1)

可以以回旋方式完成。

说您的存储过程称为uses_too_many_cycles()。让我们为其编写一个psql包装脚本:

\set QUIET on
\set ECHO errors
SELECT pg_backend_pid() AS my_pg_backend_pid
\gset
\pset tuples_only on
\pset format unaligned
\! rm -f /tmp/renice_my_pg_backend
\out     /tmp/renice_my_pg_backend
SELECT '#!/bin/bash' ;
SELECT 'renice +19 --pid ' || :my_pg_backend_pid ;
\out
\! chmod +x /tmp/renice_my_pg_backend
\!          /tmp/renice_my_pg_backend

CALL uses_too_many_cycles();

我们编写一个包含所需命令的微型Shell脚本,然后执行该Shell脚本;我们不能直接执行所需的命令,因为psql会将\!右边的所有内容都当作文字字符串。


一般警告

  • 使用OS调度程序优先级进行播放可能会触发服务器应用程序行为的异常和不愉快的极端情况。有风险因素。
  • 此技巧攻击的是症状而非原因;它应该不是是第一件事。
  • “技术上可行”不是 表示“建议”。

特定技术警告

  • 降低的OS调度程序优先级将一直持续到受影响的PostgreSQL支持的进程的生命周期,除非您重置它。
  • 如果启用了并行查询,则降低的调度程序优先级将不会被PostgreSQL启动的任何辅助后端进程继承。
  • 取决于您的Linux发行版,renice(1)语法可能有所不同。
  • 仅在满足以下条件之一时,此技巧才有效:
    • 执行OS的用户是PostgreSQL用户
    • 执行操作系统的用户为root
    • 执行OS的用户通过某种机制(sudoers,PAM,...)被授予renice(1)其他用户进程或PostgreSQL用户进程的权限
    • 包装为setuid特权脚本

每种情况在操作上都不可取,不能很好地扩展,或者两者兼有。