<< Click to Display Table of Contents >> 调优经验复制链接 |
1. 如何处理查询时内存超出限制?
当执行集市查询,出现如下 VooltDB 内存不足报错时:Exception: Memory limit (for query) exceeded
Related Query: 'visits_v120220311174506-833' Run user: 'admin'
Caused by: java.sql.SQLException 执行SQL失败:“VooltDB exception, code: 241, host: 192.168.1.130, port: 8523; DB::Exception: Memory limit (for query) exceeded: would use 154.66 MiB (attempt to allocate chunk of 4207121 bytes), maximum: 151.63 MiB: (while reading column StartURL): (while reading from part /opt/lisa/10.0/v1/vooltdb-server-0/lib/vooltdb/store/556/556b8016-9e1a-4c90-826d-2235ec63e69f/201403_10_10_0/ from mark 0 with max_rows_to_read = 6747): While executing MergeTree (version 21.3.5.42)(in query:SELECT "CounterID" AS "CounterID", "StartDate" AS "StartDate", "Sign" AS "Sign", "IsNew" AS "IsNew", "VisitID" AS "VisitID" , "UserID" AS "UserID", "StartTime" AS "StartTime", "Duration" AS "Duration", "UTCStartTime" AS "UTCStartTime" FROM default.visits_v1 order by CounterID ) "SUB_QRY" LIMIT 200 FORMAT TabSeparatedWithNamesAndTypes;).Check the value of configuration item:max_memory_usage, max_bytes_before_external_group_by,max_bytes_before_external_sort.
在报错信息最后看到提示了需要调整哪些配置参数,我们可以进入【VooltDB管理】->【节点管理】,编辑所有 VooltDB 节点,将提示信息中对应的参数值调整为当前值的一半。
2. 如何处理查询报并发超限?
当执行并发集市查询,出现如下报错时:Exception: Too much simultaneous queries. Maximum: 100
此报错说明 VooltDB 中同时执行的查询太多了,超过了数据库的最大并发限制。查询并发限制是和license绑定的,并发数为license cloud cpu核数 * 4,可以重新申请license调整cloud cpu核数解决。
3. 如何查询耗费高的CPU、内存?
进入【管理系统】->【监控预警】->【系统监控】,打开集市信息文件夹下的节点查询监控报表,可以看到TOP N个查询的内存和cpu消耗情况。具体释义可以参考【管理系统】->【监控预警】->【系统监控】->【集市信息】->【节点查询监控】章节。
4. 如何处理distributed_ddl_task_timeout超时问题
当入集市、删除集市文件或删除集市文件夹,出现如下报错时:
VooltDB exception, code: 159, host: MPP30, port: 8223; DB::Exception: Watching task /vooltdb/task_queue/ddl/query-0000000006 is executing longer than vooltdb.distribute.task.timeout (=180) seconds. There are 2 unfinished hosts (0 of them are currently active), they are going to execute the query in background (version 21.3.5.42)
可以在bi.properties中配置如下参数:vooltdb.distribute.task.timeout=×,单位为秒,默认180s。
5. 句柄占用,too many open files 错误
当执行集市查询时,出现如下too many open files错误,一般是因为 VooltDB 查询过程中要打开大量的文件,这时候需要占用大量句柄所致。
一般这种时候需要先看 ulimit -a 中的 open files 句柄数配置是否太小,一般1024就差不多,如果还是不行,那么就可能是瞬间到达 VooltDB 的最大压力过大。
VooltDB对于不同的sql,查询性能的波动比较厉害,单位时间内能够同时处理的query是有限度的,超过这个限度,则会造成堆积,内存不足、大量占用file句柄等性能问题。
可以从以下几个方面排查:
1)对于VooltDB,首先从query数量max_concurrent_queries这个参数看,这个配置参数在config.xml中,受到license核数的影响,会动态变化,同时执行query的数量不会超过这个配置值,如果超过,则报max_concurrent_queries错误。
2)配置参数max_threads,这个配置参数在vooltdb.xml中,等于license核数,为VooltDB的最大进程数。
3)单位时间内,VooltDB能够支持的query数量,统计出了一个粗略的计算方法(如下)。如果超过这个值,则会造成压力过大,资源堆积,比如句柄占用,内存不足。这个计算值对单独的固定的sql效果较好,对于复杂的场景,非常多的sql混合执行,就不那么准确了。
假设单位时间为T,单个sql的执行时间为m,核数为C,单位时间内可以执行的sql数量为N,
则N=T/m*C。
假如在1秒,进入了多个执行时间为200ms的sql,VooltDB节点为10核,那么能够处理的query数量为:
(1000/200)*10=50,即约等于在1秒内,进入50个query查询是基本能够处理的。
4)修改系统配置,在配置文件/etc/security/limits.conf中添加项:
* hard nofile 65536
* soft nofile 65536