doris服务器的CPU使用率暴增

Viewed 16

Doris版本:2.1.5 ,单节点部署

操作系统版本:CentOS Linux release 7.9.2009 (Core)

12核CPU,96G内存,2T磁盘

问题描述:
我有一张业务大表cdr,占用440GB存储空间,7亿条数据,表结构如下:

  CREATE TABLE cdr (
ds DATE NOT NULL COMMENT '分区字段: 格式:yyyy-MM-dd',
id BIGINT(20) COMMENT '通话id。(业务主键)',
callId VARCHAR(64) COMMENT 'sip协议定义的通话id。不能保证唯一, 不能作为业务主键',
fromTag VARCHAR(64) COMMENT 'sip协议定义的',
toTag VARCHAR(64) COMMENT 'sip协议定义的',
sipCode VARCHAR(32) COMMENT '标准的sip码。200代表接通',
sipReason VARCHAR(2000) COMMENT 'sip码解释',
callStartTime VARCHAR(32) COMMENT '呼叫开始时间。格式: yyyy-MM-dd HH:mm:ss',
callAnswerTime VARCHAR(32) COMMENT '呼叫接通时间: yyyy-MM-dd HH:mm:ss',
callEndTime VARCHAR(32) COMMENT '呼叫结束时间: yyyy-MM-dd HH:mm:ss',
talkDurationMinutes INT COMMENT '通话时长,单位分钟。只有sipCode为200时, 此值才有意义',
talkDurationSeconds INT COMMENT '通话时长,单位秒。只有sipCode为200时, 此值才有意义',
talkDurationMillis INT COMMENT '通话时长,单位毫秒。只有sipCode为200时, 此值才有意义',
callSetupDurationSeconds INT COMMENT '呼叫建立时长,单位秒。从呼叫开始到接通或失败的时长',
downstreamGatewayId VARCHAR(64) COMMENT '最后使用的落地网关id',
downstreamGatewayName VARCHAR(64) COMMENT '最后使用的落地网关名称',
downstreamGatewayIpAddress VARCHAR(64) COMMENT '最后使用的落地网关ip',
downstreamGatewayCaller VARCHAR(64) COMMENT '最后使用的落地网关的主叫号码',
downstreamGatewayCalleePrefix VARCHAR(64) COMMENT '最后使用的落地网关被叫号码前缀',
downstreamAccountId VARCHAR(64) COMMENT '最后使用的落地账户id',
downstreamAccountName VARCHAR(64) COMMENT '最后使用的落地账户名称',
upstreamGatewayCaller VARCHAR(64) COMMENT '主叫号码,用于关联对接网关id',
upstreamGatewayId VARCHAR(64) COMMENT '对接网关id',
upstreamGatewayName VARCHAR(64) COMMENT '对接网关名称',
upstreamAccountId VARCHAR(64) COMMENT '对接账户id',
upstreamAccountName VARCHAR(64) COMMENT '对接账户名称',
customerPhone VARCHAR(4096) COMMENT '被叫号码',
opensipsNodeId VARCHAR(64) COMMENT '关联的opensips节点',
hangupBy VARCHAR(20) NULL COMMENT '挂断方。只有sipCode为200时, 此值才有意义。caller: 主叫挂断;callee: 被叫挂断。如果由于接通时长超时,opensips主动挂断的情况下,此值有可能为空。',
bizId VARCHAR(64) NULL COMMENT 'hermes的bizId',
taskItemUuid VARCHAR(64) NULL COMMENT 'hermes的taskItemUuid',
gatewayAttempts JSON COMMENT '网关尝试历史。是List<GatewayAttemptDTO> json 序列化后的字符串',
version INT COMMENT '版本号',
`connectStatus` VARCHAR(16) NULL COMMENT '接通状态',
`sourceIP` CHAR(32) NULL COMMENT '上游IP',
`bizTerminationReasonCode` VARCHAR(64) NULL COMMENT '通话终止业务code',
`dlgEndReason` VARCHAR(64) NULL COMMENT '对话终止原因',
`downstreamGatewayGroupId` VARCHAR(32) NULL COMMENT '落地网关群组id',
`province` VARCHAR(64) NULL COMMENT '手机号码归属省份',
`city` VARCHAR(64) NULL COMMENT '手机号码归属城市',
`ringed` TINYINT NULL COMMENT '是否振铃标志,1表示振铃过,0表示未振铃过,如果呼叫在尝试落地网关的时候(可能会有多个落地网关)出现过180,183,或者200,那么此值为1',
`ringingTime` CHAR(32) NULL COMMENT '振铃时间',
`ringingDuration` INT NULL COMMENT '振铃到应答的持续时长'
)
UNIQUE KEY(`ds`, `id`)
COMMENT '话单表'
AUTO PARTITION BY RANGE (date_trunc(`ds`, 'month')) ()
DISTRIBUTED BY HASH(`id`) BUCKETS 4
PROPERTIES(
"replication_num" = "1",
"bloom_filter_columns"="id,callId,customerPhone,downstreamGatewayId,upstreamGatewayId,opensipsNodeId,bizId,taskItemUuid",
"enable_unique_key_merge_on_write" = "true"
);

我在2025年04月07日晚上的时候为这张大表增加了一个新字段,这个字段默认值是NULL,然后使用update语句将这个新字段设置为一个固定的值,涉及到7亿条数据的改造,具体操作如下:

(1)cdr表增加tenantUuid字段
ALTER TABLE cdr ADD COLUMN tenantUuid VARCHAR(512) NULL COMMENT '租户UUID';

(2)将tenantUuid字段加入到布隆过滤器
ALTER TABLE cdr SET (
"bloom_filter_columns" = "callId, customerPhone, upstreamGatewayId, bizId, taskItemUuid, id, opensipsNodeId, downstreamGatewayId, tenantUuid"
);

(3)历史数据设置为闪应

update cdr set tenantUuid = 'shanying' ;

在执行update的过程中发现这个update操作太慢了,就取消了这个update操作,在取消没有完成的情况下我重启了doris的服务器,重启doris服务器以后使用脚本批量更新(2025年04月07日 21:21),每次更新约3.5G的数据,最后全部更新完成(完成时间为2025年04月07日 23:10)

以上就是当时的全部操作,我在doris的be.WARNING日志中看到了大量的错误日志:
image.png

且执行show alter table column from dw where TableName = 'cdr'; 出现了下面的结果:image.png

这些操作完成以后就出现了一个现象,从2025年04月07日23:10到现在(2025年04月12日):

只要往这张表写入数据的写入速度 loadRowsRate超过800以上(同时使用KAFKA routine load和stream load写数据),那么doris服务器的CPU使用率就会飙升到80%以上,都是由于doris_be进程占用的CPU使用率高,同样的写入速度下在上述改造之前doris服务器的CPU的使用率只有30%左右,但是改造前后doris服务器的内存使用率变化不大,都是不到20%

ps:出现问题后的这几天,我们也尝试着启动过几次doris服务器,但是都不解决问题,CPU使用率高的时候,doris_be进程的各个消耗CPU使用率的线程如下:
image.png

我的问题是为什么会出现这种CPU使用率暴增的现象,是不是上面的操作导致了doris的某种系统级的变化,以及怎么具体解决这个问题,能否使用某种配置的方式让内存的使用率上去,CPU的使用率降下来

0 Answers