Pregunta

Estoy escribiendo una aplicación cliente-servidor usando sockets BSD. Debe ejecutarse en segundo plano, transfiriendo datos continuamente, pero no puede saturar el ancho de banda de la interfaz de red del uso normal. Dependiendo de la velocidad de la interfaz, necesito acelerar esta conexión a una cierta velocidad de transferencia máxima.

¿Cuál es la mejor manera de lograr esto, programáticamente?

¿Fue útil?

Solución

El problema con la suspensión de una cantidad constante de 1 segundo después de cada transferencia es que tendrá un rendimiento de red entrecortado.

Permita que BandwidthMaxThreshold sea el umbral de ancho de banda deseado.

Deje que TransferRate sea la tasa de transferencia actual de la conexión.

Entonces ...

Si detecta su TransferRate > BandwidthMaxThreshold luego haces un SleepTime = 1 + SleepTime * 1.02 (aumenta el tiempo de espera en un 2%)

Antes o después de cada operación de red, haga un Sleep (SleepTime)

Si detecta que su TransferRate es mucho más bajo que su BandwidthMaxThreshold, puede disminuir su SleepTime. Alternativamente, usted podría simplemente decaer / disminuir su SleepTime con el tiempo siempre. Finalmente, su SleepTime llegará a 0 nuevamente.

En lugar de un aumento del 2%, también podría hacer un aumento en una cantidad mayor linealmente de la diferencia entre TransferRate - BandwidthMaxThreshold.

Esta solución es buena, ya que no tendrá tiempo de espera si la red del usuario ya no es tan alta como quisiera.

Otros consejos

La mejor manera sería usar un cubo de token .

Transmita solo cuando tenga suficientes tokens para llenar un paquete (1460 bytes sería una buena cantidad), o si es el lado de recepción, lea desde el socket solo cuando tenga suficientes tokens; un poco de matemática simple le dirá cuánto tiempo tiene que esperar antes de tener suficientes fichas, por lo que puede dormir esa cantidad de tiempo (tenga cuidado de calcular cuántas fichas ganó por la cantidad que realmente en realidad dormido, ya que la mayoría de los sistemas operativos pueden suspender su proceso durante más tiempo del que usted solicitó).

Para controlar el tamaño de las ráfagas, limita la cantidad máxima de tokens que puedes tener; una buena cantidad podría ser un segundo de fichas.

He tenido buena suerte con goteo . Es genial porque puede acelerar aplicaciones arbitrarias de espacio de usuario sin modificaciones. Funciona cargando sus propias funciones de envoltorio de envío / recepción que realizan el cálculo del ancho de banda por usted.

El mayor inconveniente que encontré fue que es difícil coordinar varias aplicaciones con las que deseas compartir un ancho de banda limitado. " goteo " Ayuda, pero lo encontré complicado.

Actualización en 2017: parece que el goteo se movió a https://github.com/mariusae/trickle

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top