Linux 7.3 커널, cgroup CPU 배분 기본값과 sched_ext·Landlock 변화
목차 · 9
- 017.3 은 기록을 깬 사이클이고, 서버 쪽 변화는 스케줄러와 샌드박스에 몰렸다
- 02코어가 많을수록 cgroup 몫이 잘게 쪼개졌다
- 03기본값 concur 는 CPU 수와 실행 가능 태스크 수 중 작은 쪽으로 맞춘다
- 04sched_ext 는 이제 cgroup 마다 다른 BPF 스케줄러를 붙인다
- 05Landlock ABI 11 과 failfs 는 프로세스가 닿는 파일을 더 좁힌다
- 06ext4 IOPS·메모리 sysctl 등 나머지 서버 변경
- 07한국 개발자에게는 Ubuntu 26.10 노드가 먼저, LTS 는 HWE 부터 닿는다
- 087.3 노드를 올리기 전 확인할 것
- 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 처럼) | 작성자 스스로 좋은 정책이 아니라고 했다 |
max | CPU 수(전부 동시에 돈다고 가정) | 경쟁이 적을 때 가중치가 부풀려진다 |
concur | CPU 수와 그룹의 실행 가능 태스크 수 중 작은 값 | 기본값. 가장 정밀하고 가장 비싸다 |
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 를 넘겨야만 들어간다. 흐름은 이렇다.
- 프로세스가 필요한 디렉터리를 미리 열어 fd 로 쥔다.
fchroot(FD_FAILFS_ROOT, 0)으로 루트를 failfs 로 옮긴다.- 그 뒤 절대 경로와 절대 심볼릭 링크 조회는 모두 실패한다.
- 동적 링크 바이너리는 인터프리터를 찾지 못해
exec가 실패한다. - 손에 쥔 디렉터리 fd 를 기준으로 한 조회만 계속 된다.
권한 없는 프로세스도 들어갈 수 있다. no_new_privs 가 켜져 있고, 이미 chroot 상태가 아니며, fs_struct 를 다른 스레드와 나눠 쓰지 않으면 된다. 반면 나오기는 어렵다. 문서상 남은 길은 mount namespace fd 로 setns() 하는 것뿐이고, 그것도 CAP_SYS_ADMIN 등이 필요하다.
| Landlock | failfs + 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() 도 빨라졌다 |
| Btrfs | free 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 는 실제 루트가 아니다 |
| ksmbd | Time 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 노드를 올리기 전 확인할 것
- 노드의 커널 버전과 sched_ext·Landlock 설정을 아래 명령으로 본다.
cgroup_mode를 확인하고, 같은 부하에서smp와concur를 번갈아 걸어 지연 백분위와 처리량을 비교한다.- BPF 스케줄러를 올릴 계획이면 그 스케줄러가
cpu.max·cpu.weight를 지키는지 문서로 확인한다. - Landlock 을 거는 코드는
landlock_create_ruleset(NULL, 0, LANDLOCK_CREATE_RULESET_VERSION)으로 ABI 를 읽고, 11 이상일 때만 새 플래그를 쓰고 그 아래에선prctl로 떨어지게 한다. - Landlock 아래서 OverlayFS whiteout 을 만드는 도구가 있으면 규칙에
MAKE_REG를 더한다. - ext4 위에서 작은 direct I/O 가 많은 워크로드는 올린 뒤 IOPS 를 다시 잰다.
# 커널 버전과 관련 설정
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/statecgroup_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 이다.