hyunsu blog

홈동향

Linux 7.3 커널, cgroup CPU 배분 기본값과 sched_ext·Landlock 변화

목차 · 9
  1. 017.3 은 기록을 깬 사이클이고, 서버 쪽 변화는 스케줄러와 샌드박스에 몰렸다
  2. 02코어가 많을수록 cgroup 몫이 잘게 쪼개졌다
  3. 03기본값 concur 는 CPU 수와 실행 가능 태스크 수 중 작은 쪽으로 맞춘다
  4. 04sched_ext 는 이제 cgroup 마다 다른 BPF 스케줄러를 붙인다
  5. 05Landlock ABI 11 과 failfs 는 프로세스가 닿는 파일을 더 좁힌다
  6. 06ext4 IOPS·메모리 sysctl 등 나머지 서버 변경
  7. 07한국 개발자에게는 Ubuntu 26.10 노드가 먼저, LTS 는 HWE 부터 닿는다
  8. 087.3 노드를 올리기 전 확인할 것
  9. 09자주 묻는 질문

Linux 7.3 으로 올린 서버는 설정 파일을 건드리지 않아도 cgroup 끼리 CPU 를 나누는 계산이 달라진다. 그룹 가중치 분배의 기본값이 새 방식 concur 로 바뀌었고, 7.3 이전처럼 계산하게 하려면 debugfs 의 cgroup_mode 를 smp 로 돌려야 한다. 이 커널을 실은 Ubuntu 26.10 노드가 먼저 만나고, LTS 는 2027년 초 HWE 업데이트부터다.

01 7.3 은 기록을 깬 사이클이고, 서버 쪽 변화는 스케줄러와 샌드박스에 몰렸다

7.3 은 2026년 10월 18일 정식으로 나왔고, 7.4 머지 윈도우는 이튿날 열렸다. LWN 은 이번 사이클을 모든 지표에서 기록을 깬 릴리스로 정리했다. 숫자로 보면 이렇다.

항목7.3
머지 커밋을 뺀 커밋18,765개
참여 개발자3,021명
그중 처음 기여한 개발자807명

GPU 메모리 관리와 드라이버 변경이 많이 보이지만, 서버를 굴리는 쪽에서 볼 것은 셋으로 추려진다. cgroup CPU 가중치 계산이 바뀌었고, sched_ext 하위 스케줄러가 완성돼 cgroup 마다 다른 BPF 스케줄러를 둘 수 있게 됐다. 프로세스를 가두는 수단으로는 Landlock ABI 11 과 failfs·fchroot() 가 더해졌다. ext4·Btrfs 같은 나머지는 뒤쪽 표에 모았다.

02 코어가 많을수록 cgroup 몫이 잘게 쪼개졌다

7.3 이전 커널은 cgroup 하나의 전체 가중치를 CPU 마다 나눠 줬다. 그 CPU 에서 돌고 있는 그룹 태스크의 비율만큼 몫을 떼어 주는 식이다. 패치 작성자는 2026년 3월 RFC 커버 레터에서 이 구조의 한계를 짚었다. CPU 가 64개면 CPU 하나에 돌아가는 그룹 가중치가 nice 19 태스크 하나 정도로 줄어든다는 것이다. 코어가 더 많으면 몫은 더 작아지고, 정수로 담을 수 있는 한계에 닿으면서 태스크 사이 경쟁이 비틀린다.

흔히 쓰던 처방은 그룹 가중치에 CPU 수를 곱하는 것이었다. 그런데 부하가 CPU 하나에 몰리면 그 CPU 의 가중치가 nice -20 을 훌쩍 넘어 버린다. 오버플로를 막느라 그룹 가중치에 상한이 있어서 마냥 키울 수도 없다. 7.3 의 그룹 스케줄링 변경은 이 계산식을 고를 수 있게 하고, 기본값을 다른 식으로 바꾼 작업이다.

03 기본값 concur 는 CPU 수와 실행 가능 태스크 수 중 작은 쪽으로 맞춘다

계산식은 cgroup_mode 라는 손잡이로 고른다. 지금은 debugfs 의 sched/cgroup_mode 파일이고, LWN 은 이것이 sysfs 로 옮겨 갈지 아직 불확실하다고 전했다. 고를 수 있는 값은 다섯이다.

값그룹 가중치를 무엇에 맞춰 조정하나성질
smp그 CPU 에서 도는 그룹 태스크 비율7.3 이전 동작. 코어가 많으면 몫이 쪼개진다
up조정하지 않음(단일 CPU 처럼)작성자 스스로 좋은 정책이 아니라고 했다
maxCPU 수(전부 동시에 돈다고 가정)경쟁이 적을 때 가중치가 부풀려진다
concurCPU 수와 그룹의 실행 가능 태스크 수 중 작은 값기본값. 가장 정밀하고 가장 비싸다
tasks그룹의 실행 가능 태스크 수쓸 만하지만 전통적인 의미와 거리가 멀다

concur 는 경쟁이 낮을 땐 smp 와 비슷하게 움직이다가, 그룹의 실행 가능 태스크가 CPU 수에 가까워지면 max 쪽으로 옮겨 간다. 대신 값을 치른다. 그룹마다 태스크 수(tg->tasks)를 따로 세느라 부하 평균을 갱신하는 update_tg_load_avg() 가 무거워진다는 것이 커버 레터의 설명이다.

같은 묶음에서 cgroup 스케줄링의 내부 구조도 바뀌었다. 실행 가능한 엔티티를 계층마다 따로 두지 않고 한 층의 런큐에 모아, 다음 태스크를 고르는 pick 이 한 단계로 끝난다. 계층별 부하 추적은 그대로 두는 대신 실효 가중치를 enqueue·pick·tick 때마다 다시 계산한다. enqueue·dequeue 비용은 여전히 계층 깊이에 비례한다.

빠진 것도 있다. LWN 의 머지 윈도우 기사에도, 커버 레터에도 벤치마크 수치가 없다. 기본값이 바뀌었는데 얼마나 나아지는지는 각자 워크로드에서 재 봐야 안다.

04 sched_ext 는 이제 cgroup 마다 다른 BPF 스케줄러를 붙인다

sched_ext 는 BPF 프로그램으로 짠 CPU 스케줄러를 커널에 올리는 기능으로, 6.12 에 들어왔다. 다만 한 시스템에 스케줄러를 하나만 올릴 수 있었다. 데이터베이스와 VM, 배치 작업을 한 기계에 섞으면 적어도 하나는 맞지 않는 정책 아래서 돌 수밖에 없었다. 하위 스케줄러(sub-scheduler)는 7.1 에 들어갔지만 dispatch 경로만 동작했고, 7.3 에서 enqueue 경로까지 채워 구현을 마쳤다.

역할은 세 층으로 나뉜다.

층정하는 것
CPU 컨트롤러(cpu.weight·cpu.max)그룹마다 받을 CPU 시간의 양
상위 스케줄러어느 그룹이 언제 도는지, 하위 스케줄러의 dispatch 를 부를 시점
하위 스케줄러자기 cgroup 안 프로세스가 CPU 를 쓰는 방식

하위 스케줄러는 계층에 붙는 순간 어떤 CPU 권한도 없다. 상위가 scx_bpf_sub_grant() 로 CPU 집합별 권한을 넘겨 줘야 하고, 권한은 유휴 CPU 에 태스크 놓기, 그 CPU 의 dispatch 큐에 넣어 두기, 남의 태스크 선점하기의 세 단계다. 스케줄러는 자기가 가진 만큼만 아래로 넘긴다. 권한 없는 CPU 에 놓으려던 태스크는 reject 큐를 거쳐 SCX_TASK_REENQ_CAP 플래그를 달고 같은 하위 스케줄러의 enqueue 로 돌아온다.

KernelNewbies 정리를 보면 7.3 판에는 운영에 닿는 안전장치도 들어갔다. 스케줄러가 필요한 CPU 를 얻지 못해 태스크가 굶으면, 워치독이 스케줄러를 떼어 낼 때까지 기다리지 않고 커널이 정해진 대역폭 안에서 그 태스크를 직접 돌린다. 태스크가 하위 스케줄러 경계를 넘어 다른 cgroup 으로 옮겨 가면 새 소유 스케줄러로 넘어간다. 7월 LWN 기사 때만 해도 cgroup 을 옮겨도 담당 스케줄러가 그대로인 제약이 남아 있었다.

운영자가 놓치기 쉬운 지점이 하나 있다. sched_ext 문서에 따르면 커널은 cpu.max·cpu.weight·cpu.idle 값을 BPF 스케줄러에 넘겨줄 뿐이고, 그 값을 어떻게 지킬지는 스케줄러가 정하며 무시해도 된다. 컨테이너 CPU 상한을 cgroup 값으로 걸어 둔 노드에 BPF 스케줄러를 올린다면 그 스케줄러가 상한을 지키는지부터 봐야 한다. 문서상 하위 스케줄러 관련 항목은 CONFIG_EXT_SUB_SCHED 설정에 묶여 있다.

05 Landlock ABI 11 과 failfs 는 프로세스가 닿는 파일을 더 좁힌다

Landlock 은 권한 없는 프로세스가 스스로 파일·네트워크 접근을 좁히는 리눅스 보안 모듈(LSM)이다. 규칙을 걸려면 그 스레드가 no_new_privs 상태이거나 CAP_SYS_ADMIN 을 가져야 해서, 보통 prctl(PR_SET_NO_NEW_PRIVS) 를 먼저 부르고 landlock_restrict_self() 를 이어 불렀다. 7.3 에 들어온 ABI 11 은 LANDLOCK_RESTRICT_SELF_NO_NEW_PRIVS 플래그 하나로 이 두 번을 한 번으로 줄인다. no_new_privs 는 규칙 적용이 성공했을 때만 켜지고, LANDLOCK_RESTRICT_SELF_TSYNC 와 함께 쓰면 프로세스의 모든 스레드에 걸린다.

같은 풀 요청에는 거부·도메인 생성 같은 사건을 따라가는 Landlock tracepoint 도 들어갔다. OverlayFS whiteout 을 만들 때 필요한 권한은 LANDLOCK_ACCESS_FS_MAKE_CHAR 에서 LANDLOCK_ACCESS_FS_MAKE_REG 로 바뀌었다(문서의 erratum 4). Landlock 아래서 fuse-overlayfs 같은 도구를 돌린다면 규칙에 MAKE_REG 가 있어야 한다.

failfs 는 다른 방향에서 접근한다. 닿는 모든 연산을 EOPNOTSUPP 로 돌려보내는 커널 내부 파일 시스템이고, 새 시스템 호출 fchroot() 에 FD_FAILFS_ROOT 를 넘겨야만 들어간다. 흐름은 이렇다.

  1. 프로세스가 필요한 디렉터리를 미리 열어 fd 로 쥔다.
  2. fchroot(FD_FAILFS_ROOT, 0) 으로 루트를 failfs 로 옮긴다.
  3. 그 뒤 절대 경로와 절대 심볼릭 링크 조회는 모두 실패한다.
  4. 동적 링크 바이너리는 인터프리터를 찾지 못해 exec 가 실패한다.
  5. 손에 쥔 디렉터리 fd 를 기준으로 한 조회만 계속 된다.

권한 없는 프로세스도 들어갈 수 있다. no_new_privs 가 켜져 있고, 이미 chroot 상태가 아니며, fs_struct 를 다른 스레드와 나눠 쓰지 않으면 된다. 반면 나오기는 어렵다. 문서상 남은 길은 mount namespace fd 로 setns() 하는 것뿐이고, 그것도 CAP_SYS_ADMIN 등이 필요하다.

Landlockfailfs + fchroot()
막는 방식경로·포트별 허용 규칙루트를 아무것도 안 되는 곳으로 옮김
남는 접근규칙에 적은 경로·포트미리 연 fd 를 기준으로 한 조회
맞는 쓰임일반 앱·CLI 의 자기 제한필요한 fd 만 받아 도는 작업 프로세스
7.3 변화ABI 11 플래그·tracepoint새로 추가

06 ext4 IOPS·메모리 sysctl 등 나머지 서버 변경

영역7.3 에서 바뀐 것
ext4작은 direct I/O 용 단순 경로로 예시 워크로드가 1.92M→2.19M IOPS. 병렬 DIO 쓰기·fallocate() 도 빨라졌다
Btrfsfree space cache v1 을 기본으로 쓰지 않고 v2(free space tree)가 기본
메모리새 sysctl vm.panic_on_unrecoverable_memory_failure(기본 꺼짐). 켜면 커널 소유 페이지의 복구 불가 오류에서 바로 패닉
VM 호스트userfaultfd UFFDIO_REGISTER_MODE_RWP 로 게스트 메모리 작업 집합 추적
커널 스레드모든 kthread 가 nullfs 에서 시작해 /proc/2/root 는 실제 루트가 아니다
ksmbdTime Machine 지원(옵트인), 공유별 SMB3 암호화

07 한국 개발자에게는 Ubuntu 26.10 노드가 먼저, LTS 는 HWE 부터 닿는다

Ubuntu 26.10 은 10월 15일 이 커널을 싣고 나왔다. 처음 깔리는 커널 패키지는 정식판이 아니라 7.3-rc6 기반이고, OMG! Ubuntu 는 정식판이 1~2주 안에 업데이트로 온다고 전했다. 이 버전은 2027년 7월까지 9개월만 지원하는 중간 릴리스라, 운영 노드에 올릴지는 지원 기간부터 따져야 한다. 26.04 LTS 는 2027년 초 HWE 업데이트로 이 커널을 받고, GA 커널에 머무는 노드는 그 전까지 바뀌는 것이 없다.

7.3 이 다음 장기 지원(LTS) 커널이 된다는 말도 아직 확정이 아니다. OMG! Ubuntu 는 그렇게 내다봤지만, 오늘 kernel.org 장기 지원 표의 가장 새 항목은 6.18 이고 7.x 는 없다. 관리형 쿠버네티스 노드라면 제공사가 고른 커널을 따르므로, 7.3 계열이 언제 들어오는지는 노드 이미지 공지로 확인하는 편이 빠르다.

누구에게 무엇이 닿는지는 이렇게 갈린다.

누구7.3 에서 닿는 것판단
코어가 많은 노드에서 cgroup 가중치로 온라인·배치를 나눈 팀기본값 concur직접 만난다. 올리기 전에 smp 와 비교해 잰다
코어가 적고 경쟁이 낮은 작은 VM같은 기본값저경쟁에선 smp 와 비슷해 차이가 작을 것으로 본다. 공개 수치가 없으니 단정하지 않는다
BPF 스케줄러를 쓰지 않는 팀하위 스케줄러할 일 없음. sched_ext 는 BPF 스케줄러가 올라가 있을 때만 쓰인다
BPF 스케줄러를 시험하려는 팀하위 스케줄러한 cgroup 에만 붙여 시험할 길이 열렸다. CPU 상한 처리부터 확인
Landlock 을 직접 거는 앱 개발자ABI 11커널 ABI 를 보고 새 플래그를 고른다

08 7.3 노드를 올리기 전 확인할 것

  1. 노드의 커널 버전과 sched_ext·Landlock 설정을 아래 명령으로 본다.
  2. cgroup_mode 를 확인하고, 같은 부하에서 smp 와 concur 를 번갈아 걸어 지연 백분위와 처리량을 비교한다.
  3. BPF 스케줄러를 올릴 계획이면 그 스케줄러가 cpu.max·cpu.weight 를 지키는지 문서로 확인한다.
  4. Landlock 을 거는 코드는 landlock_create_ruleset(NULL, 0, LANDLOCK_CREATE_RULESET_VERSION) 으로 ABI 를 읽고, 11 이상일 때만 새 플래그를 쓰고 그 아래에선 prctl 로 떨어지게 한다.
  5. Landlock 아래서 OverlayFS whiteout 을 만드는 도구가 있으면 규칙에 MAKE_REG 를 더한다.
  6. ext4 위에서 작은 direct I/O 가 많은 워크로드는 올린 뒤 IOPS 를 다시 잰다.
bash
# 커널 버전과 관련 설정
uname -r
grep -E 'CONFIG_SCHED_CLASS_EXT|CONFIG_EXT_SUB_SCHED|CONFIG_SECURITY_LANDLOCK' /boot/config-$(uname -r)

# cgroup 가중치 방식 (debugfs, root 권한)
sudo cat /sys/kernel/debug/sched/cgroup_mode
# 비교 시험용: 7.3 이전 계산으로 돌린다
echo smp | sudo tee /sys/kernel/debug/sched/cgroup_mode

# BPF 스케줄러가 올라가 있는지 (enabled 면 사용 중)
cat /sys/kernel/sched_ext/state

cgroup_mode 는 debugfs 의 값이라 재부팅하면 기본값 concur 로 돌아온다. 이전 계산을 계속 쓰려면 부팅 때마다 다시 써 줘야 한다. 그렇게 고정하기 전에, smp 가 왜 더 나은지 잰 수치부터 남겨 두는 편이 낫다.

09 자주 묻는 질문

7.3 에서 CPU 배분이 나빠지면 되돌릴 수 있나

예. debugfs 의 sched/cgroup_mode 에 smp 를 쓰면 7.3 이전 계산으로 돌아간다. 재부팅하면 기본값 concur 로 다시 바뀐다.

BPF 스케줄러를 안 쓰면 하위 스케줄러 변경은 상관없나

예. sched_ext 는 BPF 스케줄러가 올라가 돌고 있을 때만 쓰인다. /sys/kernel/sched_ext/state 로 확인한다.

Ubuntu 26.04 LTS 는 언제 7.3 을 쓰나

2027년 초 HWE 업데이트부터다. GA 커널에 머물면 그 전까지 바뀌는 것이 없다.

7.3 이 LTS 커널인가

확정되지 않았다. 오늘 kernel.org 장기 지원 표의 가장 새 항목은 6.18 이다.