云数据库 GAUSSDB-逻辑解码选项:并行解码
并行解码
二进制格式编码规则如下所示:
- 前4字节代表接下来到语句级别分隔符字母P(不含)或者该批次结束符F(不含)的解码结果的总字节数,该值如果为0代表本批次解码结束。
- 接下来8字节uint64代表相应lsn(begin对应first_lsn,commit对应end_lsn,其他场景对应该条语句的lsn)。
- 接下来1字节的字母有5种B/C/I/U/D,分别代表begin/commit/insert/update/delete。
- 第3步字母为B时。
- 接下来的8字节uint64代表 CS N。
- 接下来的8字节uint64代表first_lsn。
- 【该部分为可选项】接下来的1字节字母如果为T,则代表后面4字节uint32表示该事务commit时间戳长度,再后面等同于该长度的字符为时间戳字符串。
- 【该部分为可选项】接下来的1字节字母如果为N,则代表后面4字节uint32表示该事务用户名的长度,再后面等同于该长度的字符为事务的用户名字。
- 因为之后仍可能有解码语句,接下来会有1字节字母P或F作为语句间的分隔符,P代表本批次仍有解码的语句,F代表本批次完成。
- 第3步字母为C时:
- 【该部分为可选项】接下来1字节字母如果为X,则代表后面的8字节uint64表示xid。
- 【该部分为可选项】接下来的1字节字母如果为T,则代表后面4字节uint32表示时间戳长度,再后面等同于该长度的字符为时间戳字符串。
- 因为批量发送日志时,一个COMMIT日志解码之后可能仍有其他事务的解码结果,接下来的1字节字母如果为P则表示该批次仍需解码,如果为F则表示该批次解码结束。
- 第3步字母为I/U/D时:
- 接下来的2字节uint16代表schema名的长度。
- 按照上述长度读取schema名。
- 接下来的2字节uint16代表table名的长度。
- 按照上述长度读取table名。
- 【该部分为可选项】接下来1字符字母如果为N代表为新元组,如果为O代表为旧元组,这里先发送新元组。
- 接下来的2字节uint16代表该元组需要解码的列数,记为attrnum。
- 以下流程重复attrnum次。
- 接下来2字节uint16代表列名的长度。
- 按照上述长度读取列名。
- 接下来4字节uint32代表当前列类型的Oid。
- 接下来4字节uint32代表当前列的值(以字符串格式存储)的长度,如果为0xFFFFFFFF则表示NULL,如果为0则表示长度为0的字符串。
- 按照上述长度读取列值。
- 因为之后仍可能有解码语句,接下来的1字节字母如果为P则表示该批次仍需解码,如果为F则表示该批次解码结束。
- sending-batch:
取值范围:0或1的int型,默认值为0。
- 0:设为0时,表示逐条发送解码结果。
- 1:设为1时,表示解码结果累积到达1MB则批量发送解码结果。
开启批量发送的场景中,当解码格式为'j'或't'时,在原来的每条解码语句之前会附加一个uint32类型,表示本条解码结果长度(长度不包含当前的uint32类型),以及一个uint64类型,表示当前解码结果对应的lsn。
在CSN序解码(即output-order设置为1)场景下,批量发送仅限于单个事务内(即如果一个事务有多条较小的语句会采用批量发送),即不会使用批量发送功能在同一批次里发送多个事务,且BEGIN和COMMIT语句不会批量发送。
- parallel-queue-size:
取值范围:2~1024的int型,且必须为2的整数幂,默认值为128。
队列长度和解码过程的内存使用量正相关。
- logical-reader-bind-cpu:
取值范围:-1~65535,不使用该参数则为不绑核。
默认-1,为不绑核。-1不可手动设置,核号应确保在机器总逻辑核数以内,不然会返回报错。多个线程绑定同一个核会导致该核负担加重,从而导致性能下降。
- logical-decoder-bind-cpu-index:
取值范围: -1~65535,不使用该参数则为不绑核。
默认 -1,不绑核。-1不可手动设置,核号应确保在机器总逻辑核数以内且小于 [cpu核数 - 并行逻辑解码数],不然会返回报错。
从给定的核号参数开始,新拉起的线程会依次递增加一。
多个线程绑定同一个核会导致该核负担加重,从而导致性能下降。
GaussDB 在进行逻辑解码和日志回放时,会占用大量的CPU资源,相关线程如Walwriter、WalSender、WALreceiver、pageredo就处于性能瓶颈,如果能将这些线程运行绑定在固定的CPU上运行,可以减少因操作系统调度线程频繁切换CPU,导致缓存未命中带来的性能开销,从而提高流程处理速度,如用户场景有性能需求,可根据以下的绑核样例进行配置优化。
- 参数样例:
- walwriter_cpu_bind=1
- walwriteraux_bind_cpu=2
- wal_receiver_bind_cpu=4
- wal_rec_writer_bind_cpu=5
- wal_sender_bind_cpu_attr='cpuorderbind:7-14'
- redo_bind_cpu_attr='cpuorderbind:16-19'
- logical-reader-bind-cpu=20
- logical-decoder-bind-cpu-index=21
- 样例中1.2.3.4.5.6通过GUC工具设置,使用指令如
gs_guc set -Z datanode -N all -I all -c “walwriter_cpu_bind=1”。
样例中7.8通过JDBC客户端发起解码请求时添加。
- 样例中如walwriter_cpu_bind=1是限定该线程在1号CPU上运行。
cpuorderbind:7-14意为拉起的每个线程依次绑定7号到14号CPU,如果范围内的CPU用完,则新拉起的线程不参与绑核。
logical-decoder-bind-cpu-index意为拉起的线程从21号CPU依次开始绑定,后续拉起的线程分别绑定21、22、23,依次类推。
- 绑核的原则是一个线程占用一个CPU。
- 不恰当的绑核,例如将多个线程绑定在一个CPU上很有可能带来性能劣化。
- 可以通过lscpu指令查看“CPU(s):”得知自己环境的CPU逻辑核心数。
CPU逻辑核心数低于36则不建议使用此套绑核策略,此时建议使用默认配置(不进行参数设置)
- 参数样例:
- GaussDB内核_GaussDB数据库内核_高斯数据库内核_华为云
- GaussDB(for MySQL)并行查询_GaussDB(for MySQL)内核_GaussDB(for MySQL)并行执行_PQ
- GaussDB数据库云备份_华为GaussDB_高斯数据库云备份
- GaussDB工具_gaussdb怎么读_高斯数据库工具_华为云
- 物联网设备接入平台_设备接入方案_终端设备接入
- 实时语音识别_录音文件识别_语言生成
- 什么是物联网_物联网iot平台_物联网技术有哪些
- 什么是华为云IoT_华为云物联网云平台的优势_物联网平台中心
- 华为iot设备接入_物联网设备接入云平台_设备接入IOTDA
- GaussDB视频教程_gaussdb查看表结构语句_高斯数据库视频教程_华为云