操作系统
资源监控
监控原因: 例如磁盘的空间满,会导致数据库无法执行 SQL,一般都是因为数据激增或者出现笛卡尔积,内存已经放不下这部分数据,开始往磁盘上写临时文件;例如 cpu、内存、磁盘过载,会影响数据库的性能,甚至是数据库的稳定性,例如高耗 sql 一直循环重复多次调用、长连接不释放、同一时间段并发激增。
相关命令:
CPU:vmstat ,sar –u,top
磁盘IO:iostat –xd,sar –d,top
网络IO:iftop -n,ifstat,dstat –nt,sar -n DEV 2 3
磁盘容量:df –h
内存使用:free –m,top或者使用dstat -c -d -g -m -n -p -r -s,该命令整合了vmstat,iostat和ifstat三种命令
dstat命令详解:dstat 是一款非常好用的终端工具,它能够实时监控系统各项资源使用情况,包括 CPU、内存、磁盘、网络等方面
选项:
-c: 显示cpu相关信息
-C #,#,...,total
-d: 显示disk相关信息
-D total,sda,sdb,...
-g:显示page相关统计数据
-m: 显示memory相关统计数据
-n: 显示network相关统计数据
-s: 显示swapped相关的统计数据
--top-cpu:显示最占用CPU的进程
--top-io: 显示最占用io的进程
--top-mem: 显示最占用内存的进程
--top-latency: 显示延迟最大的进程
--raw:显示裸套接字
--socket:套接字
--ipc:进程间通信信息
-p: 显示process相关统计数据
-r: 显示io请求相关的统计数据
监控指标常用系统视图
pg_replication_slots: 视图提供了当前存在于数据库集簇上的所 有复制槽的列表,其中也包括复制槽的当前状态。(下表列举了一些相关列)
| 名称 | 类型 | 引用 | 描述 |
|---|---|---|---|
| slot_name | name | 一个唯一的、集簇范围内的复制槽标识符 | |
| plugin | name | 包含这个逻辑槽正在使用的输出插件的共享对象基础名称,对于物理槽为空值。 | |
| slot_type | text | 槽类型 - physical 或者 logical | |
| datoid | oid | pg_database.oid | 与这个槽相关的数据库的 OID,或者为空值。只有逻辑槽具有相关的数据库。 |
| database | name | pg_database.datname | 与这个槽相关的数据库的名称,或者为空值。只有逻辑槽具有相关的数据库。 |
| active | bool | 如果这个槽当前正在被使用则为真 | |
| active_pid | Int4 | 如果槽当前正在被使用,则记录使用这个槽的会话的进程 ID。如果不活动则为 NULL。 | |
| xmin | xid | 这个槽要需要数据库保留的最旧事务。VACUUM 不能移除被其后续事务删除的元组。 | |
| catalog_xmin | xid | 这个槽要需要数据库保留的影响系统目录的最旧事务。VACUUM 不能移除被其后续事务删除的目录元组。 | |
| restart_lsn | pg_lsn | 可能仍被这个槽的消费者要求的最旧 WA L地址(LSN),并且因此不会在检查点期间自动被移除。 如果这个槽的 LSN 从未被保留过,则为 NULL。 |
pg_stat_replication: 记录复制的相关信息,包括复制用的用户名,复制类型,同步状态等。(下表列举了一些相关列)
| 列 | 类型 | 描述 |
|---|---|---|
| pid | integer | 一个 WAL 发送进程的进程 ID |
| usesysid | oid | 登录到这个 WAL 发送进程的用户的 OID |
| usename | name | 登录到这个 WAL 发送进程的用户的名称 |
| application_name | text | 连接到这个 WAL 发送进程的应用的名称 |
| client_addr | inet | 连接到这个 WAL 发送进程的客户端的 IP 地址。 如果这个域为空,它表示该客户端通过服务器机器上的一个Unix 套接字连接。 |
| client_hostname | text | 连接上的客户端的主机名,由一次对client_addr的逆向 DNS 查找报告。 这个域将只对 IP 连接非空,并且只有在 log_hostname被启用时非空。 |
| client_port | integer | 客户端用来与这个 WAL 发送进程通讯的 TCP 端口号,如果使用 Unix 套接字则为-1 |
| backend_start | timestamp with time zone | 这个进程开始的时间,即客户端是何时连接到这个WAL 发送进程的。 |
| backend_xmin | xid | 由hot_standby_feedback报告的这个后备机的xmin水平线。 |
| state | text | 当前的 WAL 发送进程状态。 |
| sent_lsn | pg_lsn | 在这个连接上发送的最后一个预写式日志的位置 |
| write_lsn | pg_lsn | 被这个后备服务器写入到磁盘的最后一个预写式日志的位置 |
| flush_lsn | pg_lsn | 被这个后备服务器刷入到磁盘的最后一个预写式日志的位置 |
| replay_lsn | pg_lsn | 被重放到这个后备服务器上的数据库中的最后一个预写式日志的位置 |
| sync_priority | integer | 在基于优先的同步复制中,这台后备服务器被选为同步后备的优先级。在基于规定数量的同步复制中,这个值没有效果。 |
| sync_state | text | 这一台后备服务器的同步状态。 |
pg_stat_activity: 每一个服务器进程有一行, 显示与该进程的当前活动相关的信息。(下表列举了一些相关列)
| 列 | 类型 | 描述 |
|---|---|---|
| datid | oid | 这个后端连接到的数据库的OID |
| datname | name | 这个后端连接到的数据库的名称 |
| pid | integer | 这个后端的进程 ID |
| usesysid | oid | 登录到这个后端的用户的 OID |
| usename | name | 登录到这个后端的用户的 OID |
| application_name | text | 连接到这个后端的应用的名称 |
| client_addr | inet | 连接到这个后端的客户端的 IP 地址。如果这个字段为空,它表示客户端通过服务器机器上的一个 Unix 套接字连接或者这是一个内部进程,如自动清理。 |
| client_hostname | text | 已连接的客户端的主机名,由 client_addr 的反向 DNS 查找报告。 这个字段将只对 IP 连接非空,并且只有 log_hostname 被启用时才会非空。 |
| client_port | integer | 客户端用于与此后端通信的 TCP 端口号,如果使用 Unix 套接字,则为 -1。如果该字段为空,它表示这是一个内部服务器进程。 |
| backend_start | timestamp with time zone | 这个进程被启动的时间。对客户端后端来说,这就是客户端连接到服务器的时间。 |
| xact_start | timestamp with time zone | 这个进程的当前事务被启动的时间,如果没有活动事务则为空。 如果当前查询是它的第一个事务,这一列等于 query_start列。 |
| query_start | timestamp with time zone | 当前活动查询被开始的时间,如果 state 不是 active,则为上一个查询开始的时间 |
| state_change | timestamp with time zone | state 上一次被改变的时间 |
| wait_event_type | text | 后端等待的事件类型,如果有的话;否则 NULL。 |
| wait_event | text | 如果后端当前正在等待,则等待事件名称,否则为 NULL。 |
| state | text | 这个后端的当前总体状态。可能的值为: active:后端正在执行一个查询。 idle:后端正在等待一个新的客户端命令。 idle in transaction:后端在一个事务中,但是当前没有正在执行一个查询。 idle in transaction (aborted):这个状态与 idle in transaction 相似,除了在该事务中的一个语句导致了一个错误。 fastpath function call:后端正在执行一个 fast-path 函数。 disabled:如果在这个后端中 track_activities 被禁用,则报告这个状态。 |
| backend_xid | xid | 这个后端的顶层事务标识符,如果存在。 |
| backend_xmin | xid | 当前后端的 xmin 范围。 |
| query | text | 这个后端最近查询的文本。如果 state 为 active,这个字段显示当前正在执行的查询。 在所有其他状态下,它显示上一个被执行的查询。默认情况下,查询文本会被截断至 1024 个字节,这个值可以通过参数 track_activity_query_size 更改。 |
| backend_type | text | 当前后端的类型。可能的类型为 autovacuum launcher, autovacuum worker,logical replication launcher,logical replication worker,parallel worker,background writer,client backend,checkpointer,startup,walreceiver,walsender and walwriter。除此以外,由扩展注册的后台 Worker可 能有额外的类型。 |
pg_stat_all_tables: 记录了每一个表 (包括 TOAST 表)包含一行,该行显示与对该表的访问相关的统计信息。
| 列 | 类型 | 描述 |
|---|---|---|
| relid | oid | 表的 OID |
| schemaname | name | 该表所在的模式的名称 |
| relname | name | 这个表的名称 |
| seq_scan | bigint | 在此表上启动的顺序扫描数 |
| seq_tup_read | bigint | 连续扫描获取的实时行数 |
| idx_scan | bigint | 对这个表发起的索引扫描数 |
| idx_tup_fetch | bigint | 索引扫描获取的实时行数 |
| n_tup_ins | bigint | 插入的行数 |
| n_tup_upd | bigint | 更新的行数(包括 HOT更新的行) |
| n_tup_del | bigint | 删除的行数 |
| n_tup_hot_upd | bigint | HOT 更新的行数(即不需要单独的索引更新) |
| n_live_tup | bigint | 活的行的估计数量 |
| n_dead_tup | bigint | 僵死行的估计数量 |
| n_mod_since_analyze | bigint | 自上次分析此表以来修改的行的估计数量 |
| n_ins_since_vacuum | bigint | 自上次清空此表以来插入的行的估计数量 |
| last_vacuum | timestamp with time zone | 最后一次手动清理这个表(不包括 VACUUM FULL) |
| last_autovacuum | timestamp with time zone | 这个表最后一次被自动清理守护进程清理的时间 |
| last_analyze | timestamp with time zone | 上一次手动分析这个表 |
| last_autoanalyze | timestamp with time zone | 自动清理守护进程最后一次分析这个表 |
| vacuum_count | bigint | 这个表被手动清理的次数(VACUUM FULL 不计数) |
| autovacuum_count | bigint | 这个表被 autovacuum 守护进程清理的次数 |
| analyze_count | bigint | 手动分析这个表的次数 |
| autoanalyze_count | bigint | 这个表被 autovacuum 守护进程分析的次数 |
pg_stat_all_indexes: 记录当前数据库中所有的索引的使用情况
| 列 | 类型 | 描述 |
|---|---|---|
| relid | oid | 对于此索引的表的 OID |
| indexrelid | oid | 这个索引的 OID |
| schemaname | name | 这个索引所在的模式名称 |
| relname | name | 这个索引的表的名称 |
| indexrelname | name | 这个索引的名称 |
| idx_scan | bigint | 在这个索引上开启的索引扫描的数量 |
| idx_tup_read | bigint | 扫描此索引返回的索引项数 |
| idx_tup_fetch | bigint | 使用此索引进行简单索引扫描获取的活动表行数 |
pg_locks: 提供了数据库服务器上活动进程中保持的锁的信息。
| 列 | 类型 | 描述 |
|---|---|---|
| locktype | text | 可锁对象的类型: relation,extend,frozenid,page,tuple,transactionid,virtualxid,spectoken,object,userlock or advisory. |
| database | oid | 锁目标存在的数据库的 OID,如果目标是一个共享对象则为 0,如果目标是一个事务 ID 则为空 |
| relation | oid | 作为锁目标的关系的 OID,如果目标不是一个关系或者只是关系的一部分则此列为空 |
| page | int4 | 作为锁目标的页在关系中的页号,如果目标不是一个关系页或元组则此列为空 |
| tuple | int2 | 作为锁目标的元组在页中的元组号,如果目标不是一个元组则此列为空 |
| virtualxid | text | 作为锁目标的事务虚拟 ID,如果目标不是一个虚拟事务 ID 则此列为空 |
| transactionid | xid | 作为锁目标的事务 ID,如果目标不是一个事务 ID 则此列为空 ID |
| classid | oid | 包含锁目标的系统目录的 OID,如果目标不是一个普通数据库对象则此列为空 |
| objid | oid | 锁目标在它的系统目录中的 OID,如果目标不是一个普通数据库对象则为空 |
| objsubid | int2 | 锁的目标列号(classid 和 objid 指表本身),如果目标是某种其他普通数据库对象则此列为 0,如果目标不是一个普通数据库对象则此列为空 |
| virtualtransaction | text | 保持这个锁或者正在等待这个锁的事务的虚拟 ID |
| pid | int4 | 保持这个锁或者正在等待这个锁的服务器进程的 PID,如果此锁被一个预备事务所持有则此列为空 |
| mode | text | 此进程已持有或者希望持有的锁模式的名称 |
| granted | bool | 如果锁已授予则为真,如果锁被等待则为假 |
| fastpath | bool | 如果锁通过快速路径获得则为真,通过主锁表获得则为假 |
pg_stat_statements: 服务器所执行的所有 SQL 语句的执行统计信息。
| 列 | 类型 | 描述 |
|---|---|---|
| userid | oid | 执行该语句的用户的 OID |
| dbid | oid | 在其中执行该语句的数据库的 OID |
| queryid | queryid | 内部哈希码,从语句的解析树计算得来 |
| query | text | 语句的文本形式 |
| plans | bigint | 计划语句的次数(如果启用了 pg_stat_statements.track_planning,否则为零) |
| total_plan_time | double precision | 计划语句所花费的总时间,以毫秒为单位(如果启用了pg_stat_statements.track_planning,否则为零) |
| min_plan_time | double precision | 计划语句所花费的最短时间,以毫秒为单位(如果启用了pg_stat_statements.track_planning,否则为零) |
| max_plan_time | double precision | 计划语句所花费的最长时间,以毫秒为单位(如果启用了pg_stat_statements.track_planning,否则为零) |
| mean_plan_time | double precision | 计划语句所花费的平均时间,以毫秒为单位(如果启用了pg_stat_statements.track_planning,否则为零) |
| stddev_plan_time | double precision | 计划语句花费的时间的总体标准偏差,以毫秒为单位(如果启用了pg_stat_statements.track_planning,否则为零) |
| calls | bigint | 语句被执行的次数 |
| total_exec_time | double precision | 执行语句所花费的总时间,以毫秒为单位 |
| min_exec_time | double precision | 执行语句所花费的最短时间,以毫秒为单位 |
| max_exec_time | double precision | 执行语句所花费的最长时间,以毫秒为单位 |
| mean_exec_time | double precision | 执行语句的平均时间,以毫秒为单位 |
| stddev_exec_time | double precision | 执行语句花费的时间的总体标准偏差,以毫秒为单位 |
| rows | bigint | 语句检索或影响的总行数 |
| shared_blks_hit | bigint | 语句的共享块缓存命中总数 |
| shared_blks_read | bigint | 语句读取的共享块总数 |
| shared_blks_dirtied | bigint | 被语句弄脏的共享块总数 |
| shared_blks_written | bigint | 语句写入的临时块总数 |
| blk_read_time | double precision | 语句读取块所花费的总时间,以毫秒为单位(如果启用了 track_io_timing,否则为零) |
| blk_write_time | double precision | 语句写入块所花费的总时间,以毫秒为单位(如果启用了 track_io_timing,否则为零) |
| wal_records | bigint | 语句生成的 WAL 记录总数 |
| wal_fpi | bigint | 语句生成的 WAL 整页图像总数 |
| wal_bytes | numeric | 语句生成的 WAL 字节总数 |
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




