如果您有一个网络服务器(例如 nginx),您通常会使用 fast-cgi 服务器或其他应用程序 http-server 来获取动态内容。这意味着在这两种情况下,web-server 进程和 fast-cgi(或 application-http-server 进程 - 在下面称为 slave)之间有一个很好的进程分离。
网络服务器的配置使得 fast-cgi 通过套接字或 http 请求被代理。
如果从属进程中存在安全问题,则为从属和 Web 服务器创建不同的用户可以保护文件系统位置。
但是我如何在 Linux 下更多地监禁从进程?
(例如无法上网、发邮件等)
我可以想到以下路线:
在当前发行版(例如 Debian)上,最方便的方法是什么?在实践中如何做到?任何配置示例?
我需要从外部将进程/会话限制为一定数量的内核。
除了 CPU 亲和性(我不喜欢需要指定实际内核)和 cgroups(难以集成到我们的项目中)之外,还有其他可能性吗?
Cgroups 有一个名为 的模块net_prio,通过使用这个模块,我可以设置各种应用程序生成的网络流量的优先级。正如您在此处阅读的那样,这可以通过设置类似于以下内容来实现:
echo "eth0 5" > /sys/fs/cgroups/net_prio/iscsi/net_prio.ifpriomap
Run Code Online (Sandbox Code Playgroud)
但是没有关于我可以使用的优先级范围的信息。
假设我的系统中有一个程序应该具有最低的网络优先级。5的步调应该用什么?优先级是否与优先级相似nice?
我有一台带有 2.4GHz 处理器的服务器。并且有多个 cgroup,每个允许使用 25% 的 CPU。这等于 600MHz。
然后我用更快的 CPU 替换了 CPU,比如说 3.0GHz。如果我使用cpu.shares,我的容器将继续获得 3.0GHz 的 25%,现在等于 750MHz。
这意味着在更换 CPU 后,我必须重新配置我的 cgroup,使它们消耗不超过 20% 的 CPU。
有没有办法在CPU升级过程中避免这种麻烦?
我一直在阅读有关 cgroups 的文章,因为我想在嵌入式 linux 机器上创建一个资源受限的沙箱。据我了解,给定一个我们想要单独运行的二进制文件,我们可以将它作为我们定义的某个 cgroup 的成员启动。我们还可以将当前运行的进程移动到某个 cgroup 中。
但是通过谷歌搜索和查看 Red Hat cgroups 教程,我不清楚我是否可以创建一个新用户(或用户组)并说“我希望用户 A 产生的所有进程都被放置在这个和这个 cgroup 中自动地”。
例如,我想允许客户端ssh user_x@mymachine并在分配给某个 cgroup 的 ssh 会话期间创建所有进程。这可能吗?
我在 Ubuntu 16.04(即将推出 18.04)下运行一些 .NET Core 进程作为 systemd 服务。我有一个 systemd 配置文件 ( /lib/systemd/system/myservice@.service),如下所示:
[Unit]
Description=My Service %i
[Service]
Type=simple
User=myservice
EnvironmentFile=/etc/environment
WorkingDirectory=/home/myservice/instances/%i
ExecStart=/opt/dotnet/dotnet My.Service.dll
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
我想限制此服务的所有实例可以使用的 RAM总量。我不想将任何单个实例的 RAM 限制为小于该值,因此类似的设置并没有帮助。MemoryHighMemoryMax
我知道 systemd 为服务模板创建了一个 cgroup,所以我想以某种方式更改该 cgroup 的内存限制。
在 Ubuntu 18.04 上,我可以手动编辑/sys/fs/cgroup/memory/system.slice/system-myservice.slice/memory.limit_in_bytes,这基本上可以满足我的要求(当总内存使用量超过限制时,进程会被终止),但是这种方法存在一些问题:
systemctl daemon-reload调用此文件就会被覆盖。write error: Device or resource busy(在 Ubuntu 16.04 下,每当我的服务启动时,限制似乎都会重置,因此它不起作用。)
有什么方法可以让 systemd 自己设置这个值,这样我就不必反对了吗?或者其他一些方法来限制一组进程的总内存使用量?例如,它们都以同一用户身份运行,因此可以限制该用户使用的 RAM。
我什至尝试手动创建一个 cgroup ( cgcreate -t myservice:myservice -g memory:mycgroup …
如果我有这样一个cgroup中user.slice,并已CPUAccounting=true成立了,我不知道怎么一会计算特定cgroup中的CPU占用率在一段时间内(如1秒),即使用cpuacct.usage或cpuacct.stat。我知道cpuacct.usage 提供了 CPU 时间(以纳秒为单位),可用于通过在一段时间内减去它的两个快照并将其除以系统在同一时间段内的总 CPU 时间来计算 CPU 百分比(正确我,如果我错了),但我不确定如何获得一段时间内的总 CPU 时间。
有没有办法获得一段时间内的总 CPU 时间或使用不同的公式/cgroup 功能来计算 CPU 使用率?提前致谢 :)
注意:我知道systemd-cgtop,它提供了一些此类信息,但是我想以编程方式计算 CPU 使用率而无需解析systemd-cgtop
我有一个 CentOS 7.4 系统,它有许多通过 SSH 访问系统的用户。我需要一种方法来防止它们消耗系统的所有 CPU 和内存。例如,每个用户获得 1 个 CPU 内核或“1/20 份额”的 CPU 时间就可以了。
我所拥有的最接近的是在用户登录后设置每个用户切片的 CPUQuota 属性。我这样做了,但设置没有效果。我错过了什么?
/etc/systemd/user.conf已DefaultCPUAccounting=yes设置然后重新启动systemctl set-property user-43045.slice CPUAccounting=yes CPUQuota=20%dd if=/dev/zero of=/dev/null bs=1024kCPU使用率仍然没有限制。是否有任何受支持的、未弃用的方法来限制 SSH 用户?cgconfig+cgred 方法和 PAM 方法在 CentOS 7 上似乎根本不起作用。
/etc/systemd/system.conf对CPUQuota选项进行相同的更改后,现在有效果。因此 systemd 出于某种原因需要跟踪系统和用户中的事物。
我需要确定给定套接字的进程的 cgroup。具体来说,我在使用 tcp 调用我的进程的同一台机器上有一个进程,我需要识别该进程或其 cgroup。tcp 要求是因为我正在模拟第三方 API。我需要根据调用我的进程返回不同的数据。一种解决方案是使用 /proc/net/tcp 确定套接字,我可以从中获取套接字的 inode,然后遍历 /proc/*/fd 以找到列出的 inode。没有这种迭代,是否有直接的方法可以从(我假设是 sockfs)inode 映射到其 PID?
我想防止用户test(1000)绑定到 1537 以外的任何端口,因此根据systemd.resource-control我配置SocketBindAllow=1537并SocketBindDeny=any为用户 Slice 进行配置。
但我仍然可以以用户 test 身份登录,运行nc -l 1234并绑定到端口 1234。我已经验证该 nc 进程是用户切片的一部分。我可以使用SocketBind*选项来限制用户可以绑定的端口以及如何限制?
# systemd --version
systemd 252 (252.6-1)
+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK -XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified
# cat << EOF > /etc/systemd/system/user-1000.slice.d/socket.conf
[Slice]
SocketBindAllow=80
SocketBindAllow=1537
SocketBindDeny=any
EOF
# systemd-daemon-reload …Run Code Online (Sandbox Code Playgroud)