Ad server

2008/10/15 Francesc E. [email protected]

Que no me salte nadie a la yugular … DRb es lo bastante rà pido para
procesar mensajes? Creo que hice las pruebas pertienentes en ese
momento, por lo que me quedé con starling, que al mismo tiempo no es
tan rà pido como Beanstalkd, pero lo elegimos por la persistencia de la
cola.

He estado haciendo pruebas MUY POCO CIENTÍFICAS con drb y estos son los
resultados y código. El entorno un powerbook g4 con el ruby de serie de
osx
10.5.

Los resultados son los esperados, y se podría concluir que drb es lento
a la
espera de comparar resultados con starling (a ver si esta tarde saco
tiempo
o si puedes implementar un ejemplo parecido), permitiéndome un máximo de
600
peticiones por segundo.

Salvando comparativa con starling, en mi máquina, una simple operación
de
suma remota en drb está limitada a unas 600 peticiones por segundo. Por
lo
que incluso usando drb, habría que bufferear para obtener un rendimiento
decente con mucha carga.

Kakafuti2:drbtest guillermo$ ruby server.rb & sleep 2 ; ruby client.rb ;
fg

[1] 3408

I, [2008-10-15T14:09:15.634353 #3410] INFO – : Connecting to server

I, [2008-10-15T14:09:15.638425 #3410] INFO – : Tring increase in
server

I, [2008-10-15T14:09:25.658296 #3410] INFO – : Total user time in 10

seconds for #Counter:0xa0b04.increase with 6387 calls: 4.7

I, [2008-10-15T14:09:25.659619 #3410] INFO – : Trying increase in
local

I, [2008-10-15T14:09:35.668056 #3410] INFO – : Total user time in 10

seconds for #Counter:0x89850.increase with 5163733 calls: 9.45

I, [2008-10-15T14:09:35.669428 #3410] INFO – : Trying system in server

I, [2008-10-15T14:09:45.695523 #3410] INFO – : Total user time in 10

seconds for #Counter:0xa0b04.sys with 772 calls: 0.989999999999999

I, [2008-10-15T14:09:45.696871 #3410] INFO – : Trying system in local

I, [2008-10-15T14:09:55.701216 #3410] INFO – : Total user time in 10

seconds for #Counter:0x89850.sys with 956 calls: 0.24

ruby server.rb

^Cserver.rb:5:in `join’: Interrupt

from server.rb:5

Kakafuti2:drbtest guillermo$

counter.rb

class Counter

def initialize; @count,@utime = 0,Process.times.utime; end

public :initialize

def utime; Process.times.utime - @utime ; end

def increase; @count = @count+1; end

attr_reader :count

def sys; @count = @count+1 ; %x(ls); nil; end

end

server.rb

require ‘drb/drb’

require ‘counter’

DRb.start_service(“druby://localhost:8787”,Counter.new)

DRb.thread.join

client.rb

%w(drb/drb timeout logger counter).each {|e| require e}

@logger = Logger.new(STDOUT)

def log(msg); @logger.info msg ; end

def timeout(obj,meth)

obj.initialize

Timeout::timeout 10 do

obj.send meth while true

end

rescue TimeoutError

log "Total user time in 10 seconds for #{obj.to_s}.#{meth.to_s} with

#{obj.count.to_s} calls: #{obj.utime}"

end

log “Connecting to server”

server = DRbObject.new_with_uri(“druby://localhost:8787”)

local = Counter.new

log “Tring increase in server”

timeout server, :increase

log “Trying increase in local”

timeout local, :increase

log “Trying system in server”

timeout server, :sys

log “Trying system in local”

timeout local, :sys

2008/10/15 Guillermo [email protected]:

He estado haciendo pruebas MUY POCO CIENTÍFICAS con drb y estos son los
resultados y código. El entorno un powerbook g4 con el ruby de serie de osx
10.5.

Los resultados son los esperados, y se podría concluir que drb es lento a la
espera de comparar resultados con starling (a ver si esta tarde saco tiempo
o si puedes implementar un ejemplo parecido), permitiéndome un máximo de 600
peticiones por segundo.

Benchmark que hice de Starling y Beanstalkd hace unos meses. El
benchmark mete 1000 items en una cola y despues los saca. [1]

Beanstalkd es mas rapido al hacer push en la cola por que no es
persistente.

         user     system      total        real

b:push 0.060000 0.030000 0.090000 ( 0.153311)
b:pop 0.100000 0.040000 0.140000 ( 0.290474)
s:push 0.040000 0.030000 0.070000 ( 0.235342)
s:pop 0.060000 0.030000 0.090000 ( 0.274897)

[1] http://github.com/fesplugas/snippets/tree/master/ruby/bm_queues.rb

Para no alejarnos del hilo comentar que sea la solución que sea, yo
creo que Rails puede ir escalando a medida que lo necesitemos.

Coñe si se puede utilizar con simplified_starling, me gusta ver que
hay gente que lo está usando.

Yo empeze a extraer de un proyecto un AdServer, pero veo que lo tuyo
está bastante avanzado. Has pensado en la manera de poder insertar
banners en otras webs?

Lo tienes funcionando em produccion en algun sitio?

On 28/10/2008, at 19:07, Felipe T. Armero

On Oct 15, 2008, at 12:54 PM, Guillermo wrote:

Coño, tener un hash en memoria con los clicks y cada 5 minutos o
cada 1000 visualizaciones o cada “lo que te de la gana” volcarlo en
la base de datos no supone un gran esfuerzo, y es capaz de escalar
todo lo que quieras. Solución más seria y sin mucha lio, es hacer el
demonio drb(además te quitas temas de concurencia de los que te
tienes que preocupar en caso de usar un hash en memoria), un sistema
de colas o cualquier cosa que sirva de buffer. También tienes la
opción de insert delayed, aunque para mi gusto es una opción más
delicada ya que es más coñazo depurar en caso de fallo.

Done :smiley:

Tras unas semanas sacando por ahi ratillos, tengo una primera
implementación de todo esto en forma de plugin. Si os apetece pegarle
un vistazo y me contais que tal lo veis, yo ya lo tengo rulando en mis
apps :slight_smile:

Os presento stats_for_all =>

Saludos
Felipe

2008/10/28 Felipe T. Armero [email protected]

Os presento stats_for_all =>
GitHub - flype/stats_for_all: easy to use, scalable and elegant tracking stats plugin for your rails models

Gracias por la mención.
He estado mirando el código y me gusta.

En StatsForAll::Client::InstanceMethods.drb_save haces una llamada a
DRb.start_service. Salvo que haya algo que me pierda, esta función te la
puedes comer directamente pese a que la documentación diga lo contrario.
Verás que el rendimiento en drb se dispara hasta ser transparate para un
humano.

On Oct 29, 2008, at 12:02 AM, Francesc E. wrote:

Coñe si se puede utilizar con simplified_starling, me gusta ver que
hay gente que lo está usando.

Pues cuando decidí usar starling estuve mirando varias opciones, entre
ellas, reinventar la rueda y implementar directamente el soporte de
starling, cosa que pronto deseché al ver que había bastante por ahi
hecho… la otra fue elegir entre simplified_starling y workling,
pero jugando con las dos al final decidí usar simplified_starling por
la manera de levantar los servicios con rake, la implementación que la
vi mas sencilla y porque en principio estoy interesado en usar
starling por la persistencia y no ningún otro sistema de colas.

Yo empeze a extraer de un proyecto un AdServer, pero veo que lo tuyo
está bastante avanzado. Has pensado en la manera de poder insertar
banners en otras webs?

Realmente mi idea ha ido un poco mas allá, no he querido hacer solo un
sistema que sirva para estadísticas de ads, con el plugin puedes
sacar estadísticas de cualquier modelo y de cualquier tipo no solo
hits y clicks, puedes definir tus propios tipos.

La idea es utilizar una especie de sistema globalizado que pueda
guardar estadísticas de por ponerte un ejemplo las visitas de una
foto, al igual que hace flickr osea de cualquier recurso de tu
aplicación.
Claro está dentro de ese recurso están la publi, por lo que montar un
adserver, estaría ya chupado. :-p

Lo tienes funcionando em produccion en algun sitio?

Aún no, estoy terminando la refactorización de un proyecto, cuando
esté lista le daremos cañita al plugin a ver como responde.

On Oct 29, 2008, at 2:27 AM, Guillermo wrote:

En StatsForAll::Client::InstanceMethods.drb_save haces una llamada
a DRb.start_service. Salvo que haya algo que me pierda, esta
función te la puedes comer directamente pese a que la documentación
diga lo contrario. Verás que el rendimiento en drb se dispara hasta
ser transparate para un humano.

Ojú, que razón tienes, funciona exactamente igual y he ganado un 200%
de rendimiento :smiley: dejo unos benchmarks para el drb.

Para el servidor drb sin el start_service

             user     system      total        real

direct 0.000000 0.000000 0.000000 ( 0.001370)
drb-10 0.020000 0.000000 0.020000 ( 0.034161)
drb-100 0.120000 0.010000 0.130000 ( 0.226939)
drb-1000 1.490000 0.090000 1.580000 ( 2.581357)
drb-10000 14.680000 0.830000 15.510000 ( 24.699897)

Y para el servidor con el:
user system total real
direct 0.000000 0.000000 0.000000 ( 0.001350)
drb-10 0.020000 0.000000 0.020000 ( 0.249107)
drb-100 0.180000 0.050000 0.230000 ( 0.462050)
drb-1000 2.130000 0.430000 2.560000 ( 4.758769)
drb-10000 21.020000 4.310000 25.330000 ( 46.883869)

muchas gracias, si vas viendo por ahi algo raro, coméntamelo.

Un saludo
Felipe