11.4数据库性能指标

分类: 数据库监控和追踪

数据库性能指标

欢迎回到第 11 章的学习。在上一节,我们学习了数据库连接池监控。现在我们要学习数据库性能指标,这是数据库性能分析的重要基础。

本节将学习:查询执行时间、事务处理时间、锁等待时间、以及数据库资源使用。

查询执行时间

查询执行时间的作用是什么? 衡量数据库查询性能,识别慢查询,优化查询性能。

查询执行时间包括哪些呢?

第一个:平均执行时间。 查询的平均执行时间。

第二个:最大执行时间。 查询的最大执行时间。

第三个:P95/P99 执行时间。 查询的百分位数执行时间。

第四个:执行时间分布。 查询执行时间的分布情况。

如何收集查询执行时间? OpenTelemetry 会自动收集查询执行时间,记录在 Span 的 duration 属性中。

查询执行时间分析:

# Prometheus 查询:平均查询执行时间
avg(db_query_duration_seconds{db_system="mysql"})

# P95 查询执行时间
histogram_quantile(0.95, db_query_duration_seconds_bucket{db_system="mysql"})

# P99 查询执行时间
histogram_quantile(0.99, db_query_duration_seconds_bucket{db_system="mysql"})

# 慢查询数量(> 100ms)
sum(db_query_duration_seconds{db_system="mysql"} > 0.1)

事务处理时间

事务处理时间的作用是什么? 衡量数据库事务性能,识别慢事务,优化事务逻辑。

事务处理时间包括哪些呢?

第一个:事务开始时间。 事务开始的时间戳。

第二个:事务提交时间。 事务提交的时间戳。

第三个:事务回滚时间。 事务回滚的时间戳。

第四个:事务总时长。 从开始到提交或回滚的总时间。

事务处理时间追踪:

@Service
@Transactional
public class OrderService {
    public Order createOrder(OrderRequest request) {
        // OpenTelemetry Transactions are automatically tracked
        // Business begins
        Order order = new Order();
        // ... Business logic
        orderRepository.save(order);
        // Submission of affairs
        return order;
    }
}

锁等待时间

锁等待时间的作用是什么? 衡量数据库锁竞争情况,识别锁等待问题,优化并发性能。

锁等待时间包括哪些呢?

第一个:获取锁等待时间。 等待获取锁的时间。

第二个:锁持有时间。 持有锁的时间。

第三个:锁等待次数。 等待锁的次数。

第四个:死锁检测。 检测死锁情况。

如何收集锁等待时间? 通过数据库监控工具或 OpenTelemetry 自定义指标收集锁等待时间。

MySQL 锁等待查询:

-- Check the current lock waiting status
SELECT 
    r.trx_id waiting_trx_id,
    r.trx_mysql_thread_id waiting_thread,
    r.trx_query waiting_query,
    b.trx_id blocking_trx_id,
    b.trx_mysql_thread_id blocking_thread,
    b.trx_query blocking_query,
    TIMESTAMPDIFF(SECOND, r.trx_wait_started, NOW()) wait_time
FROM information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;

数据库资源使用

数据库资源使用的作用是什么? 监控数据库服务器的资源使用情况,识别资源瓶颈,规划容量扩展。

数据库资源使用包括哪些呢?

第一个:CPU 使用率。 数据库服务器的 CPU 使用率。

第二个:内存使用率。 数据库服务器的内存使用率。

第三个:磁盘 I/O。 数据库的磁盘读写性能。

第四个:网络流量。 数据库的网络传输量。

如何收集资源使用指标? 使用 Node Exporter 或数据库监控工具收集资源使用指标。

资源使用指标收集:

# CPU 使用率
100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 内存使用率
100 * (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes))

# 磁盘 I/O
rate(node_disk_io_time_seconds_total[5m])

# 网络流量
rate(node_network_receive_bytes_total[5m])
rate(node_network_transmit_bytes_total[5m])

本节小结

在本节中,我们学习了数据库性能指标:

第一个是查询执行时间。 衡量数据库查询性能,识别慢查询,优化查询性能。

第二个是事务处理时间。 衡量数据库事务性能,识别慢事务,优化事务逻辑。

第三个是锁等待时间。 衡量数据库锁竞争情况,识别锁等待问题,优化并发性能。

第四个是数据库资源使用。 监控数据库服务器的资源使用情况,识别资源瓶颈,规划容量扩展。

数据库性能指标收集流程: 收集性能指标 → 分析指标数据 → 识别性能问题 → 优化数据库性能 → 提升应用性能。

这就是数据库性能指标。通过数据库性能指标,我们可以全面了解数据库的性能表现和资源使用情况。

在下一节,我们将学习数据库 Dashboard 设计。学习如何设计数据库监控 Dashboard。