¿Qué parámetro del kernel u otras configuraciones controlan la cantidad máxima de sockets TCP que se pueden abrir en un servidor Linux? ¿Cuáles son las desventajas de permitir más conexiones?
Mientras cargaba probando un servidor Apache con ab, noté que es bastante fácil maximizar las conexiones abiertas en el servidor. Si deja de lado la opción ab's -k, que permite la reutilización de la conexión, y hace que envíe más de aproximadamente 10,000 solicitudes, Apache atiende las primeras 11,000 solicitudes y luego se detiene durante 60 segundos. Una mirada a la salida de netstat muestra 11,000 conexiones en el estado TIME_WAIT. Aparentemente, esto es normal. Las conexiones se mantienen abiertas por defecto de 60 segundos incluso después de que el cliente haya terminado con ellas por razones de confiabilidad de TCP .
Parece que esta sería una manera fácil de hacer un servidor DoS y me pregunto cuáles son las afinaciones y precauciones habituales para ello.
Aquí está mi salida de prueba:
# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The timeout specified has expired (70007)
Total of 11655 requests completed
Aquí está el comando netstat que ejecuto durante la prueba:
# netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c
11651 tcp 0 0 localhost:www TIME_WAIT -
1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab
fuente
Realmente desea ver lo que el sistema de archivos / proc tiene para ofrecerle a este respecto.
En esa última página, es posible que le interese lo siguiente:
fuente
No creo que haya un sintonizable para configurarlo directamente. Esto cae dentro de la categoría de ajuste TCP / IP. Para descubrir lo que puede sintonizar, pruebe 'man 7 tcp'. El sysctl ('man 8 sysctl') se usa para configurarlos. 'sysctl -a | grep tcp 'le mostrará la mayor parte de lo que puede sintonizar, pero no estoy seguro si los mostrará a todos. Además, a menos que esto haya cambiado, los sockets TCP / IP se abren como descriptores de archivos. Entonces, esta y la siguiente sección en ese enlace podrían ser lo que está buscando.
fuente
Intente configurar lo siguiente también estableciendo tcp_fin_timeout. Esto debería cerrar TIME_WAIT más rápido.
fuente
tcp_tw_recycle
que es potencialmente peligroso.tcp_tw_reuse
es más seguro y no veo ninguna razón para usarlos simultáneamente.El stock apache (1) solía venir predefinido para admitir solo 250 conexiones simultáneas; si quería más, había un archivo de encabezado para modificar para permitir más sesiones simultáneas. No sé si esto sigue siendo cierto con Apache 2.
Además, debe agregar una opción para permitir un montón de descriptores de archivos más abiertos para la cuenta que ejecuta Apache, algo que los comentarios anteriores no señalan.
Presta atención a la configuración de tus trabajadores y a qué tipo de tiempos de espera de mantenimiento tienes dentro de Apache, cuántos servidores de repuesto tienes ejecutando a la vez y qué tan rápido se están eliminando estos procesos adicionales.
fuente
Puede reducir el tiempo que pasa en el estado TIME_WAIT (Establecer net.ipv4.tcp_fin_timeout). Puede reemplazar Apache con YAWS o nginx o algo similar.
Las compensaciones de más conexiones generalmente implican el uso de memoria, y si tiene un proceso de bifurcación, muchos procesos secundarios que inundan su CPU.
fuente
El número absoluto de sockets que se pueden abrir en una sola dirección IP es 2 ^ 16 y está definido por TCP / UDP, no por el núcleo.
fuente
La herramienta de evaluación comparativa del servidor Apache HTTP, ab , en la versión 2.4 tiene la opción -s timeout . Consulte también error ab (Apache Bench): apr_poll: el tiempo de espera especificado ha expirado (70007) en Windows .
Esta opción resuelve tu problema.
fuente