네트워크 스케줄러

네트워크 스케줄러(network scheduler)는 패킷 스케줄러(packet scheduler), 큐잉 규율(queueing discipline, qdisc), 또는 큐잉 알고리즘(queueing algorithm)이라고도 불리며, 패킷 교환 통신 네트워크의 노드에 있는 아비터이다. 이는 프로토콜 스택과 네트워크 인터페이스 컨트롤러의 송수신 큐에서 네트워크 패킷의 시퀀스를 관리한다. 여러 운영체제에서 사용할 수 있는 다양한 네트워크 스케줄러가 있으며, 이들은 기존의 많은 스케줄링 알고리즘을 구현한다.
네트워크 스케줄러 로직은 다음으로 전달할 네트워크 패킷을 결정한다. 네트워크 스케줄러는 네트워크 패킷을 전송될 때까지 임시로 저장하는 큐잉 시스템과 연결되어 있다. 시스템은 단일 또는 다수의 큐를 가질 수 있으며, 이 경우 각 큐는 하나의 흐름, 트래픽 분류, 또는 우선순위의 패킷을 보관할 수 있다.
어떤 경우에는 시스템의 제약 내에서 모든 전송을 스케줄링하는 것이 불가능할 수도 있다. 이러한 경우 네트워크 스케줄러는 어떤 트래픽을 전달하고 어떤 것을 삭제할지 결정하는 역할을 한다.
용어 및 책임
[편집]네트워크 스케줄러는 특정 네트워크 트래픽 제어 이니셔티브를 구현하는 데 책임이 있을 수 있다. 네트워크 트래픽 제어는 네트워크 혼잡, 지연 및 패킷 손실을 줄이는 것을 목표로 하는 모든 조치를 포괄하는 용어이다. 특히, 액티브 큐 관리 (AQM)는 과도한 네트워크 혼잡을 방지하기 위한 더 큰 목표를 달성하기 위해 대기 중인 네트워크 패킷을 선택적으로 삭제하는 것이다. 스케줄러는 삭제할 패킷을 선택해야 한다. 트래픽 셰이핑은 패킷이 버스트로 대기열에 있을 때 전송을 지연시켜 트래픽 흐름의 대역폭 요구 사항을 부드럽게 한다. 스케줄러는 전송되는 패킷의 타이밍을 결정한다. QoS는 서비스 클래스(차등화 서비스) 또는 예약된 연결(통합 서비스)을 기반으로 트래픽에 우선순위를 부여하는 것이다.
알고리즘
[편집]시간이 지남에 따라 많은 네트워크 큐잉 규율이 개발되었다. 이들 각각은 다양한 송수신 버퍼 내에서 네트워크 패킷의 특정 재정렬 또는 삭제를 제공한다.[1] 큐잉 규율은 특정 클래스의 네트워크 패킷에 대한 지연을 줄이는 것과 같이 다양한 네트워킹 조건을 보상하려는 시도로 일반적으로 사용되며, 주로 QoS 조치의 일부로 사용된다.[2][3][4]
클래스 기반 큐잉 규율은 나무의 가지처럼 작동하는 클래스를 생성할 수 있게 한다. 그런 다음 패킷을 각 클래스로 필터링하는 규칙을 설정할 수 있다. 각 클래스는 그 자체로 다른 클래스 기반 또는 클래스리스 큐잉 규율을 할당받을 수 있다. 클래스리스 큐잉 규율은 더 많은 큐잉 규율을 추가하는 것을 허용하지 않는다.[5]
네트워크 트래픽 관리에 적합한 알고리즘의 예시는 다음과 같다.
| 알고리즘 | 약어 | 유형 | HW 지원 |
|---|---|---|---|
| 일반 셀 속도 알고리즘 | GCRA | ||
| 무응답 흐름을 위한 CHOose and Kill | CHOKe | Classless | |
| 제어된 지연 | CoDel | Classless | |
| Common Applications Kept Enhanced[6] | CAKE | ||
| Earliest TxTime First | ETF | Classless | 예 |
| 선입 선출 | FIFO | Classless | |
| 공정 큐잉 | FQ | Classless | |
| 공정 큐잉 제어 지연 | FQ-CoDel | Classless | |
| Proportional Integral controller Enhanced를 이용한 Flow Queuing | FQ-PIE | Classless | |
| 일반화된 무작위 조기 감지 | GRED | Classless | |
| Heavy-Hitter Filter[7] | HHF | Classless | |
| Multiqueue Priority | MQ-PRIO | Classless | 예 |
| Multiqueue | MULTIQ | Classless | 예 |
| 네트워크 에뮬레이터[8] | NETEM | Classless | |
| Proportional Integral controller-Enhanced[9] | PIE | Classless | |
| 무작위 조기 검출 | RED | Classless | |
| 확률적 공정 블루 | SFB | Classless | |
| Stochastic Fairness Queueing | SFQ | Classless | |
| 토큰 버킷 필터 | TBF | Classless | |
| 클래스 기반 큐잉 | CBQ | Classful | |
| 크레딧 기반 셰이퍼 | CBS | Classful | 예 |
| 디피싯 라운드 로빈[10] | DRR | Classful | |
| 향상된 전송 선택 | ETS | Classful | |
| 계층적 공정 서비스 곡선 | HFSC | Classful | |
| 계층적 토큰 버킷[11] | HTB | Classful | |
| Priority | PRIO | Classful | |
| Quick Fair Queueing[12] | QFQ | Classful | |
| 시간 인식 우선순위 셰이퍼 | TAPRIO | Classful | 예 |
위에 제시된 몇 가지는 리눅스 커널 모듈로 구현되었으며[13][14] 자유롭게 이용 가능하다.
버퍼블로트
[편집]버퍼블로트는 패킷 교환 네트워크에서 과도한 패킷 버퍼링으로 인해 높은 지연과 패킷 지연 변화가 발생하는 현상이다. 버퍼블로트는 불필요하게 높은 버퍼링 백로그를 피하기 위해 패킷을 전략적으로 삭제하는 네트워크 스케줄러로 해결할 수 있다. 예를 들어 CoDel, FQ-CoDel, 무작위 조기 검출 등이 있다.
구현
[편집]리눅스 커널
[편집]
리눅스 커널 패킷 스케줄러는 리눅스 커널의 네트워크 스택의 필수적인 부분이며 모든 NIC의 송수신 링 버퍼를 관리한다.
패킷 스케줄러는 tc (트래픽 제어의 약어)라는 유틸리티를 사용하여 구성된다. 기본 큐잉 규율로서 패킷 스케줄러는 pfifo_fast라고 불리는 선입 선출 구현을 사용하지만,[15] systemd는 버전 217부터 기본 큐잉 규율을 fq_codel로 변경했다.[16]
Ifconfig 및 ip 유틸리티를 통해 시스템 관리자는 각 장치에 대해 이더넷 프레임 수 기준으로 크기에 관계없이 버퍼 크기 txqueuelen 및 rxqueuelen을 별도로 구성할 수 있다. 리눅스 커널의 네트워크 스택에는 네트워크 스케줄러가 관리하지 않는 다른 버퍼들이 포함되어 있다.[a]
버클리 패킷 필터 필터는 패킷 스케줄러의 분류기에 첨부될 수 있다. 2015년 리눅스 커널 버전 4.1에서 도입된 eBPF 기능은 고전적인 BPF 프로그래밍 가능한 분류기를 eBPF로 확장한다.[17] 이들은 LLVM eBPF 백엔드를 사용하여 컴파일하고 tc 유틸리티를 사용하여 실행 중인 커널에 로드할 수 있다.[18]
BSD 및 OpenBSD
[편집]ALTQ는 BSD를 위한 네트워크 스케줄러 구현이다. OpenBSD 버전 5.5부터 ALTQ는 HFSC 스케줄러로 대체되었다.
셀 프리 네트워크 스케줄링
[편집]통신 네트워크의 스케줄러는 패킷 우선순위, 타이밍, 자원 분배를 포함한 자원 할당을 관리한다. 고급 구현은 현대 네트워크 구성의 복잡성을 해결하기 위해 인공지능을 increasingly 활용한다. 예를 들어, 셀 프리 네트워크에서는 다수의 무선 장치(RU)와 사용자 장비(UE) 간의 상호작용을 효율적으로 처리하기 위해 지도 신경망(NN) 기반 스케줄러가 도입되었다. 이 접근 방식은 계산 복잡성을 줄이면서 지연 시간, 처리량 및 자원 할당을 최적화하여 5G 이후 네트워크를 위한 유망한 솔루션이 되고 있다.[19]
같이 보기
[편집]내용주
[편집]각주
[편집]- ↑ “Traffic Control HOWTO: Classless Queuing Disciplines (qdiscs)”. 《tldp.org》. 2014년 2월 22일에 원본 문서에서 보존된 문서. 2013년 11월 24일에 확인함.
- ↑ “Traffic Control HOWTO: Components of Linux Traffic Control”. 《tldp.org》. 2014년 2월 18일에 원본 문서에서 보존된 문서. 2013년 11월 24일에 확인함.
- ↑ “Traffic Control HOWTO: Traditional Elements of Traffic Control”. 《tldp.org》. 2013년 5월 27일에 원본 문서에서 보존된 문서. 2013년 11월 24일에 확인함.
- ↑ “Queuing Disciplines: Order of Packet Transmission and Dropping” (PDF). 《tau.ac.il》. 2006년 10월 25일. 2016년 3월 4일에 원본 문서 (PDF)에서 보존된 문서. 2014년 3월 18일에 확인함.
- ↑ “Advanced traffic control - ArchWiki”. 《wiki.archlinux.org》. 2023년 9월 22일에 원본 문서에서 보존된 문서. 2023년 9월 11일에 확인함.
- ↑ “Let them run CAKE”. LWN.net. 2024년 11월 12일에 원본 문서에서 보존된 문서. 2019년 9월 3일에 확인함.
- ↑ “Heavy-Hitter Filter qdisc”. kernel.org. 2017년 2월 22일에 원본 문서에서 보존된 문서. 2016년 7월 25일에 확인함.
- ↑ “Network emulator Linux kernel network scheduler module”. kernel.org. 2017년 2월 22일에 원본 문서에서 보존된 문서. 2013년 9월 7일에 확인함.
- ↑ “Proportional Integral controller Enhanced (PIE)”. kernel.org. 2017년 2월 22일에 원본 문서에서 보존된 문서. 2016년 7월 25일에 확인함.
- ↑ “DRR Linux kernel network scheduler module”. kernel.org. 2017년 2월 23일에 원본 문서에서 보존된 문서. 2013년 9월 7일에 확인함.
- ↑ “HTB Linux kernel network scheduler module”. kernel.org. 2013년 9월 7일에 확인함.
- ↑ “QFQ Linux kernel network scheduler module”. kernel.org. 2017년 2월 23일에 원본 문서에서 보존된 문서. 2013년 9월 7일에 확인함.
- ↑ “The Linux kernel network scheduler”. kernel.org. 2012년 12월 26일. 2013년 9월 7일에 확인함.
- ↑ “tc(8) - Linux manual page”. 《man7.org》. 2023년 9월 7일에 원본 문서에서 보존된 문서. 2023년 9월 11일에 확인함.
- ↑ “Linux Advanced Routing and Traffic Control HOWTO, Section 9.2.1. pfifo_fast”. 《lartc.org》. 2012년 5월 19일. 2014년 9월 21일에 원본 문서에서 보존된 문서. 2014년 9월 19일에 확인함.
- ↑ “systemd System and Service Manager: NEWS file”. 《freedesktop.org》. 2015년 5월 22일. 2014년 12월 22일에 원본 문서에서 보존된 문서. 2015년 6월 9일에 확인함.
- ↑ “Linux kernel 4.1, Section 11. Networking”. 《kernelnewbies.org》. 2015년 6월 21일. 2015년 10월 16일에 원본 문서에서 보존된 문서. 2016년 4월 19일에 확인함.
- ↑ “BPF and XDP Reference Guide”. 《Cilium documentation web site》. 2018년 4월 24일에 원본 문서에서 보존된 문서. 2018년 8월 21일에 확인함.
- ↑ Huleihel, Yara; Maman, Gil; Hadad, Zion; Shasha, Eli; Permuter, Haim H. (2025). 《Data-driven cell-free scheduler》. 《Ad Hoc Networks》 169 (Elsevier). doi:10.1016/j.adhoc.2025.103738.