{"id":77693,"date":"2020-04-13T01:42:39","date_gmt":"2020-04-12T23:42:39","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/cpu-limity-i-agressivnyj-trottling-v-kubernetes"},"modified":"2020-04-13T01:42:39","modified_gmt":"2020-04-12T23:42:39","slug":"cpu-limity-i-agressivnyj-trottling-v-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/cpu-limity-i-agressivnyj-trottling-v-kubernetes","title":{"rendered":"Limites de CPU e throttling agressivo no Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Nota do tradutor.<\/b>: esta hist\u00f3ria instrutiva da Omio \u2014 um agregador de viagens europeu \u2014 conduz os leitores da teoria b\u00e1sica \u00e0s fascinantes sutilezas pr\u00e1ticas na configura\u00e7\u00e3o do Kubernetes. Conhecer esses casos ajuda n\u00e3o apenas a expandir o conhecimento, mas tamb\u00e9m a evitar problemas n\u00e3o triviais.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Limites de CPU e throttling agressivo no Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/1175c9df746e43b5a7d81476164929db.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVoc\u00ea j\u00e1 se deparou com uma situa\u00e7\u00e3o em que um aplicativo \"travava\", parava de responder \u00e0s verifica\u00e7\u00f5es de estado e voc\u00ea n\u00e3o conseguia entender a raz\u00e3o desse comportamento? Uma das poss\u00edveis explica\u00e7\u00f5es est\u00e1 relacionada ao limite de cotas de recursos de CPU. \u00c9 sobre isso que vamos discutir neste artigo.<\/p>\n<p><b>TL;DR:<br \/>\nRecomendamos enfaticamente a desist\u00eancia dos limites de CPU no Kubernetes (ou desativar as cotas CFS no Kubelet), se uma vers\u00e3o do kernel Linux com erro nas cotas CFS estiver em uso. No kernel <noindex><a rel=\"nofollow\" href=\"https:\/\/bugzilla.kernel.org\/show_bug.cgi?id=198197\">possui<\/a><\/noindex> \u00e9 um bug s\u00e9rio e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/kubernetes\/issues\/67577\">bem conhecido<\/a><\/noindex> que causa throttling excessivo e lat\u00eancias<\/b>.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Na Omio <b>toda a infraestrutura \u00e9 gerida pelo Kubernetes<\/b>. Todas as nossas cargas stateful e stateless operam exclusivamente no Kubernetes (utilizamos o Google Kubernetes Engine). Nos \u00faltimos seis meses, come\u00e7amos a notar lentid\u00f5es aleat\u00f3rias. Aplicativos ficam travados ou param de responder \u00e0s verifica\u00e7\u00f5es de estado, perdem a conex\u00e3o com a rede, etc. Comportamentos como esse nos deixaram perplexos por um bom tempo, e finalmente decidimos nos debru\u00e7ar sobre o problema.<\/p>\n<p>Resumo do artigo:<\/p>\n<ul>\n<li> Algumas palavras sobre cont\u00eaineres e Kubernetes;<\/li>\n<li> Como s\u00e3o implementados os requests e limits de CPU;<\/li>\n<li> Como o limite de CPU funciona em ambientes com m\u00faltiplos n\u00facleos;<\/li>\n<li> Como monitorar o throttling de CPU;<\/li>\n<li> Solu\u00e7\u00e3o do problema e nuances.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Algumas palavras sobre cont\u00eaineres e Kubernetes<\/h2>\n<p>\nKubernetes, em ess\u00eancia, \u00e9 o padr\u00e3o moderno no mundo da infraestrutura. Sua principal tarefa \u00e9 a orquestra\u00e7\u00e3o de cont\u00eaineres.<\/p>\n<h3>Cont\u00eaineres<\/h3>\n<p>\nNo passado, \u00e9ramos obrigados a criar artefatos como JARs\/WARs de Java, pacotes Egg de Python ou execut\u00e1veis para serem posteriormente executados nos servidores. No entanto, para fazer com que funcionassem, era necess\u00e1rio realizar um trabalho adicional: instalar o ambiente de execu\u00e7\u00e3o (Java\/Python), colocar os arquivos necess\u00e1rios nos lugares certos, garantir compatibilidade com vers\u00f5es espec\u00edficas do sistema operacional, etc. Em outras palavras, era preciso prestar muita aten\u00e7\u00e3o \u00e0 gest\u00e3o de configura\u00e7\u00f5es (o que muitas vezes causava desaven\u00e7as entre desenvolvedores e administradores de sistema).<\/p>\n<p><b>Os cont\u00eaineres mudaram tudo.<\/b> Agora o artefato \u00e9 a imagem do container. Ele pode ser visto como uma vers\u00e3o ampliada de um arquivo execut\u00e1vel, contendo n\u00e3o apenas o programa, mas tamb\u00e9m um ambiente de execu\u00e7\u00e3o completo (Java\/Python\/\u2026), al\u00e9m dos arquivos\/pacotes necess\u00e1rios, pr\u00e9-instalados e prontos para execu\u00e7\u00e3o. Os containers podem ser implantados e executados em diversos servidores sem qualquer a\u00e7\u00e3o adicional.<\/p>\n<p>Al\u00e9m disso, os containers operam em seu pr\u00f3prio ambiente isolado. Eles possuem seu pr\u00f3prio adaptador de rede virtual, seu sistema de arquivos com acesso restrito, sua hierarquia de processos, suas restri\u00e7\u00f5es de CPU e mem\u00f3ria, etc. Tudo isso \u00e9 implementado atrav\u00e9s de uma subsistema especial do n\u00facleo Linux \u2014 namespaces.<\/p>\n<h3>Kubernetes<\/h3>\n<p>\nComo mencionado anteriormente, o Kubernetes \u00e9 um orquestrador de containers. Ele funciona assim: voc\u00ea fornece a ele um pool de m\u00e1quinas e, em seguida, diz: \"Ei, Kubernetes, inicie dez inst\u00e2ncias do meu container com 2 processadores e 3 GB de mem\u00f3ria cada, e mantenha-as operacionais!\" O Kubernetes se encarregar\u00e1 do resto. Ele encontrar\u00e1 recursos dispon\u00edveis, iniciar\u00e1 os containers e os reiniciar\u00e1 conforme necess\u00e1rio, aplicar\u00e1 atualiza\u00e7\u00f5es ao mudar de vers\u00f5es, etc. Essencialmente, o Kubernetes permite abstrair a parte de hardware e torna toda a variedade de sistemas adequada para implanta\u00e7\u00e3o e opera\u00e7\u00e3o de aplica\u00e7\u00f5es.<\/p>\n<p><img decoding=\"async\" alt=\"Limites de CPU e throttling agressivo no Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/6509bb1b66a4a0f5e9a479d0bd6ececb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Kubernetes sob a perspectiva de uma pessoa comum<\/i><\/p>\n<h2>O que s\u00e3o requests e limits no Kubernetes<\/h2>\n<p>\nOk, entendemos os containers e Kubernetes. Tamb\u00e9m sabemos que v\u00e1rios containers podem estar em uma \u00fanica m\u00e1quina.<\/p>\n<p>Podemos fazer uma analogia com um apartamento compartilhado. \u00c9 um espa\u00e7o amplo (m\u00e1quinas\/n\u00f3s) alugado para v\u00e1rios inquilinos (containers). O Kubernetes atua como o corretor de im\u00f3veis. Surge a pergunta: como evitar conflitos entre os inquilinos? E se um deles, digamos, decidir ocupar o banheiro por meio dia?<\/p>\n<p>\u00c9 aqui que entram os requests e limits. CPU <b>Request<\/b> \u00e9 necess\u00e1rio apenas para planejamento. \u00c9 algo como uma \"lista de desejos\" do container, e \u00e9 usado para encontrar o n\u00f3 mais adequado. Ao mesmo tempo, a CPU <b>Limite<\/b> pode ser comparada a um contrato de aluguel \u2014 assim que encontrarmos um n\u00f3 para o container, ele <b>n\u00e3o poder\u00e1<\/b> ultrapassar os limites estabelecidos. E aqui surge o problema\u2026<\/p>\n<h3>Como s\u00e3o implementados os requests e limits no Kubernetes<\/h3>\n<p>\nO Kubernetes utiliza um mecanismo de throttling (limita\u00e7\u00e3o de clock) embutido no kernel para implementar os limites de CPU. Se um aplicativo exceder o limite, a limita\u00e7\u00e3o \u00e9 ativada (ou seja, ele recebe menos ciclos de CPU). Requests e limits para mem\u00f3ria s\u00e3o organizados de maneira diferente, o que os torna mais f\u00e1ceis de detectar. Basta verificar o \u00faltimo status de rein\u00edcio do pod: se n\u00e3o est\u00e1 marcado como \"OOMKilled\". Com o throttling de CPU, as coisas n\u00e3o s\u00e3o t\u00e3o simples, pois o K8s disponibiliza apenas m\u00e9tricas de uso, e n\u00e3o de cgroups.<\/p>\n<h4>Requisi\u00e7\u00e3o de CPU<\/h4>\n<p>\n<img decoding=\"async\" alt=\"Limites de CPU e throttling agressivo no Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/fbc8bf3f775ffd9513374ce94b20535d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Como \u00e9 implementada a requisi\u00e7\u00e3o de CPU<\/i><\/p>\n<p>Para simplificar, vamos considerar o processo usando uma m\u00e1quina com CPU de 4 n\u00facleos.<\/p>\n<p>K8s utiliza o mecanismo de grupos de controle (cgroups) para gerenciar a aloca\u00e7\u00e3o de recursos (mem\u00f3ria e CPU). Est\u00e1 dispon\u00edvel um modelo hier\u00e1rquico: o filho herda os limites do grupo pai. Os detalhes da aloca\u00e7\u00e3o s\u00e3o armazenados no sistema de arquivos virtual (<code>\/sys\/fs\/cgroup<\/code>). No caso do processador, isso \u00e9 <code>\/sys\/fs\/cgroup\/cpu,cpuacct\/*<\/code>.<\/p>\n<p>O K8s utiliza o arquivo <code>cpu.share<\/code> para alocar os recursos do processador. No nosso caso, o grupo de controle raiz recebe 4096 partes de recursos de CPU \u2014 100% da capacidade dispon\u00edvel do processador (1 n\u00facleo = 1024; este \u00e9 um valor fixo). O grupo raiz aloca os recursos proporcionalmente com base nas partes dos filhos, especificadas em <code>cpu.share<\/code>, e estes, por sua vez, fazem o mesmo com seus filhos, e assim por diante. Em um n\u00f3 t\u00edpico do Kubernetes, o grupo de controle raiz tem tr\u00eas filhos: <code>system.slice<\/code>, <code>user.slice<\/code> e <code>kubepods<\/code>. Os dois primeiros subgrupos s\u00e3o utilizados para alocar recursos entre cargas de trabalho de sistema cr\u00edticas e programas de usu\u00e1rios fora do K8s. O \u00faltimo \u2014 <code>kubepods<\/code> \u2014 criado pelo Kubernetes para alocar recursos entre pods.<\/p>\n<p>No diagrama acima, pode-se ver que os dois primeiros subgrupos receberam <b>1024<\/b> partes, enquanto o subgrupo kubepod recebeu <b>4096<\/b> partes. Como isso \u00e9 poss\u00edvel: afinal, o grupo raiz tem acesso a apenas <b>4096<\/b> partes, e a soma das partes de seus filhos excede significativamente esse n\u00famero (<b>6144<\/b>)? O fato \u00e9 que o valor tem um significado l\u00f3gico, portanto, o planejador do Linux (CFS) o utiliza para alocar proporcionalmente os recursos de CPU. No nosso caso, os primeiros dois grupos recebem cada um <b>680<\/b> partes reais (16,6% de 4096), enquanto o kubepod recebe as restantes <b>2736<\/b> partes. Em caso de inatividade, os dois primeiros grupos n\u00e3o utilizar\u00e3o os recursos alocados.<\/p>\n<p>Felizmente, o planejador possui um mecanismo que evita a perda de recursos CPU n\u00e3o utilizados. Ele redistribui as capacidades \"ociosas\" para um pool global, do qual elas s\u00e3o alocadas para grupos que precisam de capacidade adicional de processamento (a transfer\u00eancia ocorre em lotes para evitar perdas por arredondamento). Um m\u00e9todo similar \u00e9 aplicado a todos os descendentes.<\/p>\n<p>Esse mecanismo garante uma distribui\u00e7\u00e3o justa das capacidades do processador e evita que qualquer processo \"roube\" recursos de outros.<\/p>\n<h4>Limite de CPU<\/h4>\n<p>\nApesar de as configura\u00e7\u00f5es de limites e solicita\u00e7\u00f5es no K8s parecerem semelhantes, sua implementa\u00e7\u00e3o difere drasticamente: isso \u00e9 <b>a parte mais confusa<\/b> e menos documentada.<\/p>\n<p>O K8s utiliza <noindex><a rel=\"nofollow\" href=\"https:\/\/www.kernel.org\/doc\/Documentation\/scheduler\/sched-design-CFS.txt\">o mecanismo de quotas CFS<\/a><\/noindex> para implementar os limites. Suas configura\u00e7\u00f5es s\u00e3o definidas nos arquivos <code>cfs_period_us<\/code> e <code>cfs_quota_us<\/code> no diret\u00f3rio cgroup (onde tamb\u00e9m est\u00e1 localizado o arquivo <code>cpu.share<\/code>).<\/p>\n<p>Diferentemente de <code>cpu.share<\/code>, a quota \u00e9 baseada no <b>per\u00edodo de tempo<\/b>, n\u00e3o na capacidade dispon\u00edvel do processador. <code>cfs_period_us<\/code> define a dura\u00e7\u00e3o do per\u00edodo (\u00e9poca) \u2014 que \u00e9 sempre 100000 microssegundos (100 ms). O K8s permite alterar esse valor, mas isso est\u00e1 dispon\u00edvel apenas na vers\u00e3o alfa. O planejador utiliza a \u00e9poca para reiniciar as quotas utilizadas. O segundo arquivo, <code>cfs_quota_us<\/code>, define o tempo dispon\u00edvel (quota) em cada \u00e9poca. Note que ela tamb\u00e9m \u00e9 especificada em microssegundos. A quota pode exceder a dura\u00e7\u00e3o da \u00e9poca; em outras palavras, pode ser maior que 100 ms.<\/p>\n<p>Vamos considerar dois cen\u00e1rios em m\u00e1quinas de 16 n\u00facleos (o tipo de computador mais comum que temos na Omio):<\/p>\n<p><img decoding=\"async\" alt=\"Limites de CPU e throttling agressivo no Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/61c6105320af3a92a91cec1007da0d45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Cen\u00e1rio 1: 2 fluxos e limite de 200 ms. Sem throttling.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Limites de CPU e throttling agressivo no Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/c33993341d5395bb73dda1f4c8482a11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Cen\u00e1rio 2: 10 fluxos e limite de 200 ms. O throttling come\u00e7a ap\u00f3s 20 ms, e o acesso aos recursos do processador \u00e9 retomado mais 80 ms depois.<\/i><\/p>\n<p>Vamos supor que voc\u00ea definiu o limite de CPU em <b>2<\/b> n\u00facleos; o Kubernetes converter\u00e1 esse valor para 200 ms. Isso significa que o cont\u00eainer pode usar no m\u00e1ximo 200 ms de tempo de CPU sem throttling.<\/p>\n<p>E \u00e9 aqui que come\u00e7a a parte interessante. Como mencionado anteriormente, a quota dispon\u00edvel \u00e9 de 200 ms. Se voc\u00ea estiver executando simultaneamente <b>dez<\/b> fluxos em uma m\u00e1quina de 12 n\u00facleos (veja a ilustra\u00e7\u00e3o do cen\u00e1rio 2), enquanto todos os outros pods est\u00e3o ociosos, a cota ser\u00e1 esgotada em apenas 20 ms (uma vez que 10 * 20 ms = 200 ms), e todos os fluxos deste pod 'congelar\u00e3o' <i>(throttle)<\/i> nos pr\u00f3ximos 80 ms. Agrava a situa\u00e7\u00e3o j\u00e1 mencionada <noindex><a rel=\"nofollow\" href=\"https:\/\/bugzilla.kernel.org\/show_bug.cgi?id=198197\">bug do planejador<\/a><\/noindex>, que causa throttling excessivo e o cont\u00eainer n\u00e3o consegue utilizar nem mesmo sua cota dispon\u00edvel.<\/p>\n<h2>Como avaliar o throttling em pods?<\/h2>\n<p>\nBasta entrar no pod e executar <code>cat \/sys\/fs\/cgroup\/cpu\/cpu.stat<\/code>.<\/p>\n<ul>\n<li> <code>nr_periods<\/code> \u2014 total de per\u00edodos do planejador;<\/li>\n<li> <code>nr_throttled<\/code> \u2014 n\u00famero de per\u00edodos estrangulados dentro de <code>nr_periods<\/code>;<\/li>\n<li> <code>throttled_time<\/code> \u2014 tempo total estrangulado em nanosegundos.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Limites de CPU e throttling agressivo no Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/a1818614914a8c31f7f7f1331cc02e8b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>O que realmente est\u00e1 acontecendo?<\/h3>\n<p>\nNo final, temos um alto throttling em todos os aplicativos. \u00c0s vezes \u00e9 <b>uma vez e meia<\/b> mais forte que o calculado!<\/p>\n<p>Isso leva a v\u00e1rios erros \u2014 falhas em verifica\u00e7\u00f5es de prontid\u00e3o, conten\u00e7\u00e3o de cont\u00eaineres, quebras de conex\u00f5es de rede, timeouts em chamadas de servi\u00e7o. No final, isso resulta em maior lat\u00eancia e aumento no n\u00famero de erros.<\/p>\n<h2>Solu\u00e7\u00e3o e consequ\u00eancias<\/h2>\n<p>\nAqui \u00e9 simples. Desistimos dos limites de CPU e focamos na atualiza\u00e7\u00e3o do kernel do SO nos clusters para a vers\u00e3o mais recente, na qual o bug foi corrigido. O n\u00famero de erros (HTTP 5xx) em nossos servi\u00e7os imediatamente caiu significativamente:<\/p>\n<h3>Erros HTTP 5xx<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Limites de CPU e throttling agressivo no Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/86ab1694b952b5451a4ae075cbda2788.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Erros HTTP 5xx de um servi\u00e7o cr\u00edtico<\/i><\/p>\n<h3>Tempo de resposta p95<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Limites de CPU e throttling agressivo no Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/63922c8eb468366a7d05154a3adf40e6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Lat\u00eancia das solicita\u00e7\u00f5es de um servi\u00e7o cr\u00edtico, percentil 95<\/i><\/p>\n<h3>Custos operacionais<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Limites de CPU e throttling agressivo no Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/8405c26fcbd82853e296fa7e3bcba131.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>N\u00famero de horas de inst\u00e2ncia consumidas<\/i><\/p>\n<h2>Qual \u00e9 o truque?<\/h2>\n<p>\nComo mencionado no in\u00edcio do artigo:<\/p>\n<blockquote><p>Pode-se fazer uma analogia com um apartamento compartilhado... Kubernetes atua como o corretor de im\u00f3veis. Mas como evitar que os inquilinos entrem em conflito entre si? E se um deles, digamos, decidir ocupar o banheiro por meio dia?<\/p><\/blockquote>\n<p>\nAqui est\u00e1 o truque. Um cont\u00eainer descuidado pode consumir todos os recursos dispon\u00edveis da CPU na m\u00e1quina. Se voc\u00ea tem um bom stack de aplicativos (por exemplo, JVM, Go, Node VM bem configurados), ent\u00e3o n\u00e3o \u00e9 um problema: \u00e9 poss\u00edvel operar nessas condi\u00e7\u00f5es por um longo per\u00edodo. Mas se os aplicativos est\u00e3o mal otimizados ou n\u00e3o otimizados de forma alguma (<code>FROM java:latest<\/code>), a situa\u00e7\u00e3o pode sair do controle. Na Omio, temos Dockerfiles b\u00e1sicos automatizados com configura\u00e7\u00f5es adequadas por padr\u00e3o para stacks das principais linguagens, ent\u00e3o esse tipo de problema n\u00e3o existiu.<\/p>\n<p>Recomendamos monitorar as m\u00e9tricas <noindex><a rel=\"nofollow\" href=\"http:\/\/www.brendangregg.com\/usemethod.html\">USE<\/a><\/noindex> (uso, satura\u00e7\u00e3o e erros), lat\u00eancias da API e frequ\u00eancia de erros. Certifique-se de que os resultados correspondam \u00e0s expectativas.<\/p>\n<h2>Links<\/h2>\n<p>\nEsta \u00e9 a nossa hist\u00f3ria. Os seguintes recursos foram muito \u00fateis para entender o que est\u00e1 acontecendo:<\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/www.kernel.org\/doc\/Documentation\/scheduler\/sched-design-CFS.txt\">kernel.org \u2192 Escalonador CFS<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/www.kernel.org\/doc\/Documentation\/scheduler\/sched-bwc.txt\">kernel.org \u2192 Controle de Largura de Banda CFS<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/engineering.squarespace.com\/blog\/2017\/understanding-linux-container-scheduling\">Compreendendo o Agendamento de Cont\u00eaineres Linux<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/www.linuxjournal.com\/content\/everything-you-need-know-about-linux-containers-part-i-linux-control-groups-and-process\">Tudo que Voc\u00ea Precisa Saber sobre Cont\u00eaineres Linux, Parte I: Grupos de Controle Linux e Isolamento de Processos<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/k8s.af\/\">Hist\u00f3rias de Falhas do Kubernetes<\/a><\/noindex> \u2014 procure por \"throttling de CPU\".<\/li>\n<\/ul>\n<p>\nRelat\u00f3rios de erros do Kubernetes:<\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/kubernetes\/issues\/51135#issuecomment-373454012\">#51135: Avoid setting CPU limits for Guaranteed pods<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/kubernetes\/issues\/67577\">#67577: CFS quotas can lead to unnecessary throttling<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/gist.github.com\/bobrik\/2030ff040fad360327a5fab7a09c4ff1\">CFS excessivamente agressivo<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\nVoc\u00ea j\u00e1 enfrentou problemas semelhantes em sua pr\u00e1tica ou tem experi\u00eancia relacionada ao throttling em ambientes de produ\u00e7\u00e3o containerizados? Compartilhe sua hist\u00f3ria nos coment\u00e1rios!<\/p>\n<h2>P.S. do tradutor<\/h2>\n<p>\nConfira tamb\u00e9m em nosso blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/459326\/\">Autoescalamento e gerenciamento de recursos no Kubernetes (vis\u00e3o geral e v\u00eddeo da apresenta\u00e7\u00e3o)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/418269\/\">Como funciona o Gerenciador de CPU no Kubernetes<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/342822\/\">O que acontece no Kubernetes ao executar kubectl run? Parte 2<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/489668\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u044d\u0442\u0430 \u043f\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f Omio \u2014 \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u043e\u0433\u043e \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0430 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0439 \u2014 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438 \u0434\u043e \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0435\u0439 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Kubernetes. \u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0441\u043b\u0443\u0447\u0430\u044f\u043c\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043a\u0440\u0443\u0433\u043e\u0437\u043e\u0440, \u043d\u043e \u0438 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0414\u043e\u0432\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u0432\u0430\u043c \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab\u0437\u0430\u0441\u0442\u0440\u0435\u0432\u0430\u043b\u043e\u00bb \u043d\u0430 \u043c\u0435\u0441\u0442\u0435, \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0430\u043b\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":77694,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-77693","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u044d\u0442\u0430 \u043f\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f Omio \u2014 \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u043e\u0433\u043e \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0430 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0439 \u2014 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438 \u0434\u043e \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0435\u0439 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Kubernetes.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/cpu-limity-i-agressivnyj-trottling-v-kubernetes\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47CPU-\u043b\u0438\u043c\u0438\u0442\u044b \u0438 \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u0442\u0440\u043e\u0442\u0442\u043b\u0438\u043d\u0433 \u0432 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u044d\u0442\u0430 \u043f\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f Omio \u2014 \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u043e\u0433\u043e \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0430 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0439 \u2014 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438 \u0434\u043e \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0435\u0439 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Kubernetes.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/cpu-limity-i-agressivnyj-trottling-v-kubernetes\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-04-12T23:42:39+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-12T23:42:39+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Limites de CPU e throttling agressivo no Kubernetes | ProHoster","description":"Nota do tradutor: esta hist\u00f3ria instrutiva da Omio \u2014 agregador europeu de viagens \u2014 guia os leitores desde a teoria b\u00e1sica at\u00e9 as nuances pr\u00e1ticas intrigantes na configura\u00e7\u00e3o do Kubernetes.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/cpu-limity-i-agressivnyj-trottling-v-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47CPU-\u043b\u0438\u043c\u0438\u0442\u044b \u0438 \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u0442\u0440\u043e\u0442\u0442\u043b\u0438\u043d\u0433 \u0432 Kubernetes | ProHoster","og:description":"\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u044d\u0442\u0430 \u043f\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f Omio \u2014 \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u043e\u0433\u043e \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0430 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0439 \u2014 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438 \u0434\u043e \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0435\u0439 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Kubernetes.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/cpu-limity-i-agressivnyj-trottling-v-kubernetes","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-04-12T23:42:39+00:00","article:modified_time":"2020-04-12T23:42:39+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"77693","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:13:23","updated":"2022-09-29 12:06:45","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/77693","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=77693"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/77693\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/77694"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=77693"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=77693"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=77693"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}