我使用 KVM 来管理我的虚拟机。我正在尝试限制为 VM 提供的资源。我可以使用 libvirt/cgroups 限制为 VM 分配的 CPU 和内存。现在我想通过应用一些权重来控制为每个 VM 分配的磁盘时间。我查看了 cgroups 中的 blkio 控件。由于 VM 只是一个 Linux 进程,我将能够使用 cgroups,但我不确定它是否也适用于异步 IO。如果没有,有人可以提出一个好的替代解决方案吗?
我有一个 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 中运行的线程的调度策略和优先级是否重要?
我在单核机器上有 3 个进程。每个进程都完全相同,并且尽可能快地消耗 CPU(紧密循环)。其中两个 (A和B) 使用 cgexec 在不同的组中启动,共享设置为 512 和 512。第三个 ( C) 定期启动,而不是使用 cgexec。
一旦所有的启动和运行,C得到CPU,而66%A和B分裂33%。如果我杀了C,然后A和B获得各50%(预期)。
为什么会C得到66%?在这种情况下,我预计各为 33%,或者可能为 50% (C)、25% (A) 和 25% (B)。C不管我如何计算,66% 的结果都行不通。
一般来说,我想了解在资源共享(特别是 CPU,但如果不是太复杂的话,更通用的答案)时cgexec,进程是如何在不与启动的进程交互的情况下启动的cgexec。
我有一台带有交换分区的标准 Linux(Debian 测试)笔记本电脑。
我用它做了很多实验。其中一些真的很占用内存,Linux 默认的行为方式对我来说是一个问题......让我们举一个愚蠢的例子:
python,然后a = [0]*100000000现在很可能您没有足够的 RAM 来处理那个大列表。Linux 将填充 RAM,然后进行交换,几分钟后,OOM 杀手将被触发并终止(几乎)随机服务,并且希望,如果您在合适的时间按下 Ctrl+C python,并且如果终端仍然有焦点,计算机将再次响应。
我想强制执行一些内存限制以避免不必要的交换并拒绝进程分配比我拥有的内存(在 RAM 中)更多的内存的权利。如果内存需求低于某个限制或被 root 询问,那么就杀死除 root 之外的任何用户的最耗内存的进程。
ulimit -Sv [mem] 我在后面听到了!
呵呵!“使用cgroups通过cgexec!” 第一排有人说!
是的,您是对的:这些确实是非常好的解决方案。但:
我想要的是内核说:“你属于用户foo(不是 root),你使用了很多内存,我们会用完内存。对不起,伙计......死吧!”
或者:“你到底在做什么?你需要x MB 而只有y MB 可用。是的,SWAP 是空的,但你不打算使用 SWAP 来做你的脏活,是吗?不,我说不!没有你的记忆!如果你坚持,你会死的!
cgroup 有 2 个内存控制选项:
memory.use_hierarchy = 1 : 使用层次结构memory.use_hierarchy = 0:使用平面层次结构,根据这个答案两者有什么区别?我认为,等级就是等级,这里的“扁平”是什么意思?
在上图中,启用分层记帐后,e 的所有内存使用量都被记入其祖先,直到根(即 c 和根)启用了 memory.use_hierarchy。如果祖先之一超过其限制,则回收算法从祖先中的任务和祖先的孩子中回收。
accounted to its ancestors up until the root?如果祖先之一超过其限制,则回收算法从祖先中的任务和祖先的孩子中回收。
假设我创建了一个 cgroup,并为该 cgroup 附加了 200MB 的内存限制。然后,我在 cgroup 内运行一个内存密集型进程,它用完了 200MB 的限制。
当进程运行时,是否可以降低进程的内存消耗?那么当进程已经运行并使用 200MB 时,我可以设置 100MB 的限制吗?如果是这样,内核释放 cgroup 正在使用的 100MB 内存的速度有多快,如果进程尝试访问该内存,会发生什么情况?
docker只能使用cgroupv1,但fedora默认只使用cgroupv2。如何检查系统是否兼容 cgroupv1?
到目前为止,这个问题的答案只能确定是否安装了cgroupv2。但无法确定unified_cgroup_hierarchy设置为0还是1。有没有统一的方法来确定系统是否与cgroupv1兼容,无论是否安装了cgroupv2?
到目前为止我用来mount -l检查是否有cgroup2 on /sys/fs/cgroup. 如果有,则表示仅限 cgroupv2。这种方法是否普遍适用于所有发行版?到目前为止我只在 Fedora 和 ubuntu 上进行了测试。如果不是,是否有通用的方法来确定这一点?
我正在尝试使用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)
我试图让它像这样工作:
在内存层次结构下创建新的 cgroup:
$ cgcreate -g memory:vbox
Run Code Online (Sandbox Code Playgroud)为 vbox 设置 memory.limit_in_bytes:
$ cgset -r memory.limit_in_bytes=512M vbox
Run Code Online (Sandbox Code Playgroud)将运行 pid 的 vbox 分组到 vbox:
$ cgclassify -g memory:vbox 20015
Run Code Online (Sandbox Code Playgroud)有人可以解释为什么这不起作用吗?
我使用 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 网络流量整形来设置带宽限制。这似乎提供了我需要的东西。我正在执行一些测量以查看这种可怕的分层所带来的损失。过几天我会更新这方面的信息。
cgroups ×10
limit ×3
linux ×3
io ×2
memory ×2
bandwidth ×1
block-device ×1
fedora ×1
kvm ×1
performance ×1
priority ×1
ramdisk ×1
scheduling ×1
ulimit ×1
virtualbox ×1