小编EM0*_*EM0的帖子

限制多个 systemd 服务实例的总内存使用量

我在 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,这基本上可以满足我的要求(当总内存使用量超过限制时,进程会被终止),但是这种方法存在一些问题:

  • 在服务启动之前,该文件在启动时并不总是存在。
  • 在 Ubuntu 18.04 上,只要systemctl daemon-reload调用此文件就会被覆盖。
  • 尝试写入文件有时会返回 write error: Device or resource busy

(在 Ubuntu 16.04 下,每当我的服务启动时,限制似乎都会重置,因此它不起作用。)

有什么方法可以让 systemd 自己设置这个值,这样我就不必反对了吗?或者其他一些方法来限制一组进程的总内存使用量?例如,它们都以同一用户身份运行,因此可以限制该用户使用的 RAM。

我什至尝试手动创建一个 cgroup ( cgcreate -t myservice:myservice -g memory:mycgroup …

linux ubuntu memory systemd cgroups

6
推荐指数
2
解决办法
4123
查看次数

第一次重新启动后,MD 设备名称更改为包括“HOSTNAME:”。如何获得一致的名称?

在 Ubuntu 18.04 上,我创建了一个 RAID 1 阵列,如下所示:

mdadm --create /dev/md/myarray --level=1 --run --raid-devices=2 /dev/sdc /dev/sdd
Run Code Online (Sandbox Code Playgroud)

然后我将输出添加mdadm --detail --scan /dev/md/myarray到 /etc/mdadm/mdadm.conf。它看起来像这样:

ARRAY /dev/md/myarray metadata=1.2 name=MYHOSTNAME:myarray UUID=...
Run Code Online (Sandbox Code Playgroud)

设备名称以“MYHOSTNAME:”为前缀。此时符号链接/dev/md/myarray仍然存在,但在我第一次重新启动后,它变成了/dev/md/MYHOSTNAME:myarray,破坏了一切。更糟糕的是,这只发生在某些机器上 - 在其他机器上,符号链接仍然存在/dev/md/myarray。所有人都在运行 Ubuntu 18.04,所以我不知道为什么。

如何为我的 MD 设备获得一致的设备路径,最好是我指定的确切路径(“/dev/md/myarray”)?我尝试编辑 mdadm.conf 以删除主机名,但即使该行说

ARRAY /dev/md/myarray metadata=1.2 name=myarray UUID=...
Run Code Online (Sandbox Code Playgroud)

符号链接在重新启动时仍然会更改 - 在“想要”主机名的机器上。我也尝试过另一种方式并在两个地方添加主机名:

ARRAY /dev/md/HOSTNAME:myarray metadata=1.2 name=HOSTNAME:myarray UUID=...
Run Code Online (Sandbox Code Playgroud)

但是再次在“不想要”主机名的机器上,符号链接在重新启动后变为 /dev/md/myarray !

我也不能使用数字设备 (/dev/md127),因为当有多个像这样创建的 MD 设备时,它们也倾向于在 md126 和 md127 之间交替!这太疯狂了!

linux mdadm md

6
推荐指数
1
解决办法
2923
查看次数

如何从 /sys/fs/cgroup 文件系统读取 systemd MemoryHigh 值?

我有一个 systemd 服务,它设置MemoryHighMemoryMax. 如果我看它的cgroup下/sys/fs/cgroup/memorymemory.limit_in_bytes文件相匹配的极限集MemoryMax,但我在哪里找到设置的值MemoryHigh?有一个文件命名,memory.soft_limit_in_bytes所以我希望它是那个,但它的值总是 9223372036854771712(8 EB?)。

MemoryHigh文档

这控制了“memory.high”控制组属性

但没有具有该名称的文件。

这是在 Ubuntu 18.04 上。

systemd cgroups

3
推荐指数
1
解决办法
470
查看次数

标签 统计

cgroups ×2

linux ×2

systemd ×2

md ×1

mdadm ×1

memory ×1

ubuntu ×1