LibPreemptible: Uma Nova Abordagem para Agendamento em Nuvem
LibPreemptible melhora o agendamento em aplicações na nuvem, reduzindo atrasos e aumentando o desempenho.
― 7 min ler
Índice
Aplicativos modernos em nuvem costumam enfrentar atrasos ao processar pedidos. Esses atrasos podem atrapalhar a experiência do usuário, especialmente porque os pedidos podem ter tempos de espera bem diferentes. Pra resolver isso, pesquisadores tentaram várias maneiras de melhorar como os sistemas agendam tarefas. Mas muitos desses métodos trazem seus próprios problemas, como precisar de grandes mudanças no sistema operacional ou não aproveitar o hardware ao máximo.
Apresentando o LibPreemptible
Uma nova solução chamada LibPreemptible é uma biblioteca de threads de nível de usuário. Ela tem como objetivo ser leve, flexível e capaz de escalar de forma eficiente com Aplicativos na Nuvem. O LibPreemptible usa três métodos principais:
- Um método rápido e eficiente para enviar interrupções temporizadas com ajuda de hardware.
- Uma interface de agendamento que funciona no nível do usuário.
- Uma API que permite aos usuários definir regras de agendamento com base nas necessidades específicas de suas aplicações.
O LibPreemptible foi projetado pra funcionar melhor que os antigos sistemas de agendamento sem precisar de mudanças no sistema operacional. Ele mostra quão adaptável pode ser em diferentes regras de agendamento, mesmo quando as aplicações enfrentam cargas e padrões de pedidos em mudança.
Aplicativos em Nuvem e Seus Desafios
A maior parte da computação hoje acontece em ambientes de nuvem, sejam públicos ou privados. Essa mudança alterou como as aplicações são construídas-passando de serviços grandes e singular para serviços menores e interconectados, conhecidos como microserviços. Esses aplicativos modernos precisam lidar com muitas tarefas ao mesmo tempo, tendo muitas vezes milhares de pedidos rodando simultaneamente. No entanto, essa complexidade traz desvantagens, principalmente o desafio de atender padrões de desempenho específicos conhecidos como Objetivos de Nível de Serviço (SLOs), que geralmente se concentram em reduzir atrasos no processamento de pedidos.
Os data centers em nuvem também enfrentam um problema com muitos threads tentando acessar recursos compartilhados. Por exemplo, dados recentes do Google mostraram que algumas aplicações agendavam regularmente mais de 50 threads por núcleo, com alguns chegando a 500 threads. Pra acompanhar as demandas por computação rápida e baixos atrasos, os sistemas precisam usar Agendamentos inteligentes que sejam eficientes e flexíveis.
A Necessidade de Agendamento Preemptivo
O agendamento preemptivo é um método que permite que tarefas mais curtas tenham preferência sobre tarefas mais longas, evitando atrasos causados pelas tarefas longas bloqueando as curtas. Sem o agendamento preemptivo, tarefas curtas podem ficar presas esperando as longas terminarem, aumentando o atraso geral. Isso resulta em altas latências de cauda, onde um pequeno número de pedidos leva muito mais tempo pra ser concluído.
Tentativas passadas de melhorar o agendamento preemptivo para ambientes de nuvem muitas vezes foram ineficazes quando se trata de cargas de trabalho em escala de microssegundos. Abordagens tradicionais, como o uso de interrupções normais de nível de usuário, causam sobrecargas durante o processo de troca de contexto entre os níveis de usuário e kernel. Outros métodos podem diminuir o tempo de troca mas introduzem problemas de segurança ao rodar em ambientes de nuvem compartilhados.
A Solução Assistida por Hardware
O LibPreemptible aproveita um novo recurso de hardware chamado interrupções de usuário (UINTR) encontrado nos Processadores Xeon Scalable da Intel. Esse recurso permite que aplicações de nível de usuário enviem interrupções diretamente umas às outras, eliminando o kernel e reduzindo atrasos. No entanto, as configurações iniciais do UINTR não são adequadas para cargas de trabalho dinâmicas que não têm tempos de serviço conhecidos.
O LibPreemptible usa o UINTR pra criar uma biblioteca de threads que permite um agendamento preciso e configurável, definindo os fatias de tempo necessárias para a execução de tarefas. Ele também inclui timers de usuário que ajudam as aplicações a construir regras de agendamento específicas.
Testes de Desempenho do LibPreemptible
Pra mostrar como o LibPreemptible funciona bem, ele foi testado usando uma mistura de cargas de trabalho sintéticas e aplicações reais comumente usadas em ambientes de nuvem. Os resultados mostraram melhorias significativas tanto em desempenho quanto em flexibilidade em comparação com sistemas de agendamento anteriores.
Em média, a latência de cauda experimentada por aplicações usando o LibPreemptible foi dez vezes melhor do que aquelas usando sistemas mais antigos. Ele não apenas melhorou o desempenho, mas também lidou com várias cargas de trabalho de forma mais eficaz.
Políticas de Agendamento e Sua Importância
Aplicativos em nuvem costumam processar pedidos de comprimentos variados, o que pode complicar o agendamento. Ter políticas que se adaptem a essas diferenças é essencial pra manter a baixa latência. Quando enfrentam cargas pesadas, a política de agendamento precisa mudar pra acomodar o máximo possível de pedidos, enquanto ainda prioriza tarefas mais curtas.
Diferentes técnicas de agendamento foram testadas, como Primeiro a Chegar, Primeiro a Ser Servido (FCFS), que é adequada para distribuições de carga de trabalho mais leves, e estratégias mais complexas que se adaptam com base em dados históricos das tarefas sendo processadas. Os resultados mostraram que métodos de agendamento dinâmico que se ajustavam com base em métricas em tempo real melhoraram o desempenho sob condições de carga mais alta.
APIs de Agendamento em Nível de Usuário
O LibPreemptible oferece uma interface de programação de aplicativos (API) projetada pra flexibilidade. Desenvolvedores podem criar e executar funções preemptivas, mantendo o controle sobre a execução de tarefas e como os pedidos são tratados quando ultrapassam seus limites de tempo.
Funções dentro dessa API permitem iniciar e retomar tarefas facilmente, checar seus status e controlar sua execução com base em prazos que se adaptam às necessidades da aplicação.
Entrega de Timer Escalável
Uma das características únicas do LibPreemptible é seu método eficiente de entrega de timers, que supera os métodos tradicionais baseados em kernel. Timers de kernel tendem a ter sobrecargas significativas quando estão em uso, especialmente à medida que o número de threads aumenta. O LibPreemptible contorna esses problemas usando seu próprio timer de nível de usuário, que evita contenção pesada no kernel e permite entregar interrupções mais rapidamente.
Ao gerenciar os timers de forma eficaz, o LibPreemptible pode lidar com muitos threads enquanto mantém a sobrecarga baixa, permitindo que as aplicações mantenham seu desempenho mesmo sob cargas pesadas.
Cenários de Carga de Trabalho Co-localizada
Em muitos ambientes de nuvem, diferentes tipos de aplicações rodam lado a lado, geralmente compartilhando os mesmos recursos. Pra garantir que aplicações críticas mantenham baixa latência, elas comumente precisam de agendamento preemptivo pra recuperar recursos de tarefas menos importantes.
Usando o LibPreemptible, as aplicações podem ajustar dinamicamente seus intervalos preemptivos com base nas cargas de trabalho. Por exemplo, testes envolviam uma aplicação de armazenamento chave-valor rodando ao lado de uma aplicação de compressão de dados. Os resultados indicaram que o agendador preemptivo podia manter a latência de cauda do armazenamento chave-valor baixa enquanto conseguia mitigar aumentos no impacto no desempenho da aplicação de compressão.
Conclusão
O LibPreemptible representa um avanço significativo no agendamento em nível de usuário para aplicativos em nuvem. Ele aproveita novas capacidades de hardware pra melhorar a eficiência e a capacidade de resposta do processamento de pedidos. Essa nova biblioteca oferece uma solução mais adaptável e escalável que pode ser prontamente implementada em sistemas existentes sem precisar de mudanças extensas.
Ao integrar técnicas assistidas por hardware com políticas de agendamento flexíveis, o LibPreemptible melhora o desempenho enquanto gerencia as complexas demandas dos modernos aplicativos em nuvem. É uma ferramenta poderosa para desenvolvedores que buscam melhorar os tempos de resposta e atender aos objetivos de nível de serviço em ambientes dinâmicos.
Título: Towards Fast, Adaptive, and Hardware-Assisted User-Space Scheduling
Resumo: Modern datacenter applications are prone to high tail latencies since their requests typically follow highly-dispersive distributions. Delivering fast interrupts is essential to reducing tail latency. Prior work has proposed both OS- and system-level solutions to reduce tail latencies for microsecond-scale workloads through better scheduling. Unfortunately, existing approaches like customized dataplane OSes, require significant OS changes, experience scalability limitations, or do not reach the full performance capabilities hardware offers. The emergence of new hardware features like UINTR exposed new opportunities to rethink the design paradigms and abstractions of traditional scheduling systems. We propose LibPreemptible, a preemptive user-level threading library that is flexible, lightweight, and adaptive. LibPreemptible was built with a set of optimizations like LibUtimer for scalability, and deadline-oriented API for flexible policies, time-quantum controller for adaptiveness. Compared to the prior state-of-the-art scheduling system Shinjuku, our system achieves significant tail latency and throughput improvements for various workloads without modifying the kernel. We also demonstrate the flexibility of LibPreemptible across scheduling policies for real applications experiencing varying load levels and characteristics.
Autores: Lisa, Li, Nikita Lazarev, David Koufaty, Yijun Yin, Andy Anderson, Zhiru Zhang, Edward Suh, Kostis Kaffes, Christina Delimitrou
Última atualização: 2023-11-11 00:00:00
Idioma: English
Fonte URL: https://arxiv.org/abs/2308.02896
Fonte PDF: https://arxiv.org/pdf/2308.02896
Licença: https://creativecommons.org/licenses/by/4.0/
Alterações: Este resumo foi elaborado com a assistência da AI e pode conter imprecisões. Para obter informações exactas, consulte os documentos originais ligados aqui.
Obrigado ao arxiv pela utilização da sua interoperabilidade de acesso aberto.