【问题标题】:Set processor priority of PL/pgSQL stored procedures设置 PL/pgSQL 存储过程的处理器优先级
【发布时间】:2010-12-06 18:54:37
【问题描述】:
我想知道当用户将 PL/pgSQL 存储过程调用到 PostgreSQL 时,是否有办法为它设置较低的优先级。当我调用此过程时,调度程序将几乎 100% 的 CPU 设置给我编写的存储过程,而其他进程几乎无人看管。
系统信息:Linux 2.6.30.10-105.2.23.fc11.x86_64 机器上的 PostgreSQL 8.3.11。
【问题讨论】:
标签:
linux
postgresql
plpgsql
scheduling
【解决方案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-特权脚本中
这些条件中的每一个在操作上都是不可取的,不能很好地扩展,或者两者兼而有之。