Posts de December, 2008

[Cristiano Casado] Phusion Passenger 2.0.5 + global queuing

Friday, December 5th, 2008

Saiu do forno a release 2.0.5 do Phusion Passenger com um fix importante para a feature global queuing, que foi introduzida na versão 2.0.4, porém era a causa de deadlocks quando usada em combinação com o MPM worker do apache.

Mas qual a utilidade desta feature ? O Passenger trabalha com múltiplos processos Ruby on Rails, cada um com a responsabilidade em processar os requests HTTP. O processo leva determinado tempo para processar um request HTTP específico. Se a aplicação estiver sob alto tráfego, estes processos de backend podem não responder em tempo hábil, podendo haver um enfileramento de novos requests a serem processados.

Quando não temos o global queuing, cada processo possui sua própria fila para requests pendentes (private queue), com possibilidades de um processo estar mais carregado, ou seja com mais requests pendentes, do que outros.

Com o global queuing, temos a implementação de uma fila compartilhada entre todos os processos de backend. Se todos os processos estiverem ocupados o Passenger mantém o novo request nesta fila global, até que o primeiro processo tenha disponibilidade de processamento. A distribuição destes requests é mais eficiente, com o processo mais desocupado recebendo o novo request.

O download do Passenger versão 2.0.5 está disponível aqui no RubyForge.

[Gabriel Falcão] Hosting and deploying django apps on Dreamhost

Tuesday, December 2nd, 2008

About two years ago, I’ve signed up to Dreamhost. My goals were and still being to host my personal projects, websites and so on.

Once I am a Django web developer, one of my first actions were to create a django deployment setup, good and flexible enough. The time passed on and have been got new experiences, and the best desision, i think, was to create a new python sandbox, i mean, a customized python environment.

How is it possible ?

Simple! Just compiling python from scratch, with a fake root path (a prefix)

Anyway, the deployment process involves more variables, like setting both htaccess and dispatch files for each project, installing some basic modules such PIL and MySQL and so on…

So, i ever wanted to create a super duper script to do all that “dirty” work. And i did it last weekend!

I were working ia a freelance job and decided to create a subdomain to host test instance of them.

A new sandbox, ready to make my tests to create the super script.

So folks, i present you the brand new: django_dreamhost.sh :)

It’s composed by 4 files:

  • django_dreamhost.sh itself
  • djangify.template - a template with will become a script to setup new projects (htaccess and dipatch files, for instance)
  • htaccess.template - a template that will become the .htaccess of each project of yours
  • dispatch.template - will become the dispatch.fcgi for your projects as well

“But do i need to download all them ?”, of course NO!

You just download the main script, and he will do all do hard work!

“I wanna contribute, modify or do anything with that script, can I ?”, of course yes! All parts of the script are GPLv2 +

You can also always get the development version through git repository:

git clone http://git.nacaolivre.org/django_dreamhost

Don’t want to get all code, just the script ?

Download it at: http://gnu.gabrielfalcao.com/django_dreamhost/django_dreamhost.sh

What does that script do ?

He will do the following steps:

  1. Download Python, Django, Python-setuptools, Python-fastcgi to a directory called downloads
  2. Extract all
  3. Create a local root at $HOME/.myroot and the subdirs etc and usr
  4. Set the new bin path to you global path through bashrc and bash_profile
  5. Compile and install python to the new prefix: $HOME/.myroot/usr
  6. Install Django, rename django-admin.py to django-admin
  7. Setup your bash-completion to support django scripts
  8. Install the python modules above with the new python
  9. Install PIL and MYSQL modules through easy_install (setuptools)
  10. Download the template scripts to $HOME/projects/script_templates
  11. Replace the custom tags in templates
  12. Move the djangify.template to the new bin PATH: $HOME/usr/bin and give it execution permission

I thinks it’s all.

I currently use Fabric to help on deployment, and i have a quite smart basic setup for it to work with this dreamhost django environment, but it will be approached in the next blog post :)

See you, folks!

[Bruno F. M. Souza] Distribuição de vídeos em Flash com P2P

Monday, December 1st, 2008

A Octoshape lançou seu plugin (Octoshape Grid Delivery Enhancement for Adobe Flash Player) para players de vídeo em Flash visando a distribuição de vídeos ao vivo codificados em VP6 (On2) utilizando uma arquitetura peer-to-peer.

O case que tive contato é a CNN Live. Mas vi que outros big players também estão adotando a solução. Exemplos são a transmissão ao vivo da NBA e dos jogos olímpicos de Pequim.

Como?

O funcionamento é, mais ou menos, assim: após a instalação, o player faz o GET da playlist (ASX) que possui como primeira entrada a URL para consumo do vídeo através do plugin da Octoshape. Caso o usuário não tenha o mesmo instalado, ele será direcionado para os demais streams unicast que são distribuídos por suas CDN`s via rtmp.

<asx>
    <!-- file written from rtm2 template on cdn8mon1 -->
    <entry>
        <ref href="octoshape://octodir.hwcdn.net/hwo.u4j9w4s3.cnn_stream1_high"
            clients="0" highwater="250000" lowwater="200000"/>
        <!--
        Below here are the regular cdns, randomly sorted by weight
        -->
        <ref href="rtmp://cp44679.live.edgefcs.net/live/cnn_stream1_low@2785"
            weight="100"/>
        <ref href="rtmp://cnntriallivefs.fplive.net/cnntriallive-live/cnntrialstream1"
            weight=""/>
        <ref href="rtmp://cnn.fc.llnwd.net/cnn/cnn_stream1_low" weight=""/>
    </entry>
</asx>

Ao fazer o GET para o plugin da Octoshape, conforme indicado na playlist acima, a requisição é redirecionada para um GET local na porta 5861/TCP, que é a porta que o plugin realiza a comunicação para o delivery do vídeo para o Flash Player, como se este último estivesse realizando um download progressivo de um vídeo com tamanho “infinito”:

(Request-Line)	GET /pm/1/1228133155182/hwou4j9w4s3cnnstream1high HTTP/1.1
Host	        localhost:5861

(Status-Line)	HTTP/1.0 200 OK
Content-Length	2147483647
Content-Type	video/x-flv

Apesar do baixíssimo consumo de memória e CPU, a qualidade do vídeo final (lembrando que trata-se de um vídeo ao vivo) é muito boa. Fontes ocultas disseram que estão codificando a uma taxa de 600kbps com VP6:

VIDEO:  [VP6F]  576x324  0bpp  15.000 fps    0.0 kbps ( 0.0 kbyte/s)
=======================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffvp6f] vfm: ffmpeg (FFmpeg VP6 Flash decoder)
=======================================================================
=======================================================================
Opening audio decoder: [mp3lib] MPEG layer-2, layer-3
mpg123: Can't rewind stream by 584 bits!
AUDIO: 44100 Hz, 2 ch, s16le, 48.0 kbit/3.40% (ratio: 6000->176400)
Selected audio codec: [mp3] afm: mp3lib (mp3lib MPEG layer-2, layer-3)

E não é só a qualidade da imagem - na verdade, a Octoshape não possui nenhuma interferência nas etapas de processamento de imagens, visto que o foco deles é o delivery do stream. E aí sim vale ressaltar a boa capacidade de adaptação às condições da rede, evitando situações de re-buffering e fazendo um bom uso das bandas de download e upload.

Instalação

Para a instalação, vi que, ao entrar no site para visualizar o stream de vídeo ao video, o player faz a validação da versão do Flash Player. Através do Express Install, ele sugere a atualização para a versão 10.

...
    useExpressInstall:function(_d){
        this.xiSWFPath=!_d?"expressinstall.swf":_d;
        this.setAttribute("useExpressInstall",true);
    }
...

Depois, verifica se o mesmo é compativel com a extensão da Octoshape:

LivePlayer.prototype.isOctoCapable = function(){
    var os = navigator.userAgent.toLowerCase();
    return !(os.indexOf("mac") > -1 && os.indexOf("10.3") > -1);
}

E sugere a instalação da mesma.

Aceita-se os termos de uso e, pronto.

Então…

Minha única dúvida ficou por conta da necessidade de instalação do Flash Player 10 para poder utilizar o plugin. Provavelmente, o mesmo deve ter algum tipo de integração com o Flash Media Server 3.5. Um dos pontos seria o chaveamento automático do stream de acordo com a disponibilizade de banda do usuário (Dynamic Streaming) - procurando sempre a melhor relação qualidade de imagem/consumo de banda.

Enfim, uma ótima alternativa para baratear os custos de servir vídeo de qualidade na internet…

[Bruno F. M. Souza] Distribuição de vídeos em Flash com P2P

Monday, December 1st, 2008

A Octoshape lançou seu plugin (Octoshape Grid Delivery Enhancement for Adobe Flash Player) para players de vídeo em Flash visando a distribuição de vídeos ao vivo codificados em VP6 (On2) utilizando uma arquitetura peer-to-peer.

O case que tive contato é a CNN Live. Mas vi que outros big players também estão adotando a solução. Exemplos são a transmissão ao vivo da NBA e dos jogos olímpicos de Pequim.

Como?

O funcionamento é, mais ou menos, assim: após a instalação, o player faz o GET da playlist (ASX) que possui como primeira entrada a URL para consumo do vídeo através do plugin da Octoshape. Caso o usuário não tenha o mesmo instalado, ele será direcionado para os demais streams unicast que são distribuídos por suas CDN`s via rtmp.

<asx>
    <!-- file written from rtm2 template on cdn8mon1 -->
    <entry>
        <ref href="octoshape://octodir.hwcdn.net/hwo.u4j9w4s3.cnn_stream1_high"
            clients="0" highwater="250000" lowwater="200000"/>
        <!--
        Below here are the regular cdns, randomly sorted by weight
        -->
        <ref href="rtmp://cp44679.live.edgefcs.net/live/cnn_stream1_low@2785"
            weight="100"/>
        <ref href="rtmp://cnntriallivefs.fplive.net/cnntriallive-live/cnntrialstream1"
            weight=""/>
        <ref href="rtmp://cnn.fc.llnwd.net/cnn/cnn_stream1_low" weight=""/>
    </entry>
</asx>

Ao fazer o GET para o plugin da Octoshape, conforme indicado na playlist acima, a requisição é redirecionada para um GET local na porta 5861/TCP, que é a porta que o plugin realiza a comunicação para o delivery do vídeo para o Flash Player, como se este último estivesse realizando um download progressivo de um vídeo com tamanho “infinito”:

(Request-Line)	GET /pm/1/1228133155182/hwou4j9w4s3cnnstream1high HTTP/1.1
Host	        localhost:5861

(Status-Line)	HTTP/1.0 200 OK
Content-Length	2147483647
Content-Type	video/x-flv

Apesar do baixíssimo consumo de memória e CPU, a qualidade do vídeo final (lembrando que trata-se de um vídeo ao vivo) é muito boa. Fontes ocultas disseram que estão codificando a uma taxa de 600kbps com VP6:

VIDEO:  [VP6F]  576x324  0bpp  15.000 fps    0.0 kbps ( 0.0 kbyte/s)
=======================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffvp6f] vfm: ffmpeg (FFmpeg VP6 Flash decoder)
=======================================================================
=======================================================================
Opening audio decoder: [mp3lib] MPEG layer-2, layer-3
mpg123: Can't rewind stream by 584 bits!
AUDIO: 44100 Hz, 2 ch, s16le, 48.0 kbit/3.40% (ratio: 6000->176400)
Selected audio codec: [mp3] afm: mp3lib (mp3lib MPEG layer-2, layer-3)

E não é só a qualidade da imagem - na verdade, a Octoshape não possui nenhuma interferência nas etapas de processamento de imagens, visto que o foco deles é o delivery do stream. E aí sim vale ressaltar a boa capacidade de adaptação às condições da rede, evitando situações de re-buffering e fazendo um bom uso das bandas de download e upload.

Instalação

Para a instalação, vi que, ao entrar no site para visualizar o stream de vídeo ao video, o player faz a validação da versão do Flash Player. Através do Express Install, ele sugere a atualização para a versão 10.

...
    useExpressInstall:function(_d){
        this.xiSWFPath=!_d?"expressinstall.swf":_d;
        this.setAttribute("useExpressInstall",true);
    }
...

Depois, verifica se o mesmo é compativel com a extensão da Octoshape:

LivePlayer.prototype.isOctoCapable = function(){
    var os = navigator.userAgent.toLowerCase();
    return !(os.indexOf("mac") > -1 && os.indexOf("10.3") > -1);
}

E sugere a instalação da mesma.

Aceita-se os termos de uso e, pronto.

Então…

Minha única dúvida ficou por conta da necessidade de instalação do Flash Player 10 para poder utilizar o plugin. Provavelmente, o mesmo deve ter algum tipo de integração com o Flash Media Server 3.5. Um dos pontos seria o chaveamento automático do stream de acordo com a disponibilizade de banda do usuário (Dynamic Streaming) - procurando sempre a melhor relação qualidade de imagem/consumo de banda.

Enfim, uma ótima alternativa para baratear os custos de servir vídeo de qualidade na internet…