前言

数据库正常运行离不开I/O的使用,在操作系统上,I/O又离不开存储的性能及使用方式,我们可以在存储层利用raid条带化技术使IOPS达到最佳性能。

本篇文章有助于确认数据库I/O使用率过高的原因 ,以及解决方法。

确定I/O使用率过高的原因

1.需要数据库内置的sys_stat_statements扩展

并需要开启

track_io_timing = on

track_wait_timing = on

参考官方文档:https://help.kingbase.com.cn/v8/perfor/performance-optimization/performance-optimization-6.html?highlight=_stat_statements

使用以下语句查看使用 I/O 消耗前五 SQL 语句:

SELECT userid::regrole, dbid, query
FROM sys_stat_statements
ORDER BY blk_read_time + blk_write_time desc
LIMIT 5;

2.长时间运行的事务

长时间运行的事务可能导致 I/O 使用率过高。

以下sql有助于查看运行时间最长的连接:

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM sys_stat_activity
WHERE pid <> sys_backend_pid() and state IN ('idle in transaction', 'active')
ORDER BY duration desc;

3.检查点消耗的I/O

数据库生成检查点会将脏块写入磁盘,为了数据安全而持久化数据。这个过程需要消耗I/O资源。有时可以从sys_log日志中看到,“检查点过于频繁的字样”,或者从数据库日志中看到checkpoint_write耗时过长。

通过sys_stat_bgwriter 显示有关后台写进程的活动的统计信息。可以计算已经被执行的计划中检查点的数量,在文件被写入磁盘的检查点处理部分花费的总时间等,详情可参考官方文档 https://help.kingbase.com.cn/v8/admin/reference/ref-database-parameter/ref-dynamic-performance-views/sys_stat_bgwriter.html?highlight=sys_stat_bgwriter

4.vacuum消耗I/O

vacuum是数据库中的重I/O操作,由于MVCC特性,vacuum操作不可避免。

以下语句帮助查看vacuum的发生频率。

SELECT schemaname, relname, n_dead_tup, n_live_tup, autovacuum_count, last_vacuum, last_autovacuum, last_autoanalyze, autovacuum_count, autoanalyze_count
FROM sys_stat_all_tables WHERE n_live_tup > 0;
  • last_autovacuum:上次 autovacuum 在表上运行的日期和时间。
  • autovacuum_count:autovacuum表的次数。
  • autoanalyze_count:autoanalyze表的次数。

解决 I/O 使用率过高的问题

1.EXPLAIN ANALYZE 命令进一步查询sql的执行机会,并对其进行优化。

2.终止长时间运行的事务

若要终止会话的进程 PID,需要使用以下查询:

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM sys_stat_activity
WHERE pid <> sys_backend_pid() and state IN ('idle in transaction', 'active')
ORDER BY duration DESC;

还可以按其他条件进行筛选,例如 usename(用户名)或 datname(数据库名称)。

获取会话的 PID 后,可以使用以下语句终止它:

SELECT pg_terminate_backend(pid);

3.参数优化

如果观察到检查点发生频率过高,可以增大 max_wal_size 参数。两个检查点之间的间隔应该接近服务器上设置的 checkpoint_timeout 值。

通过以下方法设置max_wal_size一个合理的值:

运行以下查询以获取当前的 WAL LSN,然后记下结果:

select pg_current_wal_lsn();

等待 checkpoint_timeout 设置的秒数。 然后运行以下查询以获取当前的 WAL LSN,然后记下结果:

select pg_current_wal_lsn();

运行以下查询,计算两个lsn结果差值(以 GB 为单位):

select round (sys_wal_lsn_diff ('LSN value when run second time', 'LSN value when run first time')/1024/1024/1024,2) WAL_CHANGE_GB;
  • checkpoint_completion_target:建议将值设置为 0.9。 例如,为 10 分钟的 checkpoint_timeout 使用值 0.9 表示完成检查点的目标是 540 秒(0.9*600 秒)。 值 0.9 可作为 I/O 负载的评估值。 使用更激进的 checkpoint_completion_target 值可能导致服务器上的 I/O 负载增加。

  • checkpoint_timeout:可以增大 checkpoint_timeout 值,而不是使用默认值。 增大该值时,虽然I/O负载会降低,但也请考虑到会增大故障恢复时间。

4.优化 autovacuum 进程

持续运行自动清理任务可能会影响服务器上的 CPU 和 IO 使用率。 可能的原因如下:

如果 maintenance_work_mem 较低,则可将此参数增加到 2 GB。 一般的经验是,为每 1 GB 的 RAM 分配50MB的maintenance_work_mem 。

自动清理任务每隔 autovacuum_naptime 秒尝试在每个数据库上启动一个worker。

例如,如果一个服务器有 60 个数据库并且 autovacuum_naptime 设置为 60 秒,那么自动清理woker每秒启动一次 [autovacuum_naptime/DB 数]。

如果有最老事务阻止了vacuum的进行,那么vacuum worker会在表上做无用功,这也是需要消耗I/O的,所以对于未结束的长事务我们需要重点监控。

5.使用高性能存储,扩展磁盘IOPS能力。

KingbaseESV8R6识别IO使用率过高的更多相关文章

  1. 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(下)

    <Troubleshooting SQL Server>读书笔记-CPU使用率过高(下) 第三章 High CPU Utilization. CPU使用率过高的常见原因 查询优化器会尽量从 ...

  2. [Oracle] 某游戏大区DB IO负载过高分析

    某游戏大区DB IO负载过高分析 [问题] 下图信息看出机器IO负载过高, IO使用率: 平均值 50%, 峰值 98%, 业务高峰时间段(19:00-22:00)IO使用率持续80%以上. [分析] ...

  3. 性能测试 | Linux系统top命令中的io使用率,很多人都误解了它的具体含义

    body{ text-align:left; width:80%; margin:10px 100px; } 最近在做连续数据流的缓冲系统,C语言代码实现后,粗略测试了下,功能上应该没有问题.那么,接 ...

  4. 06 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?

    上一节我讲了 CPU 使用率是什么,并通过一个案例教你使用 top.vmstat.pidstat 等工具,排查高 CPU 使用率的进程,然后再使用 perf top 工具,定位应用内部函数的问题.不过 ...

  5. kubelet CPU 使用率过高问题排查

    kubelet CPU 使用率过高问题排查 问题背景 客户的k8s集群环境,发现所有的worker节点的kubelet进程的CPU使用率长时间占用过高,通过pidstat可以看到CPU使用率高达100 ...

  6. 4 系统的 CPU 使用率很高,但为啥却找不到高 CPU的应用?

    上一节讲了 CPU 使用率是什么,并通过一个案例教你使用 top.vmstat.pidstat 等工具,排查高 CPU 使用率的进程,然后再使用 perf top 工具,定位应用内部函数的问题.不过就 ...

  7. AIX 中 Paging Space 使用率过高的分析与解决

    AIX操作系统中Paging Space是很重要的设备,当系统中Paging Space使用率过高.系统内存不足时,将影响系统的整体性能,甚至会造成系统的挂起.针对这种情况,通常可以靠增加Paging ...

  8. 服务器CPU使用率过高排查与解决思路

    发现服务器的cpu使用率特别高 排查思路: -使用top或者mpstat查看cpu的使用情况# mpstat -P ALL 2 1Linux 2.6.32-358.el6.x86_64 (linux— ...

  9. linux服务器硬盘IO读写负载高来源定位 pt-ioprofile

    首先 .用top命令查看   1 2 3 4 5 top - 16:15:05 up 6 days,  6:25,  2 users,  load average: 1.45, 1.77, 2.14 ...

  10. Oracle查询语句导致CPU使用率过高问题处理

    解决此问题的关键在于如何找到造成CPU使用率过高的SQL语句.步骤如下: 1.使用Process Explorer工具查看到Oracle进程,双击Oracle进程,在弹出的属性窗口的Threads选项 ...

随机推荐

  1. Swoole从入门到入土(9)——TCP服务器[协程风格]

    上一篇,我们一起初步接触了协程.我相信只有一节的讨论,很多小伙伴对于"协程"与"线程"的区分可能还有点模糊.我们这里以两者的比较作为本篇开头,进行一番比较. 首 ...

  2. 机器学习策略篇:详解为什么是ML策略?(Why ML Strategy?)

    为什么是ML策略? 从一个启发性的例子开始讲,假设正在调试的猫分类器,经过一段时间的调整,系统达到了90%准确率,但对的应用程序来说还不够好. 可能有很多想法去改善的系统,比如,可能想去收集更多的训练 ...

  3. python中的泛型使用TypeVar

    引入为什么需要TypeVar PEP484的作者希望借助typing模块引入类型提示,不改动语言的其它部分.通过精巧的元编程技术,让类 支持[]运算不成问题.但是方括号内的T变量必须在某处定义,否则要 ...

  4. django学习第八天--多表操作删除和修改,子查询连表查询,双下划线跨表查询,聚合查询,分组查询,F查询,Q查询

    orm多条操作 删除和修改 修改 在一对一和一对多关系时,和单表操作是一样的 一对一 一个作者对应一个信息 ad_obj = models.AuthorDetail.objects.get(id=1) ...

  5. python开发接口时,使用jsonschema模块对数据进行校验

    import jsonschema schema = { "type": "object", # 先声明每个键都是对象 "properties&quo ...

  6. RabbitMQ和RPC

    消息队列 消息队列中间件 (Message Queue Middleware,简称 MQ) 是指利用高效可靠的消息传递机制进行与平台无关的数据交流,它可以在分布式环境下扩展进程间的数据通信,并基于数据 ...

  7. 【Azure 应用服务】App Service与Application Gateway组合使用时发生的域名跳转问题如何解决呢?

    问题描述 为App Service配置了应用服务网关(Application Gateway),并且为Application Gateway配置了自定义域名,通过浏览器访问时,出现域名跳转问题,由自定 ...

  8. 当 GraphQL 遇上图数据库,便有了更方便查询数据的方式

    人之初,性本鸽. 大家好,我叫储惠龙(实名上网),你可以叫我小龙人,00 后一枚.目前从事后端开发工作. 今天给大家带来一个简单的为 NebulaGraph 提供 GraphQL 查询支持的 DEMO ...

  9. 云原生 on nLive:云上 Nebula Graph

    本文首发于 Nebula Graph Community 公众号 在 #云原生# 主题分享中,来自 Nebula 云组的 Cloud 专家乔雷同大家分享云的相关知识,本文整理自该次主题直播. 云原生是 ...

  10. Android---Android 开发四大组件

    Android 应用程序组件 应用程序组件是一个Android应用程序的基本构建块.这些组件由应用清单文件松耦合的组织.AndroidManifest.xml描述了应用程序的每个组件,以及他们如何交互 ...