ToB企服应用市场:ToB评测及商务社交产业平台

标题: 什么?部署ClickHouse的服务器CPU利用率100%了? [打印本页]

作者: 笑看天下无敌手    时间: 2024-7-29 16:08
标题: 什么?部署ClickHouse的服务器CPU利用率100%了?
配景

    某客户现场的ClickHouse所在服务器资源占用率100%了,引发了服务器告警。观察Grafana监控面板发现,从12点左右出现了大量的碎片写入,从而引起了相关指标的快速上升。
    本文重要通过ClickHouse官方的系统表system.query_log表进行问题排查定位,团结Grafana监控面板最终定位到问题根本原因。
最近写入sql实行是否有非常,判断是否是因为批量的数据写入导致的CPU利用率突增


  1. SELECT   
  2.     event_time,   
  3.     user,   
  4.     query_id AS query,   
  5.     read_rows,   
  6.     read_bytes,   
  7.     result_rows,   
  8.     result_bytes,   
  9.     memory_usage,   
  10.     exception  
  11. FROM clusterAllReplicas('cluster_name', system, query_log)  
  12. WHERE (event_date = today()) AND (event_time >= (now() - 60)) AND (is_initial_query = 1) AND (query NOT LIKE 'INSERT INTO%')  
  13. ORDER BY event_time DESC  
  14. LIMIT 100
复制代码
昨天有没有大于5分钟的慢查询

  1. SELECT   
  2.     event_time,   
  3.     user,   
  4.     query_id AS query,   
  5.     read_rows,   
  6.     read_bytes,   
  7.     result_rows,   
  8.     result_bytes,   
  9.     memory_usage,   
  10.     exception  
  11. FROM clusterAllReplicas('cluster_name', system, query_log)  
  12. WHERE (event_date = yesterday()) AND query_duration_ms > 30000 AND (is_initial_query = 1) AND (query NOT LIKE 'INSERT INTO%')  
  13. ORDER BY query_duration_ms desc  
  14. LIMIT 100
复制代码
磁盘占用最高的前10张表

  1. SELECT   
  2.     database,   
  3.     table,   
  4.     sum(bytes_on_disk) AS bytes_on_disk  
  5. FROM clusterAllReplicas('cluster_name', system, parts)  
  6. WHERE active AND (database != 'system')  
  7. GROUP BY   
  8.     database,   
  9.     table  
  10. ORDER BY bytes_on_disk DESC  
  11. LIMIT 10
复制代码
查询频率前10的用户

  1. SELECT   
  2.     user,   
  3.     count(1) AS query_times,   
  4.     sum(read_bytes) AS query_bytes,   
  5.     sum(read_rows) AS query_rows  
  6. FROM clusterAllReplicas('cluster_name', system, query_log)  
  7. WHERE (event_date = yesterday()) AND (is_initial_query = 1) AND (query NOT LIKE 'INSERT INTO%')  
  8. GROUP BY user  
  9. ORDER BY query_times DESC  
  10. LIMIT 10
复制代码
统计SQL 查询次数,判断哪次查询时间最长以及查询的平均时长

  1. select
  2.         left(query,
  3.         100) as sql,
  4.         count() as queryNum,
  5.         sum(query_duration_ms) as totalTime,
  6.         totalTime / queryNum as avgTime
  7. from
  8.         system.query_log ql
  9. where
  10.         event_time > toDateTime('2024-05-20 12:00:00')
  11.         and event_time < toDateTime('2024-05-20 17:00:00')
  12. group by
  13.         sql
  14. order by
  15.         queryNum desc
  16. limit 10
复制代码
查询不包罗insert into语句的5个小时查询次数凌驾1000次的 SQL

  1. select
  2.         *
  3. from
  4.         (
  5.         select
  6.                 LEFT(query,
  7.                 100) as sql,
  8.                 count() as quneryNum,
  9.                 sum(query_duration_ms) as totalTime,
  10.                 totalTime / queryNum as avgTime
  11.         from
  12.                 system.query_log ql
  13.         where
  14.                 event_time > toDateTime('2024-05-20 12:00:00')
  15.                 and event_time < toDateTime('2024-05-20 17:00:00')
  16.                 and query not like '%INSERT INTO%'
  17.         group by
  18.                 sql
  19.         order by
  20.                 avgTime desc)
  21. where
  22.         queryNum > 1000
  23. limit 50
复制代码
由于上述 SQL均做了截取,故需根据所查询 SQL 进一步匹配 SQL。
  1. select
  2.         query
  3. from
  4.         system.query_log
  5. where
  6.         event_time > toDateTime('2024-05-20 12:00:00')
  7.         and event_time < toDateTime('2024-05-20 17:00:00')
  8.         and query like '%需要匹配的sql查询%'
  9. limit 5;
复制代码
是否有left join查询,如果大表进行left join查询很可能导致CPU过高

  1. select
  2.         *
  3. from
  4.         (
  5.         select
  6.                 LEFT(query,100) as sql,
  7.                 count() as quneryNum,
  8.                 sum(query_duration_ms) as totalTime,
  9.                 totalTime / queryNum as avgTime
  10.         from
  11.                 system.query_log ql
  12.         where
  13.                 sql like '%前面定位到的sql的信息%'
  14.                 and read_rows != 0
  15.                 and event_time > toDateTime('2024-05-20 12:00:00')
  16.                 and event_time < toDateTime('2024-05-20 17:00:00')
  17.                 and query not like '%INSERT INTO%'
  18.         group by
  19.                 sql
  20.         order by
  21.                 queryNum desc)
复制代码
根据小时聚合每个小时查询次数耗时

  1. select
  2.         toHour(event_time) as t,
  3.         count() as queryNum,
  4.         sum(query_duration_ms) as totalTime,
  5.         totalTime / queryNum as avgTime
  6. from
  7.         system.query_log ql
  8. where
  9.         event_time > toDateTime('2024-05-20 08:00:00')
  10.         and event_time < toDateTime('2024-05-20 17:00:00')
  11.         and query not like '%INSERT INTO%'
  12.         and query like '%前面定位到的sql的信息%'
  13.         and read_rows != 0
  14. group by
  15.         t
  16. limit 50
复制代码
根据小时聚合每个分钟查询次数耗时

  1. select
  2.         toMinute(event_time) as t,
  3.         count() as queryNum,
  4.         sum(query_duration_ms) as totalTime,
  5.         totalTime / queryNum as avgTime
  6. from
  7.         system.query_log ql
  8. where
  9.         event_time > toDateTime('2024-05-20 12:00:00')
  10.         and event_time < toDateTime('2024-05-20 13:00:00')
  11.         and query not like '%INSERT INTO%'
  12.         and query like '%前面定位到的sql的信息%'
  13.         and read_rows != 0
  14. group by
  15.         t
  16. limit 50
复制代码
left join查询个数

  1. select
  2.         *
  3. from
  4.         (
  5.         select
  6.                 LEFT(query,100) as sql,
  7.                 count() as quneryNum,
  8.                 sum(query_duration_ms) as totalTime,
  9.                 totalTime / queryNum as avgTime
  10.         from
  11.                 system.query_log ql
  12.         where
  13.                 query like '% JOIN%'
  14.                 and read_rows != 0
  15.                 and event_time > toDateTime('2024-05-20 12:00:00')
  16.                 and event_time < toDateTime('2024-05-20 21:00:00')
  17.                 and query not like '%INSERT INTO%'
  18.         group by
  19.                 sql
  20.         order by
  21.                 queryNum desc)
复制代码
发现有问题的表时,查询该表结构

  1. show create table "shard1"."xxx_replica"
复制代码
总结

碰到此类问题可先检察日志,起首在(Clickhouse 日志 Zookeeper 日志)日志中看能否找到有用的信息,例如直接报错信息等,如果在日志中找不到太多有用的信息的话,可以从下面入手。
一般碰到 CPU的load 值比较高的情况时,根本上都是因为查询引起的。当碰到这种问题时可先查询带有JOIN 的 SQL 语句是不是许多。
通过Grafana等监控工具,快速定位问题发生的时间段。
通过查询query_log表中的实行记录,分析是否有大查询、慢查询,找到详细的sql,条件允许的情况下可以停止大查询观察CPU的load值是否低落。(kill掉相关sql,KILL QUERY WHERE query_id='')
本次排查过程重要使用query_log表,下面为告急字段:
   event_time — 查询开始时间.
  query_duration_ms — 查询消耗的时间(毫秒).
  read_rows— 从参与了查询的所有表和表函数读取的总行数.
  query — 查询语句.
  Clickhouse query_log 表中所有字段

   

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4