systemd/cgroup 리소스 제한 - 호스트 간의 다른 동작

systemd/cgroup 리소스 제한 - 호스트 간의 다른 동작

혼란스러워요. Ubuntu 20.04를 실행하는 물리적 서버와 vagrantUbuntu 20.04를 실행하는 (VirtualBox) 가상 머신이 있습니다 . 둘 다 hwe5.13 커널을 사용하여 실행 중이며 systemd 245 (245.4-4ubuntu3.17)둘 다에서 systemd.unified_cgroup_hierarchy=1사용하도록 설정했습니다 cgroup-v2. 재부팅 후 cgroup-v2둘 다 설치되어 있지 않으므로 v1시스템이 깨끗합니다 v2.

첫 번째 질문

첫 번째 차이점은 활성화된 기본 컨트롤러입니다. cat /sys/fs/cgroup/cgroup.subtree_control:

  • cpuset cpu io memory pids가상 머신에서
  • io memory pids실제 머신에서

첫 번째 질문: 왜요? :) 기본적으로 활성화되는 컨트롤러를 어떻게 제어할 수 있나요? 설정해 보았지만 DefaultCPUAccounting=yes도움이 되지 않았습니다. 그리고 echo "+cpu" >> ...그것은 일시적일 뿐입니다.

두 번째 질문

setlimits를 사용해 보았습니다 cgroup. IO 대역폭을 제한하기로 결정 IOWriteBandwidthMax하고 dd.

sudo systemctl set-property --runtime user-1000.slice IOWriteBandwidthMax="/home 20M"

그런 다음:

dd status=progress if=/dev/zero of=kamil.test bs=1M count=2000
  • 이는 가상 머신에서 작동합니다.

    2079326208 bytes (2.1 GB, 1.9 GiB) copied, 102 s, 20.4 MB/s
    2000+0 records in
    2000+0 records out
    2097152000 bytes (2.1 GB, 2.0 GiB) copied, 102.964 s, 20.4 MB/s
    
  • 그러나 물리적 호스트에서는 그렇지 않습니다.

    2000+0 przeczytanych rekordów
    2000+0 zapisanych rekordów
    skopiowane 2097152000 bajtów (2,1 GB, 2,0 GiB), 1,10876 s, 1,9 GB/s
    

올바르게 설정된 제한 systemctl cat user-1000.slice::

# /usr/lib/systemd/system/user-.slice.d/10-defaults.conf
#  SPDX-License-Identifier: LGPL-2.1+
#
#  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=User Slice of UID %j
Documentation=man:[email protected](5)
After=systemd-user-sessions.service
StopWhenUnneeded=yes

[Slice]
TasksMax=33%

# /run/systemd/system.control/user-1000.slice.d/50-CPUQuota.conf
# This is a drop-in unit file extension, created via "systemctl set-property"
# or an equivalent operation. Do not edit.
[Slice]
CPUQuota=

# /run/systemd/system.control/user-1000.slice.d/50-IOWriteBandwidthMax.conf
# This is a drop-in unit file extension, created via "systemctl set-property"
# or an equivalent operation. Do not edit.
[Slice]
IOWriteBandwidthMax=
IOWriteBandwidthMax=/home 20000000

아, 왜 이것이 가상 머신에서는 작동하지만 실제 머신에서는 작동하지 않습니까? (두 사용자 모두 UID를 갖고 1000있으며 두 명령 모두 각자의 홈 디렉토리에서 실행됩니다.) 여기서 길을 잃었습니다. 설명을 요청하세요 :)

편집: 18:20

에 추가하면 oflag=sync한도 dd가 작동합니다. 이 플래그가 없으면 최대 속도는 2GB/s입니다. 나는 다음을 설정했다 /home 5M:

dd status=progress if=/dev/zero of=kamil.test bs=1M count=2000 oflag=sync 
skopiowane 614465536 bajtów (614 MB, 586 MiB), 123 s, 5,0 MB/s^C
586+0 przeczytanych rekordów
586+0 zapisanych rekordów
skopiowane 614465536 bajtów (614 MB, 586 MiB), 123,062 s, 5,0 MB/s

어떤 형태의 캐싱이 의심됩니다. 파일 생성이 거의 즉각적으로 이루어지면 sync명령을 호출하면 셸이 정지됩니다. 즉, 전송을 기다리고 있을 수 있습니다. systemd-cgtop이번에는 내 슬라이스에 몇 MB/s가 표시되었습니다.

친절한 안부

관련 정보