跳到主要内容

资源管理

pg_pcpu_limit 的原理:为进程预设一个 cpu 占用率上限,并实时监控进程是否超出此上限值,若超出则让该进程暂停运行一段时间。pg_pcpu_limit 使用 SIGSTOP 和 SIGCONT 这两个信号来控制进程。它不会修改进程的 nice 值,而是通过监控进程的 CPU 占用率来做出动态调整。

限制程序 CPU 使用率:

  1. 指定 PID 号

    # 限制PID 为21203 的程式其CPU 用量上限为50%
    pg_pcpu_limit --pid 21203 --limit 50
  2. 指定程序的名称

    pg_pcpu_limit --exe md5sum --limit 50

参数说明:

  • --pid 是进程号
  • --limit 是进程使用 CPU 百分比
  • --exe 是程序名称

CPU 资源控制步骤:

  1. 启动一个客户进程,cpu 资源占满进程

    打开 hsql 运行一个过程,代码如下:

    DECLARE
    V_A NUMBER;
    BEGIN
    while(true)
    loop
    V_A := factorial(20000);
    end loop;
    END;
    /

    image40

  2. 查看 CPU 使用资源情况,使用命令 top

    image41

  3. 使用命令来限制 CPU 资源

    pg_pcpu_limit -p 进程PID -l 使用率
    pg_pcpu_limit -p 1507281 -l 40

    pg_pcpu_limit 启动后会持续监控目标进程,通过 SIGSTOP/SIGCONT 信号将其 CPU 占用压制在指定上限附近。

  4. 查看 CPU 使用资源情况,使用命令 top

    限制前,目标进程的 CPU 占用接近 100%,进程状态为 R(running):

    PID USER ... S %CPU COMMAND
    9945 halo ... R 100.0 awk

    执行 pg_pcpu_limit 限制为 40% 后,CPU 占用明显下降,进程状态变为 T(stopped,被 SIGSTOP 暂停):

    PID USER ... S %CPU COMMAND
    9945 halo ... T 26.7 awk

    说明:限制后的实际 CPU 占用会在设定值(40%)附近波动(受采样周期与进程负载影响),进程状态在 R 与 T 之间快速切换,这正是 SIGSTOP/SIGCONT 控制机制的表现。

限制用户的连接数​

创建用户,并限制:

create user test with password 'halo';

限制用户连接数:

alter user test connection limit 2;

当 test 用户已占用 2 个连接时,连接到第 3 个会话将被拒绝,报错如下:

FATAL: too many connections for role "test"

说明:中文语言环境下该错误信息显示为"致命错误: 由角色"test"发起的连接太多了"。

空闲时会话退出时长​

idle_session_timeout

当一个会话连接长时间没有执行或者活动时,会将会话释放,可以释放缓存。

  • idle_session_timeout:默认值为 0,表示禁用,其单位是毫秒。
alter system set idle_session_timeout=5000;
select pg_reload_conf();
show idle_session_timeout;
idle_session_timeout
----------------------
5s
(1 row)

会话空闲超过 5 秒后,再输入命令将被服务器主动断开,报错如下:

FATAL: terminating connection due to idle-session timeout

说明:该会话需重新连接后方可继续使用。