合 Greenplum中的进程优先级(PR、NI)
GP 集群混部简介
目前 GP 集群资源使用率大部分时间是比较低的,而服务器配置的资源较高,这样就造成资源浪费,现可以通过混部的模式,在 GP 集群上使用 docker 混部 storm、nodemanager 等应用,充分使用集群资源,但是混部在集群资源紧张、进程较多的时候会影响 GP 的使用,导致大量的时间都在进程切换,cpu 的 nice 值增高。因此需要调整 GP 集群进程的 nice 值,来优化 GP 集群混部。
进程优先级说明
top命令栏中ni的53.6%表示用户进程空间内改变过优先级的进程占用CPU百分比(被调整过nice值的进程占用的CPU使用率),若该值过高,那就是进程可能频繁调换优先级,则需要调整进程的优先级来优先获取CPU资源。进程都有优先级的,如果调节优先级,需要耗费cpu的时间段的,那就消耗这个ni
CPU管理进程的是按照时间片的方式来划分CPU的资源。CPU可以把1s划分成若干份,轮询时间片。通过设置进程的优先级,让某些重要的进程优先并且长时间获取CPU资源。
手段是设置进程的优先级的方式,进程尽可能多获取CPU的资源,分为静态优先级和动态优先级。静态优先级:-20到19 共40个优先级。默认的,进程继承其父进程的nice级别,通常为0。nice值越高,优先级越低;nice值越低,优先级越高。
动态优先级:1-99
- PRI(PR) :Priority 值叫动态优先级,是进程在内核中实际的优先级值,进程优先级的取值范围是通过一个宏定义的,这个宏的名称是 MAX_PRIO,它的值为 140。Linux 实际上实现了 140 个优先级范围,取值范围是从 0-139,这个值越小,优先级越高。0-99 表示实时进程,100-139 表示普通进程,他们采用的调度算法是不一样的,实时进程更容易获取 cpu 时间片。普通进程的动态优先级可以通过静态优先级计算获得,动态优先级=max(100,min(静态优先级-bonus+5,139)),其中 bonus 则是惩罚因子,依赖进程过去运行的情况和进程平均睡眠时间相关,如果小于 5,则表示降低动态优先级,大于 5 则增加动态优先级以示嘉奖。
- NI :进程 Nice 值,代表这个进程的优先值;取值范围-20~19,调整该值越低,静态优先级越高,获取的 cpu 时间片就越长
- 静态优先级:静态优先级的取值范围也是 [0-139],其中 PR 中的 100 to 139 值部分有这么一个对应 PR = 20 + (-20 to +19),这里的 -20 to +19 便是 nice 值,所以说两个虽然都是优先级,而且有千丝万缕的关系,但是他们的值,他们的作用范围并不相同。
PRI 是比较好理解的,即进程的优先级,或者通俗点说就是进程被 CPU 执行的先后顺序,此值越小进程的优先级别越高。那 NI 呢?就是我们所要说的 nice 值了,其表示进程可被执行的优先级的修正数值。如前面所说,PRI 值越小越快被执行,那么加入 nice 值后,将会使得 PRI 变为:PRI(new)=PRI(old)+nice。由此看出,PR 是根据 NICE 排序的,规则是 NICE 越小 PR 越前(小,优先权更大),即其优先级会变高,则其越快被执行。如果 NICE 相同则进程 uid 是 root 的优先权更大。在 LINUX 系统中,Nice 值的范围从-20 到 +19(不同系统的值范围是不一样的),正值表示低优先级,负值表示高优先级,值为零则表示不会调整该进程的优先级。具有最高优先级的进程,其 nice 值最低,所以在 LINUX 系统中,值-20 使得一项任务变得非常重要;与之相反,如果任务的 nice 为 +19,则表示它是一个高尚的、无私的任务,允许所有其他任务比自己享有宝贵的 CPU 时间的更大使用份额,这也就是 nice 的名称的来意。进程在创建时被赋予不同的优先级值,而如前面所说,nice 的值是表示进程优先级值可被修正数据值,因此,每个进程都在其计划执行时被赋予一个 nice 值,这样系统就可以根据系统的资源以及具体进程的各类资源消耗情况,主动干预进程的优先级值。
在通常情况下,子进程会继承父进程的 nice 值,比如在系统启动的过程中,init 进程会被赋予 0,其他所有进程继承了这个 nice 值(因为其他进程都是 init 的子进程)。对 nice 值一个形象比喻,假设在一个 CPU 轮转中,有 2 个 runnable 的进程 A 和 B,如果他们的 nice 值都为 0,假设内核会给他们每人分配 1k 个 cpu 时间片。但是假设进程 A 的为 0,但是 B 的值为-10,那么此时 CPU 可能分别给 A 和 B 分配 1k 和 1.5k 的时间片。故可以形象的理解为,nice 的值影响了内核分配给进程的 cpu 时间片的多少,时间片越多的进程,其优先级越高,其优先级值(PRI)越低。%nice,就是改变过优先级的进程的占用 CPU 的百分比,如上例中就是 0.5k/2.5k=1⁄5=20%。 由此可见,进程 nice 值和进程优先级不是一个概念,但是进程 nice 值会影响到进程的优先级变化。
进程优先级查看
查看进程优先级的方法: top
命令
使用 top 命令可以查看到 PR 和 NI 选项
PR 取值范围为 [0,39] 表示用户可通过 nice 值调整那部分区域,即 [100,139],表示的是静态优先级范围,如果该值显示为 rt 则表示为实时进程
1 2 3 | top -u gpadmin ps -afxo user,ppid,pid,stat,pri,ni,time,command |
pa 相关参数说明: a 显示所有进程 -a 显示同一终端下的所有进程 -A 显示所有进程 c 显示进程的真实名称 -N 反向选择 -e 等于 “-A” e 显示环境变量 f 显示进程间的关系 -H 显示树状结构 r 显示当前终端的进程 T 显示当前终端的所有进程 u 指定用户的所有进程 -au 显示较详细的资讯 -aux 显示所有包含其他使用者的行程 -C<命令> 列出指定命令的状况 –lines<行数> 每页显示的行数 –width<字符数> 每页显示的字符数 –help 显示帮助信息 * –version 显示版本显示
调整进程 nice 值
1、执行进程调整 nice 值
执行该命令的时候需要有 root 权限,否则无法执行成功。
1 2 | #command 为进程的正常启动命令 nice -n -10 [command] |
2、调整已经启动进程的 nice 值
1 2 3 4 5 6 7 8 | #调整某个进程的优先级 sudo renice -10 -p [pid] #调整某个用户进程的优先级 sudo renice -10 -u gpadmin #调整某个群组进程的优先级 sudo renice -10 -g gpadmin |
3、调整用户默认的 nice 值
编辑/etc/security/limits.conf
配置文档,添加如下内容:
1 | gpadmin soft priority -20 |
表示 gpadmin 用户默认的 nice 值为-20,那么在 gpadmin 用户创建的进程 nice 值也均为-20,修改配置文档,重新登入即可生效。
调整 GP 集群的 nice 值
1、参数说明
GP 集群提供 gp_segworker_relative_priority 来配置 nice 值,其默认值为 20,表示最低优先级,gp_segworker_relative_priority 的取值范围为 [0-20],一定要注意设置该值,超出范围将导致集群无法启动,也无法进入 master-only 模式。该值可以用来调整查询进程的 nice 值。默认情况下 gp 启动进程的 nice 值根据用户默认的 nice 值而设定,该参数只影响 GP 的查询进程,会在父进程的 nice 值上加上该值,赋值给当前进程。
因此在不调整 nice 值,默认情况下,我们会发现查询进程的 nice 值都很高,达到 nice 的最大值,而进程优先级最低。
gpadmin 1 3953970 Ss 19 0 00:04:45 /opt/greenplum/greenplum-db-5.8.0/bin/postgres -D /data/primary1/gpseg128 -p 19900 –gp_dbid=130 –gp_num_contents_in_cluster=152 –silent-mode=true -i -M quiescent –gpcontentid=128 gpadmin 3953970 3953987 Ss 19 0 00:00:55 postgres: 19900, logger process
gpadmin 3953970 3954138 S 19 0 00:00:32 postgres: 19900, primary process
gpadmin 3954138 3954153 S 19 0 00:02:28 | postgres: 19900, primary receiver ack process
gpadmin 3954138 3954154 S 19 0 00:20:07 | postgres: 19900, primary sender process
gpadmin 3954138 3954155 S 19 0 00:01:59 | postgres: 19900, primary consumer ack process
gpadmin 3954138 3954156 S 19 0 00:12:37 | postgres: 19900, primary recovery process
gpadmin 3953970 3954183 Ss 19 0 00:01:16 postgres: 19900, stats collector process
gpadmin 3953970 3954184 Ss 19 0 00:07:56 postgres: 19900, writer process
gpadmin 3953970 3954185 Ss 19 0 00:11:04 postgres: 19900, checkpointer process
gpadmin 3953970 3954186 S 19 0 00:01:44 postgres: 19900, sweeper process
gpadmin 3953970 3954187 S 19 0 00:21:18 postgres: 19900, stats sender process
gpadmin 3953970 3954188 Ss 19 0 00:05:08 postgres: 19900, wal writer process
gpadmin 3953970 251998 SNsl 0 19 00:00:00 postgres: 19900, marketingpush dcw 172.20.79.51(44374) con677282 seg128 idle in transaction gpadmin 3953970 260798 Ssl 19 0 00:00:00 postgres: 19900, yunyingread dcw 172.20.79.51(61718) con677304 seg128 idle gpadmin 3953970 260814 SNsl 0 19 00:00:00 postgres: 19900, yunyingread dcw 172.20.79.51(62022) con677304 seg128 idle
我们使用 ps 命令查看相关的 nice 值和 PRI 值,发现父进程的 nice 值为 0,而查询进程的 nice 值为 19
2、参数设置
1 | gpconfig -c gp_segworker_relative_priority -v 5 -m 5 |