¿Cómo puedo limitar el ancho de banda utilizado por un proceso?

¿Cómo puedo limitar el ancho de banda utilizado por un proceso?

Tengo un servidor CentOS 5.7 que realizará una copia de seguridad de sus archivos todas las noches. Me preocupa que los visitantes de los distintos sitios alojados en el servidor experimenten un rendimiento degradado mientras la copia de seguridad se transfiere a través de la red.

¿Es posible limitar el rendimiento máximo permitido de un proceso a una interfaz de red? Me gustaría limitar la transferencia de archivos basada en SSH a solo la mitad de mi ancho de banda disponible. Esto podría ser en el lado del servidor o del cliente; es decir, estaré encantado de hacer esto en el cliente que inicia la conexión o en el servidor que la recibe.

(Desafortunadamente, no puedo agregar una interfaz para dedicarla a las copias de seguridad. Podría aumentar mi rendimiento disponible, pero eso simplemente significaría que la transferencia de red se completaría más rápido, pero aún así maximizaría la capacidad total de la conexión mientras lo hago).


Algunos antecedentes

Quizás sea necesario contar con algunos antecedentes. Volviendo atrás, tuve el problema de no tener suficiente espacio local para crear la copia de seguridad. ¡Ingrese a SSHFS! La copia de seguridad se guarda en lo que aparentemente es una unidad local para que nunca haya bits de copia de seguridad en el servidor web.

¿Por qué es eso importante? Porque eso parecería invalidar el uso del venerable rsync --bwlimit. rsyncen realidad no está haciendo la transferencia nipoderporque ni siquiera tengo espacio para guardar el archivo de copia de seguridad.

Puedo oírte preguntar: "Espera, ¿por qué necesitas crear un archivo de copia de seguridad? ¿Por qué no sólo rsynclos archivos y carpetas de origen?" ¡Porque hay una cosa molesta llamada "Plesk" en la mezcla! Este es mi servidor web orientado al cliente que utiliza Plesk por conveniencia. Como tal, uso Plesk para iniciar las copias de seguridad porque Plesk agrega todo tipo de magia adicional a la copia de seguridad que hace que consumirla durante un procedimiento de restauración sea muy seguro.

cara triste

Respuesta1

Una opción que acabo de descubrir es usartrickle.

tricklees un modelador de ancho de banda de espacio de usuario liviano y portátil. Puede ejecutarse en modo colaborativo (junto con trickled) o en modo autónomo.

trickleFunciona aprovechando la precarga del cargador Unix. Básicamente, proporciona a la aplicación una nueva versión de la funcionalidad necesaria para enviar y recibir datos a través de sockets. Luego limita el tráfico basándose en el retraso del envío y la recepción de datos a través de un socket. tricklese ejecuta completamente en el espacio de usuario y no requiere privilegios de root.

Para usuarios de Ubuntu, instálelo ejecutando

sudo apt install trickle

Y como ejemplo, ejecútelo maven buildlimitándolo a una velocidad de descarga de 20 kB/s y 111 kB/s para carga:

trickle -sd 20 -u 111 mvn build

Respuesta2

Puede usarlo iptablespara marcar un paquete (--pid-owner...) y luego usarlo tcpara dar forma al tráfico. También se puede utilizar "--sid-owner" para incluir subprocesos e hijos de ese proceso.

http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH

Fósforo --pid-propietario
Núcleo2.3, 2.4, 2.5 y 2.6
Ejemplo iptables -A SALIDA -m propietario --pid-propietario 78
Explicación Esta coincidencia se utiliza para hacer coincidir paquetes según el ID de proceso (PID) responsable de ellos. Esta coincidencia es un poco más difícil de usar, pero un ejemplo sería permitir que el PID 94 envíe paquetes desde el puerto HTTP (si el proceso HTTP no tiene subprocesos, por supuesto). Alternativamente, podríamos escribir un pequeño script que tome el PID de una salida ps para un demonio específico y luego agregue una regla para él. Por ejemplo, podría tener una regla como la que se muestra en el ejemplo Pid-owner.txt.

Respuesta3

Si puede escribir en una tubería (o salida estándar), puede instalar el pvcomando (visor de tuberías). Fue escrito originalmente para mostrar el progreso de los datos transferidos a través de una tubería.

tar cvf - /files/to/backup | pv -L 512k > /your/file/on/sshfs

   -L RATE, --rate-limit RATE
          Limit the transfer to a maximum of RATE  bytes  per  second.   A
          suffix of "k", "m", "g", or "t" can be added to denote kilobytes
          (*1024), megabytes, and so on.

Respuesta4

¿Cómo estás transfiriendo los datos? (rsync sobre ssh? ¿scp? ¿sftp? ¿algo más?)

rsync le permitirá limitar el ancho de banda (consulte la opción --bwlimit=KBPS). rsync -e ssh --bwlimit ..

Alternativamente, puede configurar una qdisc o equivalente para realizar una limitación de velocidad elegante, pero sospecho que en su caso esto sería una exageración. La documentación sobre esto está disponible enEl CÓMO de control de tráfico y enrutamiento avanzado de Linux

información relacionada