![3 princípios para construir funções seguras sem servidor](https://optimuscloud.com.br/wp-content/uploads/2024/01/1706234132_3-principios-para-construir-funcoes-seguras-sem-servidor-150x150.jpg)
3 princípios para construir funções seguras sem servidor
25 de janeiro de 2024![Bit.io oferece Postgres sem servidor para facilitar o compartilhamento de dados](https://optimuscloud.com.br/wp-content/uploads/2024/01/1706237980_Bitio-oferece-Postgres-sem-servidor-para-facilitar-o-compartilhamento-de-150x150.jpg)
Bit.io oferece Postgres sem servidor para facilitar o compartilhamento de dados
25 de janeiro de 2024Gráfico “Quanto mais você sabe”: objetos Python não são imutáveis. Na verdade, todos os objetos Python contêm uma pequena quantidade de estado mutável. E isso pode ser uma má notícia para o uso da memória.
Esse problema está no cerne de como o tempo de execução do Python funciona e uma das razões pelas quais o Global Interpreter Lock (GIL) é importante. Esse problema tem um grande impacto negativo no desempenho da CPU e da memória, especialmente para abordagens de escalabilidade do Python, porque afeta o modo como os objetos são dimensionados na memória.
Uma postagem recente no blog escrita por Eddie Elizondo detalha como e por que o conglomerado de redes sociais Meta criou Immortal Objects, PEP-683 para Python.
Os engenheiros da Meta queriam melhorar a memória e a eficiência da CPU para lidar com suas solicitações. O servidor frontend foi Python (Django). Eles alcançaram o paralelismo com uma arquitetura multiprocessos combinada com assíncrono para simultaneidade por processo. Para mitigar ainda mais as ineficiências de memória, os engenheiros da Meta preferem a memória compartilhada à memória privada sempre que possível.
Para priorizar a memória compartilhada, os desenvolvedores contam com uma arquitetura de servidor web pré-fork para armazenar em cache o máximo de objetos possível. Processos separados usam esses caches somente leitura, estruturados por meio de memória compartilhada. As métricas de recursos mostram que esse método foi útil, mas o uso da memória privada ainda cresceu com o tempo, enquanto o uso da memória compartilhada diminuiu.
Uh-oh!
O problema com objetos não tão imutáveis
Python e outras linguagens de programação usam contagem de referências como abordagem de gerenciamento de memória. A contagem de referência é uma parte do estado do objeto que é mutável pelo tempo de execução. A contagem de referências é incrementada sempre que o objeto é referenciado e decrementada quando desreferenciado. Quando a contagem de referência é 0, a memória do objeto é desalocada (coleta de lixo).
Os engenheiros da Meta analisaram o heap Python e descobriram que a maioria de seus objetos Python permaneciam durante todo o tempo de execução, mas o tempo de execução ainda modificava as contagens de referência e as operações de coleta de lixo (GC) em cada ciclo de leitura e GC. Isso acionou uma cópia na gravação no processo do servidor e sobe, sobe, sobe a memória privada.
Objetos Imortais para Python
Objetos Imortais são objetos com estado de objeto central imutável. Um valor especial no campo de contagem de referência do objeto permite que o tempo de execução saiba quando pode ou não alterar os campos de contagem referenciados e o cabeçalho do GC. Objetos imortais ignoram as verificações de contagem de referência e permanecem ativos durante toda a execução do tempo de execução, eliminando a necessidade de segurança GIL.
![](https://optimuscloud.com.br/wp-content/uploads/2024/01/1706236927_88_Meta-resolve-o-problema-dos-objetos-nao-tao-imutaveis-do.png)
Objetos padrão versus objetos imortais.
Implementar e lançar Immortal Objects no Instagram foi um processo relativamente simples, mas não foi o caso do lançamento geral.
Desafios com objetos imortais
A implementação de Immortal Objects trouxe alguns obstáculos, como degradação de desempenho, compatibilidade com versões anteriores e compatibilidade de plataforma. Objetos imortais causam degradação de desempenho. A implementação principal depende da adição de verificações explícitas nas rotinas de incremento e decremento da contagem de referência. Isso levou a uma degradação do desempenho do serviço. O uso inteligente das alocações de registos conseguiu manter esta regressão em torno de 2%.
Outro grande obstáculo de implementação foi garantir que os aplicativos não travassem após alterar as implementações de contagem de referência. Meta também garantiu que Immutable Objects funcionasse em todas as diferentes plataformas, compiladores, arquiteturas e tipos de hardware.
Objetos imortais reduziram o uso de memória privada
Ao desenvolver Immortal Objects, os engenheiros da Meta aumentaram o uso de memória compartilhada e diminuíram o uso de memória privada, reduzindo ao mesmo tempo a cópia na gravação.
Mas espere, tem mais! Agora existe uma verdadeira imutabilidade dos objetos na pilha.
Antes dos objetos imutáveis, tanto o GC quanto o mecanismo de contagem de referências tinham acesso irrestrito a ambos os campos. A contribuição dos Immortal Objects para Python significa que esses objetos podem ser compartilhados entre threads sem a necessidade da segurança fornecida pelo GIL. Este é mais um passo em direção a um tempo de execução Python multicore.
A postagem Meta resolve o problema dos objetos não tão imutáveis do Python apareceu pela primeira vez em The New Stack.