标签: cgroups

虚拟机的基于权重的块 IO 控制

我使用 KVM 来管理我的虚拟机。我正在尝试限制为 VM 提供的资源。我可以使用 libvirt/cgroups 限制为 VM 分配的 CPU 和内存。现在我想通过应用一些权重来控制为每个 VM 分配的磁盘时间。我查看了 cgroups 中的 blkio 控件。由于 VM 只是一个 Linux 进程,我将能够使用 cgroups,但我不确定它是否也适用于异步 IO。如果没有,有人可以提出一个好的替代解决方案吗?

linux kvm io block-device cgroups

13
推荐指数
1
解决办法
4238
查看次数

对无争用 cpuset 中的线程的调度程序优先级和策略有什么影响(如果有的话)?

我有一个 Linux 系统,我们使用 cgroups 创建了两个 cpu_exclusive cpuset,A 和 B,并且我们将所有用户线程和所有未绑定的内核线程迁移到附加到 cpuset A 的 cgroup。在 cpuset A 中运行的事物具有不同的调度程序策略和不同的优先级,并且 cpuset A 中运行的线程比 cpuset A 中的内核数多得多。

还有一些非常活跃的进程附加到 cpuset B 上,这些进程中的用户线程总数永远不会大于 cpuset B 中专门可用的内核数。 目标是屏蔽这些在 cpuset 中运行的重要任务B 来自机器上的其他活动并最大限度地减少处理延迟。

在这样的设置中,在 cpuset B 中运行的用户线程的调度策略/优先级是否有任何可观察到的影响?换种说法:将 B cpuset 线程的调度策略从默认的 SCHED_OTHER 更改为 SCHED_FIFO 或 SCHED_RR 会有什么后果,好还是坏?

似乎答案应该是“否”,因为调度程序应该能够为在 cpuset B 中运行的每个线程分配其自己的专用内核,因此不会有任何优先级或调度,因此 B 的策略和相对优先级cpuset 线程无关紧要。另一方面,需要担心绑定的内核线程和“调度程序域”方面,可能还有其他我没有考虑过的事情。

在任何实际意义上,在过度配置的独占 cpuset 中运行的线程的调度策略和优先级是否重要?

linux scheduling priority cgroups

12
推荐指数
1
解决办法
1238
查看次数

cgroups 如何与非 cgrouped 进程交互?

我在单核机器上有 3 个进程。每个进程都完全相同,并且尽可能快地消耗 CPU(紧密循环)。其中两个 (AB) 使用 cgexec 在不同的组中启动,共享设置为 512 和 512。第三个 ( C) 定期启动,而不是使用 cgexec。

一旦所有的启动和运行,C得到CPU,而66%AB分裂33%。如果我杀了C,然后AB获得各50%(预期)。

为什么会C得到66%?在这种情况下,我预计各为 33%,或者可能为 50% (C)、25% (A) 和 25% (B)。C不管我如何计算,66% 的结果都行不通。

一般来说,我想了解在资源共享(特别是 CPU,但如果不是太复杂的话,更通用的答案)时cgexec,进程是如何在不与启动的进程交互的情况下启动的cgexec

cgroups

12
推荐指数
1
解决办法
753
查看次数

如何优雅地解决这个内存问题?

我有一台带有交换分区的标准 Linux(Debian 测试)笔记本电脑。

我用它做了很多实验。其中一些真的很占用内存,Linux 默认的行为方式对我来说是一个问题......让我们举一个愚蠢的例子:

  1. 坐在笔记本电脑前
  2. 打开终端
  3. 输入python,然后a = [0]*100000000

现在很可能您没有足够的 RAM 来处理那个大列表。Linux 将填充 RAM,然后进行交换,几分钟后,OOM 杀手将被触发并终止(几乎)随机服务,并且希望,如果您在合适的时间按下 Ctrl+C python,并且如果终端仍然有焦点,计算机将再次响应。

我想强制执行一些内存限制以避免不必要的交换并拒绝进程分配比我拥有的内存(在 RAM 中)更多的内存的权利。如果内存需求低于某个限制或被 root 询问,那么就杀死除 root 之外的任何用户的最耗内存的进程。

ulimit -Sv [mem] 我在后面听到了!

呵呵!“使用cgroups通过cgexec!” 第一排有人说!

是的,您是对的:这些确实是非常好的解决方案。但:

  • 它们不适用于全系统
  • 限制是按进程设置的
  • 限制是静态的,不考虑可用 RAM 的实际数量(AFAIK)
  • 在这里那里,他们说这些并不是强制执行硬限制的真正好的解决方案。

我想要的是内核说:“你属于用户foo(不是 root),你使用了很多内存,我们会用完内存。对不起,伙计......死吧!”

或者:“你到底在做什么?你需要x MB 而只有y MB 可用。是的,SWAP 是空的,但你不打算使用 SWAP 来做你的脏活,是吗?不,我说不!没有你的记忆!如果你坚持,你会死的!

memory limit cgroups ulimit

10
推荐指数
1
解决办法
2605
查看次数

cgroup 中的层次结构支持有什么作用?

cgroup 有 2 个内存控制选项:

  • memory.use_hierarchy = 1 : 使用层次结构
  • memory.use_hierarchy = 0:使用平面层次结构,根据这个答案

两者有什么区别?我认为,等级就是等级,这里的“扁平”是什么意思?

我在这里阅读了 cgroup 文档解释了分层支持:

在上图中,启用分层记帐后,e 的所有内存使用量都被记入其祖先,直到根(即 c 和根)启用了 memory.use_hierarchy。如果祖先之一超过其限制,则回收算法从祖先中的任务和祖先的孩子中回收。

  • 这是什么意思accounted to its ancestors up until the root
  • 祖先怎么能超过它的极限,因为它的孩子的容量被分配给祖先的容量?
  • 为什么在祖先和子代中都回收任务?我认为任务只分配给孩子,这些任务自动属于祖先。即“WWW Browsing”有20%的容量;它的孩子是“教授”和“学生”,分别有 15% 和 5%。最大值永远不能超过 20%。为什么文档中有一个case说:

如果祖先之一超过其限制,则回收算法从祖先中的任务和祖先的孩子中回收。

linux memory cgroups

10
推荐指数
0
解决办法
953
查看次数

每次启动都必须设置 cgroups 中的进程吗?如果是这样,如何坚持它们?

我正在阅读有关使用 cgroups 设置进程限制的问题的答案。给定的示例为流程设置了限制(在示例中为sshd)。在回答中,进程的 PID 是手动设置的。这对我来说是不可接受的,我希望从给定应用程序启动的进程始终设置限制,无论它们何时启动,也不受启动多少个此类进程的限制。

也许从示例中不清楚这将如何发生,因此也欢迎提供清晰的解释或链接。内核 cgroups.txt 中的示例似乎使用与上面已经给出的模型相同的模型。

performance limit cgroups

10
推荐指数
1
解决办法
645
查看次数

使用 cgroup 限制程序运行时的内存

假设我创建了一个 cgroup,并为该 cgroup 附加了 200MB 的内存限制。然后,我在 cgroup 内运行一个内存密集型进程,它用完了 200MB 的限制。

当进程运行时,是否可以降低进程的内存消耗?那么当进程已经运行并使用 200MB 时,我可以设置 100MB 的限制吗?如果是这样,内核释放 cgroup 正在使用的 100MB 内存的速度有多快,如果进程尝试访问该内存,会发生什么情况?

cgroups

10
推荐指数
2
解决办法
2万
查看次数

如何检查系统是否正在使用 cgroupv1?

docker只能使用cgroupv1,但fedora默认只使用cgroupv2。如何检查系统是否兼容 cgroupv1?

到目前为止,这个问题的答案只能确定是否安装了cgroupv2。但无法确定unified_cgroup_hierarchy设置为0还是1。有没有统一的方法来确定系统是否与cgroupv1兼容,无论是否安装了cgroupv2?

到目前为止我用来mount -l检查是否有cgroup2 on /sys/fs/cgroup. 如果有,则表示仅限 cgroupv2。这种方法是否普遍适用于所有发行版?到目前为止我只在 Fedora 和 ubuntu 上进行了测试。如果不是,是否有通用的方法来确定这一点?

cgroups

10
推荐指数
1
解决办法
5168
查看次数

使用cgroup限制virtualbox的内存使用

我正在尝试使用cgroup(Control Group) 来限制 virtualbox 的内存使用,但它似乎不起作用。

我的机器是:

$ uname -a
Linux fc.bgi 2.6.40-4.fc15.i686 #1 SMP Fri Jul 29 18:54:39 UTC 2011 i686 i686 i386 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

我试图让它像这样工作:

  1. 在内存层次结构下创建新的 cgroup:

    $ cgcreate -g memory:vbox
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为 vbox 设置 memory.limit_in_bytes:

    $ cgset -r memory.limit_in_bytes=512M vbox
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将运行 pid 的 vbox 分组到 vbox:

    $ cgclassify -g memory:vbox 20015
    
    Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么这不起作用吗?

fedora virtualbox cgroups

9
推荐指数
1
解决办法
3302
查看次数

您可以将带宽限制到基于 tmpfs 的 ramdisk 吗?

我使用 tmpfs 创建了一个 ramdisk,如下所示:

sudo mount -t tmpfs -o size=1024m tmpfs /myramdisk
Run Code Online (Sandbox Code Playgroud)

我正在研究 cgroup blkio 子系统带宽限制“read_bps_device”和“write_bps_device”,但它们似乎需要您想要限制访问的块设备的主要和次要编号。

有没有办法实现与内存中 tmpfs ramdisk 类似的带宽限制?

更新:我找到了一种迂回的方法来完成这个。我先nfs 导出ramdisk 挂载。然后 nfs 在同一台机器上通过环回挂载它。然后我使用 linux 网络流量整形来设置带宽限制。这似乎提供了我需要的东西。我正在执行一些测量以查看这种可怕的分层所带来的损失。过几天我会更新这方面的信息。

io bandwidth limit cgroups ramdisk

9
推荐指数
1
解决办法
986
查看次数