¿Limitando el rendimiento de la red de un proceso ya iniciado? (Linux / FreeBSD)

10

¿Existe alguna utilidad para limitar el rendimiento de la red de un proceso después de que se haya lanzado? Ejemplo simple: observa que un usuario toma todo su ancho de banda de carga usando scp y desea limitar la velocidad o disminuir la prioridad de la transferencia.

Supongo que podría usar una combinación de iptables / tc o pf para lograr eso, pero me preguntaba si hay una herramienta de "disparo único" disponible (como goteo con una opción --pid ^^)?

jbdenis
fuente
¿Quiso decir "goteo"?
Halp
Editar: Supuse que "goteo" estaba destinado.
Steven Monday

Respuestas:

3

Lamentablemente, no existe una solución para FreeBSD. Hay muchas soluciones como dummynet / ipfw o altq / pf que se utilizan para limitar el uso de la red en función de diferentes patrones pero no en pids.

En Linux hay una forma de limitar el uso de la red por usuario:

iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner test -j MARK --set-mark 1

Creo que no hay una solución para limitar la utilización de la red basada en pid.

Istvan
fuente
2
Ipfw de FreeBSD también puede coincidir con el tráfico por UID
gelraen
0

En Linux, incluso la combinación de iptables y tc podría ser un problema difícil, ya que la opción "--pid-owner" fue abandonada del módulo iptables "propietario" (vea la nota debajo de la tabla aquí ). De hecho, solo esta asociación (paquete - proceso) parece ser complicada, mientras que podemos hacer el resto fácilmente, es decir, filtrar y limitar los paquetes de manera bastante eficiente.

pitr
fuente
0

No creo que haya una solución preparada para esto. Pero, usando herramientas estándar de Linux, puedes hackear un script que hará el trabajo.

Primero, puede obtener una lista de todas las conexiones de procesos específicos con lsof. Luego, puede crear políticas de ingreso con tc para esas conexiones.

thor
fuente
0

Crudamente, si reduce el proceso a +20, entonces cualquier otra cosa que se ejecute en el sistema tendrá prioridad y el trabajo se programará con menos frecuencia, por lo que será más difícil llenar los búferes o paquetes de proceso, lo que debería conducir a algún TCP estrangulamiento Será esporádico, pero podría ayudar lo suficiente.

# renice 20 -p $pid
Phil P
fuente
1
Esta es una forma muy indirecta de tratar de controlar el ancho de banda y realmente solo funcionará si el sistema está muy cargado: en un sistema inactivo, incluso un proceso reenviado a -20 seguirá en la CPU tantas veces como lo desee.
voretaq7
Correcto, pero si esto no es ancho de banda compartido con otras computadoras locales, entonces si la máquina está inactiva, en general no le importa si este proceso obtiene todo el ancho de banda. Solo es importante cuando hay otro proceso que intenta usar el ancho de banda. Es posible que tengamos diferentes definiciones de "carga muy pesada": si hay otro proceso que intenta ejecutarse, tiene prioridad y, por lo tanto, si el promedio de carga es> = 1 por núcleo, esto puede ayudar. Noté que es tosco, pero si es la única herramienta disponible (FreeBSD), al menos vale la pena intentarlo.
Phil P