为什么Greenplum 的CPU有大量是%ni的占用

简介:

在使用Greenplum的过程中,发现CPU监控有大量的%ni的占比。
ni是指低优先级的用户模式,通过setpriority可以设置进程的优先级。数字越大,优先级越低。
TOP中CPU统计的分类解释如下:

   2c. SUMMARY Area Fields
       The summary area fields describing CPU statistics are abbreviated.  They provide information about times spent in:
           us = user mode
           sy = system mode
           ni = low priority user mode (nice)
           id = idle task
           wa = I/O waiting
           hi = servicing IRQs
           si = servicing soft IRQs
           st = steal (time given to other DomU instances)

setpriority 用法如下:

NAME
       getpriority, setpriority - get/set program scheduling priority

SYNOPSIS
       #include <sys/time.h>
       #include <sys/resource.h>

       int getpriority(int which, int who);
       int setpriority(int which, int who, int prio);

查看greenplum的源码,在src/backend/tcop/postgres.c中发现了setpriority的踪迹。

/*
 * Change the priority of the current process to the specified level
 * (bigger nice_level values correspond to lower priority).
*/
static bool renice_current_process(int nice_level)
{
#ifdef WIN32
        elog(DEBUG2, "Renicing of processes on Windows currently not supported.");
        return false;
#else
        int prio_out = -1;
        elog(DEBUG2, "Current nice level of the process: %d",
                        getpriority(PRIO_PROCESS, 0));
        prio_out = setpriority(PRIO_PROCESS, 0, nice_level);
        if (prio_out == -1)
        {
                switch (errno)
                {
                case EACCES:
                        elog(DEBUG1, "Could not change priority of the query process, errno: %d (%m).", errno);
                        break;
                case ESRCH:
                        /* ignore this, the backend went away when we weren't looking */
                        break;
                default:
                        elog(DEBUG1, "Could not change priority of the query process, errno: %d (%m).", errno);
                }
                return false;
        }

        elog(DEBUG2, "Reniced process to level %d", getpriority(PRIO_PROCESS, 0));
        return true;
#endif
}

以上函数在exec_mpp_query时被调用:

/*
 * exec_mpp_query
 *
 * Called in a qExec process to read and execute a query plan sent by
 * cdbdisp_dispatchPlan().
 *
 * query_string -- optional query text (C string).
 * serializedQuerytree[len]  -- Query node or (NULL,0) if plan provided.
 * serializedPlantree[len] -- PlannedStmt node, or (NULL,0) if query provided.
 * serializedParms[len] -- optional parameters
 * serializedSliceInfo[len] -- optional SliceTable
 * localSlice -- slice table index
 *
 * Caller may supply either a Query (representing utility command) or
 * a PlannedStmt (representing a planned DML command), but not both.
 */
static void
exec_mpp_query(const char *query_string, 
                           const char * serializedQuerytree, int serializedQuerytreelen,
                           const char * serializedPlantree, int serializedPlantreelen,
                           const char * serializedParams, int serializedParamslen,
                           const char * serializedSliceInfo, int serializedSliceInfolen,
                           const char * seqServerHost, int seqServerPort,
                           int localSlice)
{
...
        /* Downgrade segworker process priority */
                if (gp_segworker_relative_priority != 0)
                {
                        renice_current_process(PostmasterPriority + gp_segworker_relative_priority);
                }

gp_segworker_relative_priority 是一个启动参数,默认是20:

        {
                {"gp_segworker_relative_priority", PGC_POSTMASTER, RESOURCES_MGM,
                        gettext_noop("Priority for the segworkers relative to the postmaster's priority."),
                        NULL,
                        GUC_NO_SHOW_ALL | GUC_NOT_IN_SAMPLE
                },
                &gp_segworker_relative_priority,
                PRIO_MAX,
                0, PRIO_MAX, NULL, NULL
        },
...

src/include/cdb/cdbvars.h:#define PRIO_MAX 20

因此就能解释,为什么使用greenplum会发现大量的nice占比的CPU统计。

目录
相关文章
LabVIEW中CPU和内存使用情况在NI分布式系统管理器中不可见
LabVIEW中CPU和内存使用情况在NI分布式系统管理器中不可见
253 3
|
3月前
|
缓存 人工智能 算法
不同业务怎么选服务器?CPU / 内存 / 带宽配置表
本文详解了服务器三大核心配置——CPU、内存、带宽,帮助读者快速理解服务器性能原理。结合不同业务场景,如个人博客、电商、数据库、直播等,提供配置选择建议,并强调合理搭配的重要性,避免资源浪费或瓶颈限制。内容实用,适合初学者和业务选型参考。
673 0
|
3月前
|
存储 消息中间件 缓存
从纳秒到毫秒的“时空之旅”:CPU是如何看待内存与硬盘的?
在数据爆炸的时代,如何高效存储与管理海量数据成为系统设计的核心挑战。本文从计算机存储体系结构出发,解析B+树、LSM树与Kafka日志结构在不同数据库中的应用与优化策略,帮助你深入理解高性能存储背后的原理。
148 0
|
5月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
1884 0
|
2月前
|
弹性计算 定位技术 数据中心
阿里云服务器配置选择方法:付费类型、地域及CPU内存配置全解析
阿里云服务器怎么选?2025最新指南:就近选择地域,降低延迟;长期使用选包年包月,短期灵活选按量付费;企业选2核4G5M仅199元/年,个人选2核2G3M低至99元/年,高性价比爆款推荐,轻松上云。
192 11
|
4月前
|
弹性计算 前端开发 NoSQL
2025最新阿里云服务器配置选择攻略:CPU、内存、带宽与系统盘全解析
本文详解2025年阿里云服务器ECS配置选择策略,涵盖CPU、内存、带宽与系统盘推荐,助你根据业务需求精准选型,提升性能与性价比。
|
5月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
510 0
|
7月前
|
数据可视化 Linux iOS开发
Python测量CPU和内存使用率
这些示例帮助您了解如何在Python中测量CPU和内存使用率。根据需要,可以进一步完善这些示例,例如可视化结果或限制程序在特定范围内的资源占用。
291 22
|
11月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
1068 166