gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:48 26 4
gpt4 key购买 nike

我想知道当用户调用 PostgreSQL 时,是否有办法为 PL/pgSQL 存储过程设置较低的优先级。当我调用此过程时,调度程序将几乎 100% 的 CPU 设置为我编写的存储过程,让其他进程几乎无人值守。

系统信息:Linux 2.6.30.10-105.2.23.fc11.x86_64 机器上的 PostgreSQL 8.3.11。

最佳答案

以迂回的方式是可能的。

假设您的存储过程称为 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\! 右边的所有内容都视为文字字符串。


一般注意事项

  • 使用操作系统调度程序的优先级可能会触发服务器应用程序行为中不寻常且令人不快的边缘情况。存在风险因素。
  • 这个技巧治标不治本;它不应该是伸手去拿的第一件事。
  • “技术上可行”意味着“可取”。

具体技术注意事项

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

这些条件中的每一个在操作上都是不可取的,不能很好地扩展,或者两者兼而有之。

关于linux - 设置 PL/pgSQL 存储过程的处理器优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4369888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com