Qualquer otimização da prática é muito mais difícil

Adotamos um projeto da web python órfão esta semana, que foi mantido por vários desenvolvedores uma vez. Os antigos mantenedores não pararam com o mau cheiro do projeto. ~ 5s, que terrível), os usuários reclamam, temos que enfrentar o problema e resolvê-lo.

Meu mentor percebeu que havia v√°rios SELECT COUNTs na p√°gina do painel. N√£o fazia sentido torn√°-lo t√£o em tempo real:

class Car(model):
@classmethod
def count(cls, category):
# select count from db

A otimização estava apenas armazenando em cache o resultado da contagem :

class Car(model):
@classmethod
@cache('car:{category}:count', expire=30)
def count(cls, category):
# select count from db

Usei essa forma r√°pida e n√£o suja. Ent√£o os usu√°rios sentiram a melhora na velocidade na p√°gina do painel.

Mas voc√™ entrou em todas as p√°ginas da lista de categorias, ainda lento. Myql explain mostrou que o tipo de consulta de categoria √© all, o pior tipo poss√≠vel. A consulta cont√©m duas condi√ß√Ķes where e um pedido. Tentei adicionar √≠ndice a um de onde condi√ß√£o, tipo se tornou. rangeDepois de adicionar √≠ndices a outros campos, tornou-se ref, o que pode ser aceito.

Naquela época, o custo médio da solicitação era de 1.000 ms.

Graças à equipe do app engine, adicionando app_engine_profile=truea cada URL, podemos facilmente obter os detalhes para criação de perfil. Eu tentei, gzipforam chamados 60.000 vezes e custaram 400 ms no ambiente de produção, mas outros projetos não mostraram essas chamadas gzip anormais. Com a dica de meu mentor, examinei o ponto de entrada do aplicativo.

Quando comentei totalmente o middleware gzip, o tempo de solicitação diminuiu de 120ms para 20ms no ambiente de desenvolvimento. Estava convencido de que havia alguns pontos de acesso relacionados ao gzip, então percebi o valor de retorno do aplicativo:

class Publisher(object):

def __call__(self, env, start_response):
body
= 'string'
return body # Iterable object.

Uau, todo mundo sabe que é um objeto iterável e cada artigo sobre WSGI dirá a você não enviar a saída um byte por um byte , mas os desenvolvedores ainda fizeram isso . Isso fez com que o gzip fosse aplicado a cada byte. Alterando ou resolvendo este problema.return [body]yield body

Esta tarde, quando implantei o c√≥digo modificado para o teste, o ambiente de produ√ß√£o gerou muitas exce√ß√Ķes causadas pelo cache do mako. Verifiquei, o projeto salvou o cache do mako no mfs e os dois ambientes usaram o mesmo cache do mako. Depois de resolver esse bug, a velocidade pode ser um pouco melhor, porque mfs √© um sistema de arquivos de rede distribu√≠do.

No final, o desempenho do projeto teve uma melhora consider√°vel, mas ainda havia muito trabalho a ser feito.