¿Cuántas conexiones de socket es posible?

¿Alguien tiene idea de cuántas conexiones tcp-socket son posibles en un servidor raíz estándar moderno? (En general, hay menos tráfico en cada conexión, pero todas las conexiones tienen que estar activas todo el tiempo).

EDITAR: Utilizaremos un servidor Linux.

Busque en Google el problema “C10K”. Esto es básicamente discusión y tecnología sobre cómo administrar 10,000 o más conexiones simultáneas.

Sospecho que se eligió este número porque es difícil, pero teóricamente posible.

Logré 1600k conexiones simultáneas de socket inactivo, y al mismo tiempo 57k req / s en un escritorio Linux (16G RAM, I7 2600 CPU). Es un servidor HTTP de un solo hilo escrito en C con epoll. El código fuente está en github , un blog aquí .

Editar:

Hice 600k conexiones HTTP simultáneas (cliente y servidor) en la misma computadora, con JAVA / Clojure. publicación de información detallada, discusión de HN: http://news.ycombinator.com/item?id=5127251

El costo de una conexión (con epoll):

  • la aplicación necesita algo de RAM por conexión
  • Tampón TCP 2 * 4k ~ 10k o más
  • epoll necesita algo de memoria para un descriptor de archivo, de epoll (7)

Cada descriptor de archivo registrado cuesta aproximadamente 90 bytes en un kernel de 32 bits, y aproximadamente 160 bytes en un kernel de 64 bits.

Esto depende no solo del sistema operativo en cuestión, sino también de la configuración, configuración potencialmente en tiempo real.

Para Linux:

cat /proc/sys/fs/file-max 

mostrará la cantidad máxima actual de descriptores de archivos permitidos para abrirse simultáneamente. Visite http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html

10,000? 70,000? eso es todo 🙂

FreeBSD es probablemente el servidor que desea, aquí hay una pequeña publicación de blog sobre cómo ajustar 100.000 conexiones, ha tenido algunas características interesantes como los sockets de copia cero desde hace algún tiempo, junto con kqueue para actuar como un mecanismo de puerto de finalización.

¡Solaris puede manejar 100.000 conexiones en el último siglo !. Dicen que Linux sería mejor

La mejor descripción que he encontrado es esta presentación / documento sobre cómo escribir un servidor web escalable. Él no tiene miedo de decirlo así 🙂

Lo mismo para el software: los cretinos en la capa de aplicación forzaron grandes innovaciones en la capa del sistema operativo. Debido a que Lotus Notes mantiene abierta una conexión TCP por cliente, IBM aportó optimizaciones importantes para el caso de “un proceso, 100.000 conexiones abiertas” a Linux.

Y el progtwigdor O (1) se creó originalmente para obtener una buena puntuación en algún punto de referencia de Java irrelevante. La conclusión es que esta hinchazón nos beneficia a todos.

En Linux debería considerar el uso de epoll para async I / O. También podría valer la pena ajustar los buffers de socket para no desperdiciar demasiado espacio en el kernel por conexión.

Supongo que deberías poder alcanzar 100k conexiones en una máquina razonable.

depende de la aplicación. si solo hay unos pocos paquetes de cada cliente, 100K es muy fácil para Linux. Un ingeniero de mi equipo había hecho una prueba hace años, el resultado muestra: cuando no hay un paquete del cliente después de la conexión establecida, linux epoll puede ver 400k fd para la reabilidad al nivel de uso de la CPU por debajo del 50%.

Un límite en el número de sockets abiertos es configurable en el sistema de archivos / proc

 cat /proc/sys/fs/file-max 

Máx. Para conexiones entrantes en el sistema operativo definidas por límites enteros.

Linux en sí mismo permite miles de millones de sockets abiertos.

Para usar los sockets, necesita una aplicación que escuche, por ejemplo, un servidor web, y que usará una cierta cantidad de RAM por socket.

RAM y CPU introducirán los límites reales. (moderno 2017, piensa en millones, no en miles de millones)

1 millón es posible, no es fácil. Espere usar X Gigabytes de RAM para administrar 1 millón de sockets.

Las conexiones TCP salientes están limitadas por números de puerto ~ 65000 por IP. Puede tener múltiples direcciones IP, pero no direcciones IP ilimitadas. Este es un límite en TCP no Linux.

¿Qué sistema operativo?

Para las máquinas con Windows, si está escribiendo un servidor para escalar bien y, por lo tanto, usa Puertos de E / S de finalización y E / S asíncronas, la principal limitación es la cantidad de grupos sin paginación que está utilizando para cada conexión activa. . Esto se traduce directamente en un límite basado en la cantidad de memoria que su máquina ha instalado (la agrupación no paginada es una cantidad finita y de tamaño fijo que se basa en la memoria total instalada).

Para las conexiones que no ven mucho tráfico, puede reducirlas para hacerlas más eficientes al publicar ‘lecturas de bytes cero’ que no usan grupos no paginados y no afectan el límite de páginas bloqueadas (otro recurso potencialmente limitado que puede evitarlo tener muchas conexiones de socket abiertas).

Aparte de eso, bueno, necesitarás un perfil, pero he logrado obtener más de 70,000 conexiones concurrentes en un servidor modestamente especificado (760MB de memoria); ver aquí http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html para más detalles.

Obviamente, si está utilizando una architecture menos eficiente, como ‘hilo por conexión’ o ‘seleccionar’, entonces debería esperar obtener cifras menos impresionantes; pero, en mi humilde opinión, simplemente no hay razón para seleccionar tales architectures para servidores de Windows.

Editar: vea aquí http://blogs.technet.com/markrussinovich/archive/2009/03/26/3211216.aspx ; la forma en que se calcula la cantidad de grupo no paginado ha cambiado en Vista y Server 2008 y ahora hay mucho más disponible.

De manera realista para una aplicación, más de 4000-5000 tomas abiertas en una sola máquina se vuelven poco prácticas. Simplemente verificar la actividad en todos los sockets y administrarlos comienza a convertirse en un problema de rendimiento, especialmente en entornos de tiempo real.