我在 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 …
在 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 之间交替!这太疯狂了!
我有一个 systemd 服务,它设置MemoryHigh和MemoryMax. 如果我看它的cgroup下/sys/fs/cgroup/memory的memory.limit_in_bytes文件相匹配的极限集MemoryMax,但我在哪里找到设置的值MemoryHigh?有一个文件命名,memory.soft_limit_in_bytes所以我希望它是那个,但它的值总是 9223372036854771712(8 EB?)。
这控制了“memory.high”控制组属性
但没有具有该名称的文件。
这是在 Ubuntu 18.04 上。