EC2 ECS 允许您为 ECS 任务和在这些任务中运行的容器指定memory
和。memoryReservation
我了解容器设置映射memory
到memoryReservation
底层Docker 内存设置。
但是,我不确定在 EC2 ECS 下具有和设置的任务意味着什么。这仅用于ECS的任务调度,还是有一些运行时影响?memory
memoryReservation
假设我已经在容器上设置了内存限制,那么在任务上设置额外的内存限制是什么意思?
EC2 ECS 允许您为 ECS 任务和在这些任务中运行的容器指定memory
和。memoryReservation
我了解容器设置映射memory
到memoryReservation
底层Docker 内存设置。
但是,我不确定在 EC2 ECS 下具有和设置的任务意味着什么。这仅用于ECS的任务调度,还是有一些运行时影响?memory
memoryReservation
假设我已经在容器上设置了内存限制,那么在任务上设置额外的内存限制是什么意思?
Debian 10:我想限制所有用户的内存、CPU 等,除了root
; 我找到了几篇关于这个的文章,但到目前为止,它们都围绕着 cgconfig 展开,这似乎不是现在完成的方式。我已经看到了一些使用切片的建议,因此对于 UID 1000,创建如下内容:
# cat /lib/systemd/system/user-1000.slice
[Unit]
Description=User and Session Slice
Documentation=man:systemd.special(7)
Before=slices.target
MemoryHigh=20M
[Slice]
Slice=user-slice
[Install]
WantedBy=multi-user.target
并使用systemctl enable user-1000.slice
. 这似乎成功了一半:
$ systemctl status user-1000.slice
Warning: The unit file, source configuration file or drop-ins of user-1000.slice changed on disk. Run 'systemctl daemon-reload' to reload units.
● user-1000.slice - User Slice of UID 1000
Loaded: loaded (/lib/systemd/system/user-1000.slice; enabled; vendor preset: enabled)
Drop-In: /usr/lib/systemd/system/user-.slice.d
└─10-defaults.conf
Active: active since Thu 2020-07-09 07:37:28 UTC; 1h 8min ago
Docs: man:systemd.special(7)
man:[email protected](5)
Tasks: 7 (limit: 5237)
Memory: 5.4M
CGroup: /user.slice/user-1000.slice
├─session-15.scope
│ ├─1089 sshd: jan [priv]
│ ├─1107 sshd: jan@pts/1
│ ├─1108 -bash
│ ├─1113 systemctl status user-1000.slice
│ └─1114 pager
└─[email protected]
└─init.scope
├─1092 /lib/systemd/systemd --user
└─1093 (sd-pam)
但是,MemoryHigh
未设置:
$ systemctl show user-1000.slice
Slice=user.slice
ControlGroup=/user.slice/user-1000.slice
...
MemoryHigh=infinity
...
我似乎很接近,但一定少了点什么——那是什么?
我正在努力了解如何在我的 debian 10 系统上设置新切片。我system-db.slice
通过复制system.slice
和更改几件事创建了一个文件:
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=System DB Slice
Documentation=man:systemd.special(7)
DefaultDependencies=no
Before=slices.target
Requires=system.slice
After=system.slice
这似乎根本没有做任何事情。例如,它不会出现在 中systemd-cgls
。另一方面,systemctl
发现它:
# systemctl status system-db.slice
● system-db.slice - System DB Slice
Loaded: loaded (/etc/systemd/system/system-db.slice; static; vendor preset: enabled)
Active: inactive (dead)
Docs: man:systemd.special(7)
显然有些事情我没有做或做错。我应该怎么做?我在哪里可以了解更多信息?
我运行一个服务器,主要用于随机 Docker 容器和作为 Gitlab-CI 运行器。每隔一段时间,当服务器运行一周左右时,我就会遇到进程资源限制。
例如,我尝试配置 gitlab runner,
...
Registering runner... succeeded runner=gy1zjHEv
runtime: failed to create new OS thread (have 9 already; errno=11)
runtime: may need to increase max user processes (ulimit -u)
fatal error: newosproc
...
或者几分钟后,尝试安装该strace
实用程序
(in dutch)
...
Instellen van strace (4.21-1ubuntu1) ...
Bezig met afhandelen van triggers voor man-db (2.8.3-2ubuntu0.1) ...
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
Bezig met afhandelen van triggers voor libc-bin (2.27-3ubuntu1) ...
它转化为fork failed: Resource is temporarily unavailable
有什么东西导致fork
抛出EAGAIN
。
$ ulimit -u
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 1029355
max locked memory (kbytes, -l) 16384
max memory size (kbytes, -m) unlimited
open files (-n) 32768
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 62987
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
我的最大用户进程设置为62987
,我离使用 62,000 个进程还差得很远。gitlab 异常还显示当前进程数为 9,这应该是“太高”了吗?
如果我离配置的 ulimit 不远,克隆怎么可能遇到进程资源限制?
我有一个容器泄漏内存。或者至少,报告的内存消耗快速上升。如果我跑得最好,我会得到这个:
top - 16:56:51 up 6 days, 17:25, 0 users, load average: 0.16, 0.27, 0.31
Tasks: 4 total, 1 running, 3 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.3 us, 0.7 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 7676380 total, 4089380 used, 3587000 free, 675164 buffers
KiB Swap: 0 total, 0 used, 0 free. 2586496 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 46924 15196 6456 S 0.0 0.2 0:15.54 supervisord
8 root 20 0 3526084 47976 29660 S 0.0 0.6 0:59.15 dotnet
568 root 20 0 20364 3332 2728 S 0.0 0.0 0:00.09 bash
2800 root 20 0 21956 2420 2032 R 0.0 0.0 0:00.00 top
我现在报出来的数字是90M,不算加起来。我很确定/sys/fs/cgroup/memory/memory.usage_in_bytes
报告的内容是:
> cd /sys/fs/cgroup/memory/
> cat cgroup.procs
1
8
568
2494
> cat memory.usage_in_bytes
92282880
> pmap -p 1 | tail -n 1
total 46924K
> pmap -p 8 | tail -n 1
total 3599848K
> pmap -p 568 | tail -n 1
total 20364K
> ps 2494
PID TTY STAT TIME COMMAND
在我看来,这里有大量的内存“丢失”......如果我memory.usage_in_bytes
在这段时间里再次猫,我一直在输入这个:
> cat memory.usage_in_bytes
112291840
> pmap -p 1 | tail -n 1
total 46924K
> pmap -p 8 | tail -n 1
total 3452320K
> pmap -p 568 | tail -n 1
total 20368K
显然没有什么可以解释这种内存使用情况。如果我看一下,memory.stat
我会看到:
# cat memory.stat
cache 89698304
rss 30699520
rss_huge 0
mapped_file 1552384
writeback 0
pgpgin 102007
pgpgout 72613
pgfault 115021
pgmajfault 8
inactive_anon 1519616
active_anon 30789632
inactive_file 417792
active_file 87654400
unevictable 4096
hierarchical_memory_limit 18446744073709551615
total_cache 89698304
total_rss 30699520
total_rss_huge 0
total_mapped_file 1552384
total_writeback 0
total_pgpgin 102007
total_pgpgout 72613
total_pgfault 115021
total_pgmajfault 8
total_inactive_anon 1519616
total_active_anon 30789632
total_inactive_file 417792
total_active_file 87654400
total_unevictable 4096
片刻之后:
# cat memory.stat
cache 89972736
rss 30777344
rss_huge 0
mapped_file 1552384
writeback 0
pgpgin 102316
pgpgout 72836
pgfault 115674
pgmajfault 8
inactive_anon 1519616
active_anon 30867456
inactive_file 417792
active_file 87928832
unevictable 4096
hierarchical_memory_limit 18446744073709551615
total_cache 89972736
total_rss 30777344
total_rss_huge 0
total_mapped_file 1552384
total_writeback 0
total_pgpgin 102316
total_pgpgout 72836
total_pgfault 115674
total_pgmajfault 8
total_inactive_anon 1519616
total_active_anon 30867456
total_inactive_file 417792
total_active_file 87928832
total_unevictable 4096
但我会说实话;我真的不知道我在看什么。我又怀疑地看着active_file
;我真的不知道我在看什么。
一些注释和观察:
所以!我应该如何去寻找这些内存被消耗的地方?有什么对任何人来说显而易见的东西——也许有什么东西在盯着我看,或者我没有看我应该看到的东西?
谢谢!
我正在寻找一种方法来透明地冻结(暂停)一个进程,然后再解冻它。这在 中是可能的SIGSTOP
,但SIGSTOP
会导致父级被通知(通过从 中返回waitpid
),这例如导致 bash 将交互式进程置于后台(该方法的问题在此链接中有更详细的描述)。
cgroup
子系统有办法通过写入 中的文件来完成此操作/sys/fs/cgroup/freezer/
,但这仅适用于 cgroup 级别 - 也就是说,您一次只能冻结整个进程/线程组。我想可以通过安排将每个进程放在自己的 cgroup 中来解决这个问题,但这似乎有点麻烦,而且可能很危险,因为systemd
et al. 已经cgroups
用于他们自己的目的。
我非常接近于编写一个将底层freeze_task
API 暴露给用户空间的内核模块,但如果可能的话,我真的很想避免这样做!
我通过源安装了一个 Jboss 应用程序服务器,并在不同端口上的单个机器上以同一用户的身份运行多个 JBoss 实例(比如 3 个)。使用 cgroups,我尝试为我启动的每个实例进行不同的资源分配。我知道 cgclassify 可以将进程附加到 cgroup,但我不想要这个。理想情况下,我需要一种方法来使用相应的 cggroup 启动实例/进程本身。
是否可以限制每个用户而不是每个组的内存使用量?
这是我的配置...
/etc/cgconfig.conf
mount {
cpu = /cgroup/cpu_and_mem;
cpuacct = /cgroup/cpu_and_mem;
memory = /cgroup/cpu_and_mem;
}
group small {
cpu {
cpu.shares="100";
}
cpuacct {
cpuacct.usage="0";
}
memory {
memory.limit_in_bytes="200M";
memory.memsw.limit_in_bytes="200M";
}
}
/etc/cgrules.conf
@guests cpu,cpuacct,memory small
user1 cpu,cpuacct,memory small
user2 cpu,cpuacct,memory small
现在我只看到一个选项来创建组 small1 并将 user1 链接到该组,然后将 user2 链接到 small2 等等,如下所示:
/etc/cgconfig.conf
group small1 {
cpu {
cpu.shares="100";
...
group small2 {
cpu {
cpu.shares="100";
...
/etc/cgrules.conf
user1 cpu,cpuacct,memory small1
user2 cpu,cpuacct,memory small2
有人知道更好的方法吗?
我一直在研究如何对进程进行沙盒处理,并且遇到了看起来很有希望的 cgroups。我对为此使用虚拟化或 strace 不太感兴趣,因为我希望程序尽可能快地运行。我也知道 SELinux/AppArmor,但我正在寻找尽可能不需要内核补丁的东西。
我知道 cgroups 可用于限制 cpu/mem 使用和文件系统访问,但它能否用于防止进程打开套接字或绑定到端口?或者,有什么东西可以与 cgroups 结合使用来限制网络访问吗?能够分别限制每个人会很棒。
再次感谢!