Amazon Redshift中的监控工具

时间:2014-04-03 06:58:16

标签: postgresql amazon-redshift

在DB2中,我们有db2top来帮助监视数据库活动。

Amazon Redshift中是否有可用的等效内容?

2 个答案:

答案 0 :(得分:5)

我尝试过pgtop(http://search.cpan.org/dist/pgtop/pgtop)并且它确实适用于Redshift,但我发现它并不特别有用,因为Redshift不处理事务性流量。我通常会使用

select * from SVV_QUERY_INFLIGHT order by query, sequence;

select pid, user_name, starttime, query from stv_recents where status='Running';

显示当前活动。你可以使用

select relation::regclass, mode, pid from pg_locks where locktype != 'virtualxid' ;

显示锁定。我也喜欢

select * from stv_wlm_query_state where queue_time > 0;

显示是否存在队列争用,这意味着我们需要调整WLM配置。我喜欢的另一个查询是

select query, step, rows, workmem, label, is_diskbased from svl_query_summary;

最值得注意的是因为我想知道查询是否必须写入磁盘意味着内存不足。除了使用Cloudwatch警报进行CPU和磁盘使用之外,我们的定期监控更倾向于分析表结构。使用http://docs.aws.amazon.com/redshift/latest/dg/c_analyzing-table-design.html中的脚本进行分析和真空分析并定期分析。

答案 1 :(得分:2)

如果您对监控硬件指标(CPU,磁盘空间,读/写IOP /延迟/吞吐量)感兴趣,可以在AWS提供的cloudwatch控制台上查看这些指标。

AWS还提供了一个仪表板来监控正在运行和已完成的查询。但是,根据我的经验,它并未显示所有这些都使调试性能问题变得非常具有挑战性。您可能希望收集和存储的一些有用的聚合度量标准可能是:

  1. 每个用户触发的查询:绘制上述数据有助于发现特定用户对群集使用情况的异常

               SELECT * FROM stv_recents WHERE status = 'Running';
    
  2. 查询计数和排队/运行/返回状态的平均时间:如果1个队列中处于“运行”状态的平均时间非常长,则可能会影响性能其他队列中的查询也是如此。 (这是因为WLM设置仅允许限制内存使用和CPU利用率)

               SELECT * FROM stv_wlm_query_state;
    
  3. 识别错误的查询:识别写得不好的查询在完成执行之后并不简单(至少根据我的经验),一些代理可以帮助清除错误的查询还在执行。跨节点的数量的 行广播就是这样的指标。以下查询将提供此数据。

    SELECT wlm.query AS query_id,
           wlm.state,
           wlm.service_class AS queue,
           CONVERT_TIMEZONE('Asia/Calcutta',wlm.wlm_start_time) AS starttime,
           wlm.slot_count,
           pg_user.usename AS username,
           ex.inner_bcast_count,
           bcast.bcast_rows,
           CAST((wlm.exec_time) AS float) / 1000000 AS exec_time,
           CAST((wlm.queue_time) AS float) / 1000000 AS queue_time,
           CAST(SUM(qs.workmem) AS float) / 1000000000 AS workmem,
           SUM(CASE WHEN qs.is_diskbased = 't' THEN 1 ELSE 0 END) AS num_diskhits
           FROM stv_wlm_query_state wlm
            LEFT JOIN svv_query_state qs ON qs.query = wlm.query
            LEFT JOIN pg_user ON qs.userid = pg_user.usesysid
            LEFT JOIN (SELECT DISTINCT query, 
                           SUM(ROWS) AS bcast_rows
                       FROM stl_bcast
                       GROUP BY 1) bcast ON bcast.query = wlm.query
            LEFT JOIN (SELECT DISTINCT ex.query,
                       COUNT(*) inner_bcast_count
                       FROM stl_explain ex,
                       stv_wlm_query_state wlm
                       WHERE wlm.query = ex.query
                       AND   wlm.state = 'Running'
                       AND   ex.plannode LIKE ('%%DS_BCAST_INNER%%')
                       GROUP BY 1) ex ON ex.query = wlm.query
    GROUP BY 1,
     2,
     3,
     4,
     5,
     6,
     7,
     8,
     9,
     10
    
  4. 正如另一个答案中所指出的,最好的方法是构建自定义工具来收集和监控这些指标以及您希望跟踪RedShift使用情况的任何其他指标。

    您可以查看RedEye。它需要预先安装的Statsd和MySQL实例。该工具收集硬件和查询性能的一组指标,并将其存储在上述数据库中。