Capa Prioridade multimídia Conheça as ferramentas do Linux para aumentar a prioridade de aplicativos multimídia, obtendo o desempenho que esses programas precisam. por Oliver Frommel Aumente a prioridade de programas exigentes Tempo real M esmo com os múltiplos GigaHertz e GigaBytes de velocidade e memória dos novos computadores, tarefas que envolvem multimídia pesada, como ver e gravar programas de TV, podem não rodar de maneira satisfatória. Em alguns casos, o desempenho insatisfatório pode ser conseqüência da prioridade insuficiente desse programa. Uma das grandes vantagens do Linux como sistema operacional acaba causando esse tipo de problema. Como o Linux foi projetado como um sistema multiusuário e multitarefa, a ênfase é manter muitos programas rodando ao mesmo tempo. Assim, por padrão, não há como um programa ganhar todo o poder do sistema. No entanto, como muitos dos computadores Linux atuais pertencem e são usados por um único usuário, essa pessoa pode se beneficiar da técnica de aumentar a prioridade de aplicações multimídia que necessitam de mais recursos de processamento. Variações modernas do kernel Linux permitem que usuários definam prioridades mais altas para aplicativos individuais, dando a eles tratamento preferencial no que se refere a ciclos de processamento. Há muitas soluções diferentes para alterar essas prioridades de aplicações. Quem usa a última versão de sua distribuição preferida, pode perceber que muitas dessas técnicas estão ativadas no kernel padrão. Uma delas é o recurso Rlimits (abordado mais adiante neste artigo), ativado a partir da versão 2.6.14 do kernel. Durante as experiências para redefinir os níveis de prioridade do sistema, provavelmente você vai querer habilitar o modo preemptivo do kernel ao compilá-lo. Para saber se sua distribuição adiciona esse recurso por padrão, confira o arquivo de configuração do kernel, tipicaFigura 1: Se você está procurando por um sistema de resposta rápida, mente no diretório vai querer habilitar a opção CONFIG_PREEMPT ao compilar o kernel. /boot/grub. 36 maio 2006 edição 19 www.linuxmagazine.com.br No Ubuntu, por exemplo, esse arquivo se chama config-2.6.12-9-k7. Use o grep para buscar por PREEMPT. Se você descobrir que a opção CONFIG_PREEMPT não está ativa ou que existe a opção PREEMPT_NONE, é possível recompilar o kernel com configurações modificadas (figura 1). Contudo, o parâmetro CONFIG_PREEMPT_VOLUNTARY=y já seria aceitável. Mas PREEMPT seria melhor ainda. Se você realmente quer aumentar a prioridade de um programa multimídia, a prioridade de tempo real (realtime priority) é o grande objetivo. Ela dá à aplicação acesso quase completo aos recursos do sistema. Como efeito colateral, outros programas podem se tornar bem lentos. Se seu kernel é compatível com prioridade em tempo real, ainda será preciso descobrir como ativar esse recurso. Normalmente, apenas o usuário root pode rodar um programa com prioridade de tempo real, já que deixar qualquer usuário sugar todos os recursos do sistema para rodar seu aplicativo particular não é uma boa idéia. Contudo, iniciar aplicativos multimídia como root é outra má idéia. Para um usuário único (e responsável), a melhor solução é configurar o Linux para que a prioridade em tempo Prioridade multimídia Capa real possa funcionar sem a necessidade Por exemplo, any=1 espede privilégios de root. O objetivo deste cifica que qualquer prograartigo é analisar algumas técnicas para ma que solicitar prioridade rodar seus aplicativos com prioridade de de tempo real possa tê-la. tempo real, sem acesso root. Para mais controle, o parâUsuários avançados de programas de metro gid permite que você áudio desenvolveram há tempos uma especifique o ID de grupo técnica para satisfazer os requerimentos de programas autorizados. de tempo real do servidor de som Jack Por exemplo, se seus pro[2]: o módulo do kernel realtime-lsm [3]. gramas de áudio pertenDesenvolvedores não adicionaram esse cem ao grupo audio, com módulo ao kernel padrão devido a diver- um GID de 33, é possível sos mal entendidos, mas ele já provou carregar o módulo assim: seu valor em aplicações práticas. modprobe realtime-lsm O objetivo desse módulo é dar priori- gid=33. Isso permite rodar dade de tempo real para programas que o jackd em modo realtime não estejam rodando como root. Isso é com a opção -R, sem priviimportante para o Jack, já que ele precisa légios de root. Figura 2: O recurso Capabilities precisa estar na forma de rodar sob o mesmo ID de usuário dos módulo para se usar o realtime-lsm. programas que o acessarem (não é uma boa idéia rodar todo programa que use No lugar das técnicas que Cada entrada começa com o grupo, o Jack como root). descrevemos acima, a maioria dos No Ubuntu, por exemplo, o módulo re- desenvolvedores do kernel preferem seguido pelo recurso e, então, o valor. altime-lsm está nos repositórios oficiais. usar o mecanismo Rlimits para asso- A segunda coluna tipicamente especifiUsuários de outras distribuições podem ciar prioridades de tempo real para ca se o usuário pode modificar o valor baixar o código fonte. Para usar o realti- programas específicos. Por isso, ele se presente (“soft” se sim, “hard” se não). me-lsm, é necessário ter o recurso Capa- tornou parte do kernel padrão, na ver- Recursos incluem a prioridade realtime bilities do kernel funcionando como um são 2.6.14. Mas o “R” de “Rlimits” não (“rt_priority”), o nível nice (“nice”) e módulo, e não embutido no kernel. Esse significa “realtime” (tempo real), e sim a quantidade de memória para trancar é o caso com o Suse 9.3, mas não com o “resource” (recurso). Ele permite que se (“memlock”). Por exemplo: Fedora Core 4, em que seus usuários pre- especifique o uso de vários recursos do audio hard rt_priority 80 cisam recompilar o kernel e configurar sistema, como memória e, o que mais audio hard nice -10 o Capabilities como um módulo (figura nos interessa aqui: prioridades. 2). Usuários de outras distribuições vão O modo de usar o controle Rlimits, precisar do código fonte do kernel, ou que a maioria dos desenvolvedores pelo menos os cabeçalhos (headers), de- prefere, envolve o subsistema PAM Se preferir não atualizar todo o subsispendendo de sua distribuição. (Pluggable Authentication Module), tema PAM de sua distribuição, é possíApós satisfazer todos os requerimen- que gerencia senhas em muitas dis- vel usar uma ferramenta especial que tos, compile e instale o realtime-lsm tribuições (como Fedora, Suse...). In- gerencia apenas a prioridade realtime: com o comando make e, em seguida, felizmente, apenas as últimas versões o set_rtlimits [4]. Para evitar a situação make install. Se você adicionalmen- (0.79 ou mais novas) do PAM são com- em que qualquer usuário pode definir te rodar depmod -a, é possível, depois, patíveis com o Rlimits. Se, por acaso, prioridades à vontade, o administrador digitar modprobe realtime-lsm para você tem uma nova versão do PAM, pode usar o arquivo de configuração carregar o módulo. O realtime-lsm en- é possível especificar os usuários ou /etc/set_rtlimits.conf para espetende alguns poucos parâmetros que grupos que podem ganhar prioridade cificar quais usuários e grupos podem você pode configurar para influenciar de tempo real no arquivo /etc/secu- fazer isso. Adicionalmente, o arquivo lista os programas com permissão para o comportamento do módulo. rity/limits.conf. Rlimits set_rtlimits maio 2006 www.linuxmagazine.com.br edição 19 37 Capa assumir prioridade realtime. A seguinte linha permite que um usuário chamado “joao” dê ao comando /usr/sbin/jackd prioridade realtime: joao /usr/bin/jackd -1 80 O primeiro número dessa linha determina o valor máximo do nice (consulte o manual do nice com man nice). O segundo valor define a prioridade máxima realtime. Um número negativo significa que não é permitido o usuário mudar o valor determinado. O programa detecta grupos de usuários autorizados baseados em um caractere “@” antes do nome do grupo. Por exemplo, “@audio”. Você pode então rodar o programa requerido passando seu caminho completo: set_rlimits -r=80 /usr/bin/mythfrontend Como o Rlimits é agora parte do kernel padrão, as próximas versões da maior parte das distribuições vão ser compatíveis com esse recurso. Vamos esperar que isso leve a ferramentas menos complexas para que usuários gerenciem as prioridades dos programas de maneira mais simples. Patches de Con Kolivas maio 2006 Entre outras coisas, o patch inclui vá- do sistema. Mas, como as mudanças rias novas classes para tempo real. Por ainda não são parte do kernel padrão, exemplo, SCHED_ISO e SCHED_BATCH. A usuários ainda precisam compilar o prioridade de batch é útil para processos kernel otimizado. Há pacotes binários que tomam um longo tempo para serem para usuários do Fedora [7], mas eles completados em servidores. Essa classe não são muito atuais. permite que programas de servidores rodem um pouco mais, antes do agendador interrompê-los. Isso significa menos Claro que há limites para as técnicas tempo perdido em alternância de tarefas descritas neste artigo, e os resultados (task switching). Por outro lado, o servi- desse tipo de “tuning” vão variar condor não vai responder tão rapidamente à forme a sobrecarga no sistema. A prioentrada do usuário – algo aceitável em ridade de tempo real é na verdade o um servidor. “melhor esforço” dentro dessa área, mas ela não vai eliminar todos os problemas. Mesmo assim, em circunstâncias A classe de prioridade SCHED_ISO é como normais, as técnicas descritas trazem uma versão leve da prioridade realtime. resultados bem tangíveis na forma de Ela não requer privilégios de root, mas mais velocidade e estabilidade para também não define a mais alta priorida- muitos programas multimídia. ■ de. Se um usuário sem privilégios de root Informações tentar definir a prioridade de tempo real para um aplicativo, o agendador Kolivas [1] Patches de Con Kolivas: members.optusnet.com.au/ automaticamente coloca o programa em ckolivas/kernel/ uma classe SCHED_ISO. [2] Servidor de audio Jack: Em nossos testes, o comando schedtojackit.sourceforge.nets ol se mostrou útil para a configuração de [3] Realtime-LSM: prioridades. Para usá-lo, apenas execute o sourceforge.net/projects/realtime-lsm programa com a requerida prioridade: [4] set_rtlimits: www.physics.adelaide.edu.au/ schedtool -R -p 50 -e mplayer teste.avi ~jwoithe Conclusão Realtime leve [5] schedtool: freequaos.host.sk/schedtool A opção -R define a prioridade de tempo real, -p 50 é o valor. Se o -e estiver faltando, o Schedtool espera o ID do processo ativo. O pacote schedutils de Robert Love [6] realiza uma tarefa similar ao Schedtool, mas ele não é compatível com todo o conjunto das prioridades do agendador. Em nossos testes, o conjunto de patches de Con Kolivas provou ser a técnica mais efetiva. Com ele, o programa MythTV tocou e decodificou uma transmissão de TV digital sem defeitos de vídeo ou som em uma máquina sobrecarregada com processos edição 19 www.linuxmagazine.com.br [6] schedutils: rlove.org/schedutilss [7] Kernel desktop para Fedora: apt.bea.ki.se/kernel-desktop Sobre o autor Não muito tempo atrás, um médico chamado Con Kolivas agitou bastante a lista de emails do kernel. Ele aprendeu programação C rapidamente e passou a “hackear” o kernel. Finalmente, otimizou o agendador (scheduler) do kernel. Esse é o componente que associa tempo de CPU aos programas ativos. Quanto menos o agendador precisar fazer isso, mais rápido o programa roda, chegando perto do tempo real. O agendador de Con Kolivas é agora parte do kernel padrão. Mas há alguns outros patches voltados para desempenho em sua página na internet [1]. 38 Prioridade multimídia Oliver Frommel foi programador e administrador de sistemas da Ars Electronica Center, em Linz (Áustria), por muitos anos. Após concluir seus estudos de Filosofia, Linguística e Ciência da Computação, se tornou editor da Bavarian Broadcasting Corporation. Hoje é editor do Centro de Competência de Software da Linux New Media AG.