Login Barrapunto
Cometas e hilos
En javaHispano publican un artículo titulado ¿Están lloviendo de nuevo Cometas e Hilos?: «En los últimos años se ha estado apostado por la técnica de comunicaciones asíncronas (no bloqueantes), por ejemplo en servidores de aplicaciones, en contra de la técnica basada en hilos o síncrona (hilo por conexión, en donde los hilos se bloquean cuando no pueden leer o escribir). Como justificación se partía de la idea de que la técnica de comunicación asíncrona es superior tanto en rendimiento y en escalabilidad a la técnica clásica síncrona. Dicha idea se basó inicialmente en el proyecto SEDA basado a su vez en la tesis doctoral de Matt Welsh en torno a 2001. En el ámbito Java se ha concretado en el predominio del uso de NIO en vez de IO (el proyecto SEDA está también basado en Java). El artículo plantea que la tesis de Welsh era válida en aquella época sobre todo en sistemas Linux basados en el kernel 2.4 o anteriores y máquinas virtuales Java antiguas». Un artículo relacionado, de meses atrás, es ¿Es NIO realmente más rápida que IO?.
« Propuesta en el Parlamento de reforma de la Ley de Propiedad Intelectual | Segundamano abandona el papel por la red »
Y recuerda: Los comentarios que siguen pertenecen a las personas que los han enviado. No somos responsables de los mismos.

Modelo mixto
(Puntos:3, Informativo)( http://yapw.blogspot.com/ | Última bitácora: Jueves, 27 Noviembre de 2008, 10:34h )
La nostalgia ya no es lo que era.
Lo veo lógico
(Puntos:2)( http://es.geocities.com/julio_sao | Última bitácora: Domingo, 23 Noviembre de 2008, 11:59h )
Puede que de hecho la técnica de la E/S no bloqueante acabe estando desaconsejada por razones de rendimiento.
JulioSAO xD.
Menudo invento...
(Puntos:1, Interesante)¿Qué validez tendrá el post?
(Puntos:5, Informativo)( http://127.0.0.1/ | Última bitácora: Miércoles, 12 Noviembre de 2008, 18:43h )
Una aplicación bloqueante es mucho más fácil de programar, si se te detiene un hilo no se para toda la aplicación (como si pasa en una aplicación por eventos). Una aplicación bloqueante que haga cosas y no afecte al rendimiento tiene su cosa, con los bloqueos te estas cargando la concurrencia.
Resumiendo: falta el enlace al artículo original para ver que librería de eventos se está usando. Faltan pruebas con una aplicación real programada de una y de otra forma (que tipo de aplicación va a ser creo que es fundamental para elegir la arquitectura apropiada).
Hay infinitos universos paralelos. Disculpe si en alguno digo alguna sandez.
El problema no es la velocidad
(Puntos:3, Interesante)Si tienes 10000 conexiones en blocking, obviamente necesitas 10000 threads.
Estos solo se puede hacer bien con NIO, una buena libreria de eventos con un pool fijo de threads atendiendolos.
Tambien podrias usar la tactica del Big Loop, como punto medio, pero solo sirve para transacciones simples y a la larga escala peor que NIO.
Pero...
(Puntos:4, Interesante)( http://bsdero.gulags.org.mx/ )
Los sockets son conexiones de redes a cualquier computadora usando el protocolo TCP.
La concurrencia desde el punto de vista de estas aplicaciones, es el soportar el mayor numero posible de clientes simultaneos.
El througput se puede entender como el flujo de bytes por unidad de tiempo.
Uno de los grandes problemas al diseñar software de servidores de redes es el mantener la mayor concurrencia sin que esto afecte de manera negativa en el througput.
La idea es dar soporte a tantos clientes como se pueda, sin afectar el througput del servidor.
Esta es una tarea compleja y dificil, y siempre los investigadores estan en busca de varios algoritmos para poder hacer esto. Para ello se basan la mayoria en sockets no bloqueantes.
La I/O de sockets bloqueante espera hasta que:
*Haya una conexion disponible
*Existan datos en el socket listos para lectura
*El socket este listo para escribir.
Los sockets no bloqueantes no ponen a dormir el proceso hasta que ocurra algun evento de estos y en su lugar continua la ejecucion del programa.
Y que es eso de poll y epoll?
Simple: Se requiere de una llamada al sistema que nos avise cuando hay actividad en un socket (incluyendo alguna conexion nueva de un cliente).
La usada de forma tradicional en los unix es select(), pero es algo lenta y vieja (aunque portable). La llamada poll() es muy especifica de linux, (aunque tambien se usa en cygwin, creo que de hecho ya esta en POSIX), que aporta una mayor velocidad. Pero epoll() es mucho mas rapida. Cada unix integra su propia alternativa a select(), siendo epoll() la propuesta de Linux, kqueue la propuesta de los B y ports la de Solaris.
Existe una nueva llamada AIO pero esta en vias de estandarizarse por POSIX ( o no se si ya?)
Bueno, la idea es obtener conexiones de clientes mas rapido con estas interfaces. La idea es tambien capturar la mayor cantidad de clientes posibles y darles la atencion tan rapido como se pueda, eliminando cualquier tiempo muerto de procesador y tratando que el cuello de botella este en el HW.
Una vez que ya adquirimos la conexion, decidimos que hacer con ella dependiendo del algoritmo a usar y de la naturaleza de la aplicacion.
Algunos algoritmos se basan en un pool de procesos, que crean un nuevo proceso para cada conexion recibida(apache 1.x)
Otros crean un pool de procesos y dentro de cada uno, un pool de threads de usuario para atender a cada uno. (Apache 2.x, Meta1)
Hay quien ha diseñado librerias para ello (StateThreads)
Cada una tiene sus ventajas e inconvenientes. SEDA es un algoritmo de Pipeline que "embona" las diversas fases del protocolo en threads: un thread para cada fase.
Sin embargo, me parece mas interesante la tecnica de Cherokee Web Server, que crea un grupo de kernel threads y para cada uno crea varias conexiones poniendolas en un pipeline para cada fase del protocolo. Esto aprovecha mucho mejor los procesadores en equipos multicore, ademas de que al usar algoritmos de caches mas eficientes y mmap() para lecturas y escrituras al disco deja el cuello de botella en la conexion y el hardware. Pero lo mas importante es que se pueden tener cientos de clientes conectados y seguir recibiendo aun mas conexiones, evitando ademas que el througput se degrade por ello
En fin, hay muchas formas y algoritmos de lograr las cosas. Y SEDA es un algoritmo mas, que esta aun por comprobar si en realidad llega a alcanzar el santo grial de las aplicaciones de servidores de redes, ya que hasta donde se, la unica implementacion que existe esta hecha en Java, que nada tiene que hacer contra una implementacion en C.
Espero que alguien haya entendido todo este rollo. Tambien me hice bolas al principio, pero ya que mi tema de tesis de maestria esta relacionado, pense que podria aportar algo...
Mexico lindo y querido, que digan que estoy dormido, si muero lejos de ti.
Re:Por ahí leí Linux...
(Puntos:1, FueraDeTema)( http://acebo.myminicity.es/ )
¿Me podrías decir cómo consigue Microsoft meter su basura en todos los PC que se venden?
Te recomiendo que te leas Why I hate Microsoft [vanwensveen.nl], en donde se explican muy bien (aunque en inglés) las barbaridades (y méritos, también hay que decirlo) que Microsoft ha hecho durante su vida.
Te sorprenderás de lo que es capaz de hacer...
Tú lo compras, yo lo copio. Todo legal.
Multiplica y reparte [exgae.net]
reposteando :-]
(Puntos:1, Provocacion)( http://barrapunto.com/ | Última bitácora: Lunes, 01 Diciembre de 2008, 19:20h )