MogDB or openGauss关于CPU占用问题的优化

2023年 9月 25日 121.6k 0

一、问题描述

空闲时的openGauss也会占用一定的CPU,通过perf top,htop等工具定位到是Percentile线程占用。

二、代码解读

  • 代码位置  openGauss-server/src/gausskernel/cbb/instruments/percentile/percentile.cpp

  • Percentile线程的功能作用,以及其内部实现如下。

1. PercentileMain

PercentileMain初始化于系统启动(postmaster.cpp)时候,无论是否启用统计特性,线程都会初始化并启动。

主循环流程:

  • 根据信号响应重载配置文件。主要相关参数:
    • 是否启用统计信息
    • 统计信息计算频率(默认10s)
  • 启动SubPercentileMain执行实际的采集计算。
  • sleep 10s
    采用CpuCyclesLevelTime(mot相关方法,根据cpu循环时间计算得到的时间,应该是为了arm架构的优化做的方法,这里x86机器采用rdtsc指令,arm采用cntvct_el0指令)

2. SubPercentileMain

主循环:

  • while跳出条件判断is_enable_percentile_thread,这里默认情况下,只要是单节点模式,必然为true,只有分布式模式下的数据节点才会是false。
  • 根据信号响应重载配置文件
  • 执行calculatePercentileOfSingleNode计算统计信息(分布式下采用calculatePercentileOfMultiNode计算)
  • 执行pg_usleep 这里怀疑是笔误,入参仅10,也就是10微秒(delay.tv_usec = microsec % 1000000L;此处采用系统select调用作为sleep机制,并非系统api sleep或者nanosleep)

3. calculatePercentileOfSingleNode

主流程:

  • 如果enable_instr_rt_percentile参数设置为false,这里跳出返回,不执行下面的逻辑。
  • pgstat_fetch_sql_rt_info_counter获取所有sql数量
  • pgstat_fetch_sql_rt_info_internal获取所有sql的响应时间
  • PercentileSpace::heapSort进行响应时间排序
  • PercentileSpace::CalculatePercentile 计算响应时间比例

4. 已知问题

SubPercentileMain中,while循环中,pg_usleep(10)导致非常高频的系统select调用。

测试代码

#include
#include
int main( int argc, char *argv[] )
{
long microsec=10;
for (int i=0;iattr.attr_common.enable_instr_rt_percentile){
return false;
}

重新编译安装并设置参数
enable_instr_rt_percentile=off

四、效果对比

1. 分别启动MogDB和openGauss两个容器。

[root@ecs-x86-001 ~]# docker run --name opengauss --privileged=true -d -e GS_PASSWORD=Enmo@123 opengauss:1.1.0
8f74e5f4d07fbec0d58dfaea75ef3816a821b6383be04c1776d8a057abd9e12c

[root@ecs-x86-001 ~]# docker run --name mogdb --privileged=true -d -e GS_PASSWORD=Enmo@123 mogdb:1.1.0
70c4ef716c33a3436a5fe7188b7f30dcf60467276b40acac997fec7ca8bee4af

2. 查看进程和copyright

[root@ecs-x86-001 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
70c4ef716c33 mogdb:1.1.0 "entrypoint.sh mogdb" About a minute ago Up About a minute 5432/tcp mogdb
8f74e5f4d07f opengauss:1.1.0 "entrypoint.sh gauss…" About a minute ago Up About a minute 5432/tcp opengauss
[root@ecs-x86-001 ~]# docker top mogdb
UID PID PPID C STIME TTY TIME CMD
70 4060 4041 0 17:22 ? 00:00:00 mogdb
[root@ecs-x86-001 ~]# docker top opengauss
UID PID PPID C STIME TTY TIME CMD
70 3644 3623 6 17:21 ? 00:00:08 gaussdb
[root@ecs-x86-001 ~]# docker exec -it opengauss bash
[root@8f74e5f4d07f /]# su - omm -c 'gsql -d postgres -p5432 -r -c"\copyright"'
GaussDB Kernel Database Management System
Copyright (c) Huawei Technologies Co., Ltd. 2018. All rights reserved.

[root@ecs-x86-001 ~]# docker exec -it mogdb bash
[root@70c4ef716c33 /]# su - omm -c 'gsql -d postgres -p5432 -r -c"\copyright"'
MogDB Kernel Database Management System
Copyright (c) Yunhe Enmo (Beijing) Information Technology Co., Ltd. Copyright © 2009-2020 , All rights reserved.

3. top 对比实际效果

[root@ecs-x86-001 ~]# top -p 4060,3644
[root@ecs-x86-001 ~]# top -p 4060,3644
top - 17:28:05 up 29 days, 2:01, 1 user, load average: 0.05, 0.07, 0.06
Tasks: 2 total, 0 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 65806096 total, 57493216 free, 3526940 used, 4785940 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 60510156 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3644 70 20 0 1764380 615248 113760 S 8.6 0.9 0:29.56 gaussdb
4060 70 20 0 1740936 591484 110196 S 0.3 0.9 0:01.44 mogdb

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论