sábado, 20 de agosto de 2011

Benchmarks de port forwarding con Python+Eventlet

Les comparto algunos benchmarks que hice para verificar la velocidad del "tcp port forwarder" implementado usando Python+Eventlet: http://blog.eventlet.net/2010/02/28/beautiful-er-eventlet/

No pude hacer los tests usando 'ab', ya que parece haber algun problema por el cual la aplicación no funciona correctamente.

Copia de ISO usando scp, puerto 22: OK
  • ubuntu.iso 100%  698MB  63.4MB/s   00:11
  • ubuntu.iso 100%  698MB  69.8MB/s   00:10
  • ubuntu.iso 100%  698MB  69.8MB/s   00:10

Copia de ISO usando scp, puerto 7000 (eventlet): OK
  • ubuntu.iso 100%  698MB  41.0MB/s   00:17
  • ubuntu.iso 100%  698MB  41.0MB/s   00:17
  • ubuntu.iso 100%  698MB  43.6MB/s   00:16

Copia de ISO, usando wget, bajada directamente de Apache, puerto 80: OK
  • 731,453,440  524M/s   in 1.3s    
  • 731,453,440  539M/s   in 1.3s    
  • 731,453,440  523M/s   in 1.3s    


Copia de ISO, usando wget, bajada directamente de Apache, puerto 7080 (eventlet): OK
    • 731,453,440  319M/s   in 2.2s
    • 731,453,440  318M/s   in 2.2s
    • 731,453,440  323M/s   in 2.2s


    Usando ApacheBench, al puerto 80:  OK
    • ab -n 400 -c 5 http://localhost:80/index.html 
      • Finished 400 requests
      • Concurrency Level:      5
      • Time taken for tests:   0.083 seconds
      • Complete requests:      400
      • Failed requests:        0


    Usando ApacheBench, al puerto 7080 (eventlet): ERROR!!!
      • ab -n 400 -c 5 http://localhost:7080/index.html 
        • apr_poll: The timeout specified has expired (70007)
      • ab -n 40 -c 5 http://localhost:7080/index.html 
        • apr_poll: The timeout specified has expired (70007)
      • ab -n 5 -c 1 http://localhost:7080/index.html 
        • apr_poll: The timeout specified has expired (70007)

      ssh en CentOS 6

      Estoy aprendiendo a trabajar con CentOS, luego de instalar un servidor de aplicaciones python en CentOS 5.6, estoy arrancando desde cero con un CentOS 6. El tema es que se me complicó la configuracion de ssh.

      Por alguna cuestión, no podia ingresar como root a mi máquina virtual con CentOS 6, y resultó ser un problema relacionado con SELinux.

      En definitiva, la configuración del servidor SSH, los permisos, todo estaba OK, y lo solucioné ejecutando:

      • /sbin/restorecon -r /root/.ssh
      Para los servidores "reales" nunca permito el login de root, pero para aprender, en una máquina virtual en mi PC, es muy cómodo poder acceder directamente como root :-D

      viernes, 19 de agosto de 2011

      Listar BD y tablas con sus respectivos tamaños

      Para listar las bases de datos con el tamaño ocupado en disco de cada una:

      • SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database ORDER BY pg_database_size(pg_database.datname);

      Para listar las tablas con el tamaño ocupado en disco de cada una, pero solo del schema 'public' (probado en PostgreSql 8.1):

      • SELECT tablename, pg_size_pretty(pg_total_relation_size(tablename)) FROM pg_tables WHERE schemaname = 'public'  ORDER BY pg_total_relation_size(tablename);

      Para que la última consulta funcione en Postgre 8:4, hay que utilizar casting:
      • SELECT tablename, pg_size_pretty(pg_total_relation_size(tablename::TEXT)) FROM pg_tables WHERE schemaname = 'public' ORDER BY pg_total_relation_size(tablename::TEXT);
      Esto lo probé en 8.1 y 8.4 (únicas versiones que tengo a mano).

      miércoles, 10 de agosto de 2011

      psycopg2 (2.4.2) + Django (1.3) = problemas!


      Si usas psycopg2 versión 2.4.2 con Django 1.3 surge el siguiente problema:

      $ ./virtualenv27/bin/python src/dynamicware/manage.py test myprojects
      Creating test database for alias 'default'...
      (...)
      psycopg2.ProgrammingError: autocommit cannot be used inside a transaction



      Una solución temporal es instalar la versión anterior de psycopg2:

      $ ./virtualenv27/bin/pip install psycopg2==2.4.1

      La solución definitiva ya existe: https://code.djangoproject.com/ticket/16250

      PIL / pillow + virtualenv

      Instalé PIL usando virtualenv, y así termina la instalción:


          --------------------------------------------------------------------
          PIL 1.1.7 SETUP SUMMARY
          --------------------------------------------------------------------
          version       1.1.7
          platform      linux2 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
                        [GCC 4.5.2]
          --------------------------------------------------------------------
          *** TKINTER support not available (Tcl/Tk 8.5 libraries needed)
          *** JPEG support not available
          *** ZLIB (PNG/ZIP) support not available
          *** FREETYPE2 support not available
          --- LITTLECMS support available
          --------------------------------------------------------------------



      PIL se instaló correctamente, pero sin soporte para JPEG y PNG. Este es el funcionamiento "esperado" al instalar PIL con virtualenv.

      La solución: usar pillow (fork PIL, amigable con virtualenv)

      Luego de ejecutar "./virtualenv27/bin/pip install pillow":


          --------------------------------------------------------------------
          Pillow 1.7.4 ( PIL fork based on PIL 1.1.7 ) SETUP SUMMARY
          --------------------------------------------------------------------
          platform  linux2 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
            [GCC 4.5.2]
          --------------------------------------------------------------------
          *** TKINTER support not available (Tcl/Tk 8.5 libraries needed)
          --- JPEG support available
          --- ZLIB (PNG/ZIP) support available
          --- FREETYPE2 support available
          --- LITTLECMS support available
          --------------------------------------------------------------------