Linus Torvalds expressou sua disposição de aceitar no núcleo do Linux 6.11, cuja liberação está prevista para o final de setembro, patches que implementam o mecanismo "sched_ext" (SCX), permitindo o uso de eBPF para criar escalonadores de CPU que abrangem praticamente todos os aspectos do agendamento de tarefas e distribuição de recursos de CPU. Esses escalonadores podem ser carregados dinamicamente e executados dentro do núcleo do Linux em uma máquina virtual eBPF, onde, graças à aplicação da compilação JIT, o bytecode é traduzido em instruções de máquina e executado com a performance do código compilado.
Os patches propostos implementam uma nova classe de agendamento SCHED_EXT, para a qual a prioridade de chamada pelo núcleo está entre as classes SCHED_IDLE e SCHED_NORMAL, o que impede que os manipuladores BPF, vinculados ao SCHED_EXT, afetem as tarefas já anexadas ao escalonador padrão (SCHED_NORMAL), mas permite a anexação de tarefas individuais ao SCHED_EXT ou a movimentação para processamento de todos os processos com prioridade abaixo da execução em tempo real. Se não houver manipuladores BPF vinculados ao SCHED_EXT, todos os processos movidos para a classe SCHED_EXT serão processados pelo escalonador SCHED_NORMAL. O funcionamento dos manipuladores BPF envolve a análise de filas de tarefas aguardando execução na CPU (uma fila global e uma fila por núcleo de CPU) e a seleção da tarefa que deve receber os recursos da CPU quando um núcleo de CPU se torna disponível.
O mecanismo sched_ext simplifica a criação de escalonadores específicos para determinadas tarefas, permitindo experimentar diferentes técnicas e estratégias de agendamento, além de possibilitar a rápida criação de protótipos funcionais e a substituição de escalonadores em tempo real nas infraestruturas de trabalho. Por exemplo, com o sched_ext, é possível criar um escalonador que leva em consideração as especificidades de um determinado aplicativo e altera dinamicamente a estratégia de agendamento de sua execução com base no estado do sistema e em outros fatores adicionais.
Atualmente, cerca de uma dezena de escalonadores baseados no sched_ext estão em desenvolvimento, cuja lógica de agendamento de tarefas é definida no espaço do usuário e carregada no núcleo na forma de programas BPF:
- scx_layered — um planejador de tarefas híbrido que divide as tarefas em camadas, cada uma com sua própria estratégia de agendamento. Por exemplo, o scx_layered permite isolar certas tarefas em uma camada separada, para as quais serão fornecidos recursos garantidos de CPU, ou aumentar a prioridade de aplicativos específicos. O planejador está sendo desenvolvido pela empresa Meta. A lógica de geração BPF que opera no espaço do usuário foi escrita em Rust.
- scx_rustland — um planejador otimizado para aumentar a prioridade de tarefas interativas em meio a tarefas que exigem muito CPU. Por exemplo, em um teste que executou o jogo Terraria enquanto compunha o kernel, o planejador scx_rustland permitiu alcançar um FPS mais alto no jogo do que ao utilizar o planejador padrão EEVDF. O projeto está sendo desenvolvido por um funcionário da Canonical. A lógica de geração BPF que opera no espaço do usuário foi escrita em Rust.
- scx_lavd — uma implementação do algoritmo de agendamento de tarefas LAVD (Latency-criticality Aware Virtual Deadline), que considera a importância da redução de latência para determinadas tarefas e utiliza informações sobre o andamento dos processos ao tomar decisões sobre a alocação de recursos de CPU. O planejador está sendo desenvolvido pelas empresas Igalia e Valve para reduzir a latência em jogos de computador e tarefas interativas. A lógica de geração BPF que opera no espaço do usuário foi escrita em Rust.
- scx_rusty, scx_rlfifo, scx_mitosis — exemplos de planejadores com componentes no espaço do usuário escritos em Rust, que implementam balanceamento entre grupos de tarefas com base na carga, o planejador FIFO mais simples e um planejador para vincular grupos de tarefas a núcleos de CPU.
- scx_central, scx_flatcg, scx_nest, scx_pair, scx_qmap, scx_simple, scx_userland — exemplos de planejadores com componentes no espaço do usuário escritos em C, que ilustram várias capacidades do sched-ext.
O mecanismo sched_ext foi inicialmente proposto para consideração pelos desenvolvedores do núcleo em 2022, após o que foram publicadas seis versões do patch. Apesar da ausência de suporte na versão principal do núcleo, os distribuições Ubuntu, Arch Linux, Fedora e NixOS oferecem a possibilidade de instalação do sched_ext através de pacotes adicionais. A Canonical está considerando incluir componentes do sched-ext na versão 24.10 do Ubuntu, enquanto a Valve está trabalhando na integração do sched_ext no Steam Deck. A empresa Meta já está utilizando um planejador baseado em sched_ext em sua infraestrutura de trabalho.
A Google está experimentando o uso de seu próprio framework ghOSt, que permite influenciar as decisões do planejador de tarefas através de programas BPF. Atualmente, começou o trabalho de portabilidade do ghOSt para o sched_ext. A Google também está desenvolvendo um port do sched_ext para o ChromeOS com a intenção de utilizá-lo para empregar o planejador híbrido scx_layered a fim de reduzir a latência sem usar extensões para operação em tempo real. A Oculus está desenvolvendo um port do sched_ext para Android.
Fonte: opennet.ru
