Back-End

26 abr, 2012

6 lições do Dropbox – um milhão de arquivos armazenados a cada 15 minutos

Publicidade

O Dropbox armazena um milhão de arquivos a cada 15 minutos, mais do que o número de mensagens enviadas no Twitter. Essa estatística absurda foi revelada por Rian Hunter, um engenheiro da Dropbox, na sua apresentação How Dropbox Did It and How Python Helped, no PyCon 2011.

A primeira parte da apresentação é sobre o Dropbox em si, história de origem e outros mitos de base. Sabemos que o Dropbox é uma startup localizada em San Francisco e que provavelmente tem uma das ferramentas mais populares para sincronização e compartilhamento de arquivos no mundo, entregando o Python no desktop, suportando milhões de usuários e crescendo todos os dias.

Cerca de meia hora depois, a conversa se torna técnica. Não com muitas informações sobre como o Dropbox lida com sua escala massiva, mas eles apresentaram algumas boas lições que valem a pena ser ponderadas:

1.    Use Python

  • 99.9 % do seu código é em Python. Usado no servidor; no cliente, controle lógico do website, API de backend, e estatísticas.
  • Não consegue usar Python no Android devido a limitações de memória.
  • Roda em uma única base de código usando Python. O Dropbox roda em Windows, Mac e Linux usando ferramentas como PyObjs, WxPython, types, py2exe, py2app, PyWin32.

–  Prós:

  • Desenvolvedores conversam uns com os outros e expressam ideias no Python.
  • Fácil de aprender, fácil de ler, fácil de escrever, fácil para novas pessoas pegarem o ritmo…

Contras:

  • Não seja bobo. 
  • OK, ele pode usar muita memória e ficar muito lento. Não é um grande problema no lado do servidor, apenas compre máquinas grandes. No lado do cliente, você não pode fazer um antigo usuário de Power PC atualizá-lo.
  • Codificar em um ambiente misto de Python e C cria problemas, porque é difícil esquadrinhar através das fronteiras de um linguagem, como você gostaria de fazer ao corrigir problemas de memória e processamento.
  • Problemas de fragmentação de memória são motivos pelos quais linguagens de script podem não ser uma boa ideia para processos de execução longos.


2.    Apenas funcione, baby

  • Não deve importar em qual sistema de arquivo você está, qual SO você está usando, quais aplicações você está usando. O produto deve sempre funcionar.
  • O Python os ajudou a iterar rapidamente através de todos os casos de erro que eles encontraram na vasta variedade de plataformas que eles suportam.


3.    Libere rapidamente

  • Codifique algo em um dia e lance. O Python faz com que seja assim tão fácil.


4.    Use C para loops internos – Otimizar a CPU é fácil

  • Uma maneira de lidar com o problema da lentidão.
  • Otimize loops internos para reduzir tempo da CPU.
  • O custo de looping em Python é 44% maior do que em C (2.88s vs 1.61).
  • O despachos de bytecode da Python VM são muito lentos.
  • Muitas ferramentas existentes para definição de perfil de CPU.
  • Otimizações de CPU geralmente são limitadas a pequenas seções de código


5.    Poll – Polling 30 Milhões de clientes ao redor do mundo não escala

  • Uma estrutura de notificação HTTP foi criada para evitar polling o servidor no lado do cliente


6.    Alocador de memória customizado – otimizar memória é difícil

  • Este foi o maior problema deles por um tempo. Poderiam usar imensas quantidades de memória, e ela nunca seria liberada. Para grandes sincronizações, eles teriam que usar mais de 1.5 GB, agora eles raramente usam mais que 100 MB.
  • Difícil porque: poucas ferramentas existem para profiling memory para Python e C;o inchaço de memória tem muitas causas: vazamentos no código Python e C; fragmentação de memória; uso ineficiente de memória.
  • Corrigir ineficiências óbvias de memória não ajudou. Eles pensaram que havia um vazamento de memória, mas não havia.
  • O problema acabou sendo fragmentação de memória. Fragmentação de memória é o que acontece quando blocos de memória de diferentes tamanhos são continuamente deletados e alocados. O que acontece é que blocos contíguos de memória não podem mais ser alocados. O CPython não tem um coletor de lixo, então toda essa memória simplesmente não foi capaz de ser alocada, e a pilha cresceu continuamente, para que os pedidos da memória pudessem ser satisfeitos.
  • A solução foi criar um alocador customizado. O objeto do arquivo de meta-dados cresce muito ao fazer transferências, então a solução óbvia era criar um alocador customizado no C usando mmap.

Direções futuras

  • Dropbox em torradeiras. Compartilhamento de arquivo em torradeiras será o máximo.
  • Eles veem pastas como uma metáfora unificadora para armazenamento, organização e acesso de dados no cloud e em qualquer dispositivo, a qualquer momento, em qualquer lugar.

?

Texto original em disponível em http://highscalability.com/blog/2011/3/14/6-lessons-from-dropbox-one-million-files-saved-every-15-minu.html