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

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

一、问题描述

空闲时的openGauss也会占用一定的CPU,通过perf top,htop等工具定位到是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 <sys/select.h>
#include <time.h>
int main( int argc, char *argv[] )
{
    long microsec=10;
    for (int i=0;i<1000000000;i++){
        struct timeval delay;
         delay.tv_sec = microsec / 1000000L;
        delay.tv_usec = microsec % 1000000L;
        (void)select(0, NULL, NULL, NULL, &delay);
}
    return 0;
}

三、解决办法

271行添加如下代码

if (!u_sess->attr.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
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
编译器 Linux C语言
C++新特性“CPU优化对齐”
C++新特性“CPU优化对齐”
112 3
|
1月前
|
SQL 监控 关系型数据库
MySQL优化: CPU高 处理脚本 pt-kill脚本
MySQL优化: CPU高 处理脚本 pt-kill脚本
|
1月前
|
监控 Java Linux
CPU被打满/CPU 100%:高效诊断与优化策略
【8月更文挑战第28天】在日常的工作与学习中,遇到CPU使用率飙升至100%的情况时,往往意味着系统性能受到严重影响,甚至可能导致程序响应缓慢或系统崩溃。本文将围绕这一主题,分享一系列高效诊断与优化CPU使用的技术干货,帮助大家快速定位问题并恢复系统性能。
46 1
|
2月前
|
Java
手把手教你java CPU飙升300%如何优化
手把手教你java CPU飙升300%如何优化
48 0
|
2月前
|
监控 Java 中间件
FGC频繁导致CPU 飙升定位及JVM配置优化总结
FGC频繁导致CPU 飙升定位及JVM配置优化总结
75 0
|
2月前
|
缓存 弹性计算 监控
云服务器 CPU 使用率高的问题排查与优化
云服务器 CPU 使用率高的问题排查与优化
260 0
|
3月前
|
SQL 数据处理 API
实时计算 Flink版产品使用问题之holo的io以及cpu使用较为稳定,sink端busy一直在20%左右,有时候50%,该如何优化
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4月前
|
存储 机器学习/深度学习 测试技术
mnn-llm: 大语言模型端侧CPU推理优化
mnn-llm: 大语言模型端侧CPU推理优化
888 1
|
4月前
|
存储 缓存 算法
如何优化 CPU 通道的使用
如何优化 CPU 通道的使用
|
4月前
|
存储 人工智能 缓存
探索AIGC未来:CPU源码优化、多GPU编程与中国算力瓶颈与发展
近年来,AIGC的技术取得了长足的进步,其中最为重要的技术之一是基于源代码的CPU调优,可以有效地提高人工智能模型的训练速度和效率,从而加快了人工智能的应用进程。同时,多GPU编程技术也在不断发展,大大提高人工智能模型的计算能力,更好地满足实际应用的需求。 本文将分析AIGC的最新进展,深入探讨以上话题,以及中国算力产业的瓶颈和趋势。