更新时间:2022-07-29 GMT+08:00

I/O优先级调度

背景信息

在导入或者查询场景下,进行导入作业或者复杂查询作业的IO资源控制。

IO资源管理提供两种模式的控制方式,即优先级模式和上限数值模式,它们均可用于Session级别或者用户级别的作业IO资源控制。

IO资源管理的设计如图1所示:

图1 IO资源管理设计图示

IO资源管理通过以下几个维度来进行分析:

  • 只考虑特定语句的作业的IO管控。对于写IO的控制,可以对INSERT INTO SELECT,COPY FROM, CREATE TABLE AS 这几种语句进行控制。对于读IO操作来说,需要根据优化器的评估计算出要扫描的数据量,通常单DN数据量大约超过500MB时就会触发IO控制。VACUUM FULL, “CREATE INDEX”, “CLUSTER TABLE USING INDEX”, “ANALYZE”, “MERGE INTO”作为读写混合的场景,也可以在一定条件下触发IO的控制。
  • 需要用户手动设置GUC参数或者调整资源池来引入IO控制。
  • GUC参数可对session级IO进行控制,包括优先级模式io_priority,和上限数值模式io_limits两种。
  • 可以通过用户关联资源池来实现用户级别的IO控制,需要设置资源池属性io_limits, 或者io_priority.
  • io_limits作为上限模式,控制每秒可以触发的IO请求数量。默认为0,表示不控制。对于行存,以万次每秒为单位,对于列存,以次每秒为单位。
  • 在磁盘使用率达到90以上时,会触发IO优先级模式,优先级通过io_priority 指定。io_priority提供三种优先级,分别是High, Medium, Low,相当于控制作业触发IO比例的80%、50%及20%。默认为None,表示不控制。
    • 对于行存,由于缓冲区策略,读写IO请求并不在真正读写磁盘过程中控制,而是在读写缓冲区过程中控制。io_limits以万次每秒为单位,可设置100左右。对于行存建议使用io_priority进行控制,防止在IO比较宽松的环境下仍然做控制造成IO资源不能得到充分利用。
    • 列存查询和导入的机制跟行存不同,列存的io_limits可以设置100左右,如果设置过大,起不到控制IO的作用。

查看IO资源管理相关视图

  • pg_session_iostat提供session级IO资源监控
    1
    select * from pg_session_iostat;
    
  • pg_user_iostat提供user级IO资源监控
    1
    select * from pg_user_iostat('username');