使用 cgroups为impala设置 CPU 限制

耀灵2年前技术文章1097


有时应用会占用大量 CPU 时间,这可能会对环境的整体健康状况造成负面影响。使用 /sys/fs/ 虚拟文件系统,利用 控制组版本 (cgroups) 为应用配置 CPU 限制。

先决条件

  • 您有 root 权限。

  • 您有一个应用程序,您想限制其 CPU 消耗。

  • 验证是否已挂载了 cgroups 控制器:

[root@hadoop-dn4 ~]# mount -l | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu,clone_children)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
[root@hadoop-dn4 ~]#[root@hadoop-dn4 ~]# mount -l | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu,clone_children)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
[root@hadoop-dn4 ~]#

流程

  1. 在 CPU 消耗中识别您要限制的impala程序的进程 ID (PID):

1.jpg

top 程序的输出示例显示 PID 318767(应用 impalad)消耗了大量 CPU 资源。

  1. cpu 资源控制器目录中创建子目录:

mkdir /sys/fs/cgroup/cpu/impalad1/mkdir /sys/fs/cgroup/cpu/impalad1/

上面的目录代表控制组,您可以在其中放置特定进程并将某些 CPU 限制应用到进程。同时,目录中将创建一些 cgroups接口文件和 cpu 控制器特定的文件。

  1. (可选)检查新创建的控制组群:

[root@hadoop-dn1 impalad1]# pwd
/sys/fs/cgroup/cpu/impalad1
[root@hadoop-dn1 impalad1]# ll
total 0
-rw-r--r-- 1 root root 0 Jul 10 16:58 cgroup.clone_children
--w--w--w- 1 root root 0 Jul 10 16:58 cgroup.event_control
-rw-r--r-- 1 root root 0 Jul 10 17:00 cgroup.procs
-r--r--r-- 1 root root 0 Jul 10 16:58 cpuacct.stat
-rw-r--r-- 1 root root 0 Jul 10 16:58 cpuacct.usage
-r--r--r-- 1 root root 0 Jul 10 16:58 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 Jul 10 16:58 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Jul 10 16:58 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Jul 10 16:58 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Jul 10 16:58 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Jul 10 16:58 cpu.shares
-r--r--r-- 1 root root 0 Jul 10 16:58 cpu.stat
-rw-r--r-- 1 root root 0 Jul 10 16:58 notify_on_release
-rw-r--r-- 1 root root 0 Jul 10 16:58 tasks[root@hadoop-dn1 impalad1]# pwd
/sys/fs/cgroup/cpu/impalad1
[root@hadoop-dn1 impalad1]# ll
total 0
-rw-r--r-- 1 root root 0 Jul 10 16:58 cgroup.clone_children
--w--w--w- 1 root root 0 Jul 10 16:58 cgroup.event_control
-rw-r--r-- 1 root root 0 Jul 10 17:00 cgroup.procs
-r--r--r-- 1 root root 0 Jul 10 16:58 cpuacct.stat
-rw-r--r-- 1 root root 0 Jul 10 16:58 cpuacct.usage
-r--r--r-- 1 root root 0 Jul 10 16:58 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 Jul 10 16:58 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Jul 10 16:58 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Jul 10 16:58 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Jul 10 16:58 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Jul 10 16:58 cpu.shares
-r--r--r-- 1 root root 0 Jul 10 16:58 cpu.stat
-rw-r--r-- 1 root root 0 Jul 10 16:58 notify_on_release
-rw-r--r-- 1 root root 0 Jul 10 16:58 tasks

示例输出中显示的文件,如 cpuacct.usagecpu.cfs._period_us,它们代表特定配置和/或限制,可以为 Example 控制组中的进程设置。请注意,对应的文件名前缀为它们所属的控制组控制器的名称。

默认情况下,新创建的控制组继承对系统整个 CPU 资源的访问权限,且无限制。

  1. 为控制组群配置 CPU 限制:

echo "1000000" > /sys/fs/cgroup/cpu/impalad1/cpu.cfs_period_us
echo "3000000" > /sys/fs/cgroup/cpu/impalad1/cpu.cfs_quota_us
echo "318767" > /sys/fs/cgroup/cpu/impalad1/cgroup.procsecho "1000000" > /sys/fs/cgroup/cpu/impalad1/cpu.cfs_period_us
echo "3000000" > /sys/fs/cgroup/cpu/impalad1/cpu.cfs_quota_us
echo "318767" > /sys/fs/cgroup/cpu/impalad1/cgroup.procs

cpu.cfs_period_us 文件表示以微秒为单位(这里表示为"us")的时段,用于控制组对 CPU 资源的访问权限应重新分配的频率。上限为 1 秒,下限为 1000 微秒。

cpu.cfs_quota_us 文件表示以微秒为单位的总时间量,控制组中的所有进程都可以在一个期间(如 cpu.cfs_period_us 定义)。当控制组中的进程在单个期间内使用配额指定的所有时间时,就会在句点的其余部分内进行限流,并且不允许在下一个期间内运行。下限为 1000 微秒。

上面的示例命令设定 CPU 时间限值,使得 Example 控制组中的所有进程仅能每 1 秒( cpu.cfs_quota_us 定义)每 1 秒(由 cpu.cfs_period_us 定义)运行 0.2 秒。

  1. 为控制组群配置 CPU 限制:

[root@hadoop-dn1 impalad1]# cat /sys/fs/cgroup/cpu/impalad1/cpu.cfs_period_us
1000000
[root@hadoop-dn1 impalad1]# cat /sys/fs/cgroup/cpu/impalad1/cpu.cfs_quota_us
3000000[root@hadoop-dn1 impalad1]# cat /sys/fs/cgroup/cpu/impalad1/cpu.cfs_period_us
1000000
[root@hadoop-dn1 impalad1]# cat /sys/fs/cgroup/cpu/impalad1/cpu.cfs_quota_us
3000000

  1. 将应用程序的 PID 添加到 Example 控制组群中:

echo "318767" > /sys/fs/cgroup/cpu/impalad1/cgroup.procs

or

echo "318767" > /sys/fs/cgroup/cpu/impalad1/tasksecho "318767" > /sys/fs/cgroup/cpu/impalad1/cgroup.procs

or

echo "318767" > /sys/fs/cgroup/cpu/impalad1/tasks

上一命令可确保所需的应用成为 impalad1 控制组的成员,因此不超过为 impalad1 控制组配置的 CPU 限值。

  1. 验证应用程序是否在指定的控制组群中运行:

[root@hadoop-dn1 impalad1]# cat /proc/318767/cgroup 
11:cpuset:/
10:freezer:/
9:pids:/
8:blkio:/
7:hugetlb:/
6:memory:/
5:cpuacct,cpu:/impalad1
4:perf_event:/
3:devices:/
2:net_prio,net_cls:/
1:name=systemd:/user.slice/user-1000.slice/session-2.scope
[root@hadoop-dn1 impalad1]# [root@hadoop-dn1 impalad1]# cat /proc/318767/cgroup 
11:cpuset:/
10:freezer:/
9:pids:/
8:blkio:/
7:hugetlb:/
6:memory:/
5:cpuacct,cpu:/impalad1
4:perf_event:/
3:devices:/
2:net_prio,net_cls:/
1:name=systemd:/user.slice/user-1000.slice/session-2.scope
[root@hadoop-dn1 impalad1]#

上面的示例输出显示所需应用的进程在 impalad1 控制组中运行,它将 CPU 限制应用到应用的进程。

  1. 验证应用程序是否在指定的控制组群中运行:

2.jpg

请注意,PID 318767 的 CPU 消耗从 1017% 降至 300%以内。


相关文章

PG的统计信息(一)

一、统计信息1.1 PG统计信息概述pg的统计信息主要分为两种:第一类统计信息是是负载指标“统计信息”(Monitoring stats),通过stat collector进程进行实时采集更新的负载指...

使用CoreDNS搭建DNS服务器

使用CoreDNS搭建DNS服务器

简介CoreDNS是一个DNS服务器/转发器,用Go编写,可以链接插件。每个插件执行一个 (DNS) 功能。CoreDNS是云原生计算基金会毕业的项目。CoreDNS是一个快速灵活的DNS服务器。这里...

借助arthas工具打火焰图

借助arthas工具打火焰图

1、下载arthas在命令行下面执行(使用和目标进程一致的用户启动,否则可能 attach 失败):curl -O https://arthas.aliyun.com/arthas-boot.jar...

网络数据链路层-MAC帧(2)

网络数据链路层-MAC帧(2)

3.ARP协议地址解析协议(Address Resolution Protocol,ARP)协议,是根据IP地址获取MAC地址的一个TCP/IP协议。3.1为什么有ARP协议?ARP 协议建立了主机...

MySQL 复制-无数据环境搭建异步复制

MySQL 复制-无数据环境搭建异步复制

全新初始化(新环境,无数据)搭建 MySQL 异步复制 & GTID 复制标准文档。一、前言环境说明:操作系统 CentOS 7  & 数据库版本 5.7.32参数要求:主库必须开启...

阿里云ES跨账号数据迁移(reindex)

阿里云ES跨账号数据迁移(reindex)

1、背景与前置条件总的来说,阿里云es集群间数据迁移,有三中方式,logstash、reindex、镜像备份恢复,分别使用不同的场景,本文档主要讨论reindex方式进行账号下,ES跨集群迁移时,使用...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。