Linux-Fu: Universo paralelo

Érase una vez, simplemente te faltaba poder de procesamiento. Es cierto que ese punto se está alejando cada vez más, pero aún puede llegar allí. Si se queda sin tiempo de CPU, la respuesta podría ser agregar más CPU. Sin embargo, a veces hay otros problemas como la memoria o el espacio en disco. Sin embargo, probablemente también tenga acceso a varias computadoras. ¿Quién no tiene Raspberry Pis en su red? ¿O quizás un servidor en el sótano? O incluso algunos servidores remotos "en la nube". GNU Parallel es una herramienta que le permite distribuir el trabajo en múltiples tareas o localmente en máquinas remotas. En cierto modo, es simple porque parece xargs pero con ejecución paralela. Por otro lado, tiene una gran cantidad de opciones y configuraciones que pueden hacer que su uso sea un poco aterrador.

Sobre xargs

Si no usa xargs, es un programa muy simple que te permite hacer algo con una lista de archivos. Por ejemplo, supongamos que queremos buscar en todos los archivos fuente de C la cadena "la-tecnologia" de grep. Podrías escribir:

encontrar. -nombre '*.[ch]'| xargs grep -i la-tecnologia

Aquí, xargs toma una línea de entrada, llama grep y después grep completar, repita el proceso hasta que se agoten las líneas de entrada. (Nota: tratar archivos con espacios es un poco difícil. Usar -d ' n' puede ayudar, aunque no todas las versiones de xarg lo admiten).

En el caso más simple, Parallel hace lo mismo, pero se puede ejecutar grep - o lo que sea que use - varias veces a la vez. En una máquina local, esto le permite utilizar varias CPU para mejorar el tiempo de actividad. Sin embargo, también puede repartir el trabajo entre diferentes máquinas sin palabras. ssh inicios de sesión.

Demostraciones

El autor de GNU Parallel tiene una demostración en video de varias partes del sistema. Puedes ver la primera parte a continuación. El tutorial también es muy bueno y explica algunos detalles que pueden no ser evidentes en la página de la mano.

Solo para mi propia diversión, tomé un directorio con algunos excelentes mp4 archivos en él y usó ambos xargs y parallel Alabama gzip cada archivo. Sé que sé. Los archivos ya están comprimidos, por lo que gzip no hará mucho. Pero solo quería una gran tarea a tiempo. Aquí están los resultados:

[:~/Videos/movies] $ time find *.mp4 | xargs -d 'n' gzip

real    6m10.796s
user    2m52.828s
sys     0m9.718s
[:~/Videos/movies] $ time find *.mp4 | parallel --jobs 8  -d 'n' gzip

real    5m25.050s
user    2m56.676s
sys     0m7.732s

Es cierto que esto no fue muy científico, y ahorrar unos 45 segundos no es una gran ganancia, pero no obstante. Elegí ocho trabajos porque tengo un procesador de ocho núcleos. Puede variar esta configuración dependiendo de lo que haga en ese momento.

Lejos

Si desea utilizar computadoras remotas para procesar datos, debe tener una sin contraseña ssh acceso remoto a la otra computadora (o computadoras). Por supuesto, la computadora remota probablemente no tendrá los mismos archivos y recursos, por lo que tiene sentido que, de forma predeterminada, sus comandos solo funcionen en el servidor remoto. Puede proporcionar una lista de servidores separados por comas, y si usa el nombre de servidor ":" (sólo dos puntos), incluirá su máquina local para manejar los trabajos.

Esto podría ser muy útil si tiene una computadora un poco insuficientemente poderosa que necesita ayuda para hacer algo. Por ejemplo, podríamos imaginar una impresora Raspberry Pi basada en 3D pidiendo a un host remoto que corte varios modelos en paralelo. Incluso si cree que no tiene una computadora para levantar peso, Parallel puede hacer cosas como procesar archivos de tar archivo porque se descomprimen sin esperar a los archivos restantes. Se puede distribuir grepfunciona a través de sus CPU o núcleos.

Honestamente, se necesita mucho para explicar cada característica en detalle, pero espero que esto le haya animado a leer más sobre GNU Parallel. Entre los videos y el tutorial, debe tener una buena idea de algunas cosas que podría hacer con esta poderosa herramienta.

  • RW versión 0.0.3 dice:

    Interesante. Podría encontrar usos para eso. Creo que podría aligerar más mi TV OTA progresiva, cambiarlo a un núcleo dual de menor potencia, luego guardarlo para compartir un disco y durante la noche iluminar una caja cuadrada para ayudar a transcodificar y convertir, y ponerlo a dormir. de nuevo. Siempre que WOL sea una opción aquí.

  • Duckula dice:

    Esta noche abriré frío y beberé el recuerdo de OpenMosix o como lo llamaran en su última iteración antes de que el desarrollo cerrara por última vez.

    • Feinfinger dice:

      Mosix fue agradable.
      🙁 ... para el "era".

      • Ren dice:

        ¿No pasamos por todo ese asunto de "Mosi (x) ayer"?

    • Geoffrey dice:

      Y Kerrighed. Y OpenSSI.

  • PaulD dice:

    `xargs` también tiene una bandera paralela ... funciona en el mismo sistema (no en todos los sistemas) pero puede utilizar eficazmente todos sus núcleos. use los indicadores `-P` y` -n` juntos, pruébelo ...

    • paleogismo dice:

      Normalmente uso xargs -P en paralelo porque xargs se instala de forma predeterminada en la mayoría de los sistemas * nix, que no es el caso de los sistemas paralelos

  • CityZen dice:

    Como alternativa a:
    $ encontrar. -nombre '*.[ch]'| xargs grep -i la-tecnologia
    solo hay un comando:
    $ grep -i la-tecnologia -r. –Incluir = '*.[ch]'

  • CM dice:

    Uhh, los xargs incluyen un indicador -P # para ejecutar varios procesos a la vez. Por favor, lea las páginas del manual de las herramientas que utiliza antes de escribir un blog al respecto.

    • John dice:

      ¿Y nos niegas tus comentarios de miedo?

  • kc8rwr dice:

    Entonces, supongo que la mayoría de los ejemplos, si se ejecutan en varias máquinas, ¿suponen que todas las máquinas tienen el mismo sistema de archivos montado? ¿Es correcto o realmente transmite el contenido de los archivos en los que está operando?

    • jbucky1092 dice:

      Según el video, transfiere los archivos. También hay una bandera explícita para eliminar los archivos entregados, por lo que podría dejar los archivos por algún motivo

  • Jonathan Bennett dice:

    Aquí ... Ese es un comando realmente interesante.

  • jcwren dice:

    Incluso notas para Debian Buster y Raspian Buster. Si tiene instalado el paquete 'moreutils', pero no el paquete 'paralelo', aún tendrá un comando 'paralelo'. Esto no tiene la opción '-version', así que no tengo idea de su antigüedad, pero ciertamente no es lo mismo que el comando GNU Parallel, y admite un total de 4 opciones.

    Grep tiene algunas inteligencias de modo que si se pasan varios nombres de archivo a la línea de comando, imprimirá el nombre del archivo junto con la línea correspondiente, y si solo se pasa un nombre, no lo es. grep puede ser forzado a imprimir siempre nombres de archivo con la opción '-with-filename' (-H), o nunca a imprimir nombres con la opción '-no-filename' (-h).

    Tener un trabajo paralelo además de "buscar. -nombre *.[ch] | xargs grep -s main`, use 'buscar. -nombre *.[ch] | paralelo grep -s -H main '(ignoro el hecho de que grep admite la opción -P, como se mencionó anteriormente).

    Sea lo que sea, en una Raspberry Pi 3, los comandos superiores tomaron 1.137s con "paralelo" (especificando la opción "-j 4") y 0.043s con "xargs", buscando 47 archivos con un tamaño combinado de 746K. Estos tiempos fueron extremadamente repetibles, con una variación de +/- 0.020 segundos para la versión "paralela". No tengo idea de por qué es mucho más lento.

  • Dibujos dice:

    Tengo un programa de Python que hace cálculos de engranajes astronómicos, escrito para múltiples ruedas y trenes de piñón y entradas de conteo de dientes variables, pero a veces lleva días funcionar dependiendo de cómo tenga configuradas las entradas.

    De acuerdo, una variante de C probablemente sería un lenguaje de acceso más rápido por computadora, pero fue un ejercicio de aprendizaje en Python, y la base creada para mí por un amigo. Ahora que tengo un i7 9650 de varios núcleos, en comparación con un antiguo chip Pentium M de 2,3 gz de un solo núcleo alrededor de 2005, estoy seguro de que se ejecutará más rápido, pero primero tendré que sacar la aplicación del almacenamiento y reiniciar .

    Pasar de 8 combinaciones de entrada tomaría una semana para encenderse; me gustaría escalarlo más alto, tal vez hasta 16 entradas. Esto definitivamente será mucho más tarde.

    Entonces, ¿podría este comando separar las entradas y procesarlas simultáneamente a través de todos mis núcleos para realmente terminarlo antes de que el universo muera por una muerte en caliente?

    • tym0tym dice:

      Interesante. Si ya lo tiene escrito en Python y empaquetado, no debería ser difícil (en principio) paralelizar el trabajo para varias combinaciones de entrada usando el multiprocesamiento nativo de Python en una máquina y Spark para múltiples trabajadores en la red (o solo uno también) ).

      • Dibujos dice:

        Entendí incluso en el momento de nacer que Python se usaba como tutorial para mi interés en Python en ese momento, pero se admitió que otro lenguaje probablemente era más efectivo en la sintaxis de computadora pura.

        Aprendería a codificar desde cero solo para escribir esto en el mejor lenguaje (un usuario de linux simple de 15 años), pero en realidad no soy un programador.

        He estado pensando en convertirme en un grupo de supercomputadoras de una universidad local, pero me gustaría ver primero qué es posible acerca de la optimización estándar para una computadora normal.

    • Joel dice:

      Eche un vistazo a Julia si está interesado en el rendimiento, ya que incluye una sintaxis legible por humanos MatLab / Octave / R. Sin embargo, Julia también a menudo simplifica las tareas de escala y tiene soluciones locales como envoltorios CUDA.

      Por lo general, no estoy tan interesado en los lenguajes modernos, pero este es fundamentalmente diferente, ya que a menudo supera a la mayoría de las rutinas de escritura C / C ++ y muchas bibliotecas centrales como NumPy en muchas tareas.

      https://julialang.org/learning/

      😉

      • Dibujos dice:

        No siendo un programador, pero bilingüe en japonés gradualmente, puedo apreciar el poder de una buena sintaxis.

        Parece un lenguaje interesante, podría intentar reescribirlo, porque me gustaría expandir las entradas a unos 16 engranajes aproximadamente.

        El programa tenía como objetivo producir una precisión extremadamente precisa (más de 10 dígitos si es posible) en relaciones de velocidad anormales para crear objetos astronómicos de alta precisión. Computadoramente fue lento como una pitón, pero mi amigo básicamente escribió muy bien la base y agregué y aprendí python.

        Si pudiera utilizar este lenguaje, u otro puramente optimizado para la computación matemática, y el procesamiento paralelo al mismo tiempo, trabajaría para que esté disponible gratuitamente para todos los horólogos.

    • RW versión 0.0.1 dice:

      ¿Es una iteración de fuerza bruta o utiliza un algoritmo de factorización?

      • Dibujos dice:

        Fuerza bruta hasta donde puedo describir. No es un experto en codificación, por lo que puede estar equivocado. Básicamente toma las entradas como un rango, asignado por un usuario, en el extremo superior e inferior para el recuento de dientes (lo limité a 5 dientes mínimos y 360 superiores, aunque se podrían hacer 3 dientes, y más de 360 ​​dientes es factible pero impráctico), y le dio a esto que la entrada se llama rueda y piñón, y superpuso la lógica para los cálculos de relación como si fueran 1 rueda y piñón para un eje, con un bolsillo para 1 rueda y un paso en ambos extremos por sí mismo, por lo que solo la fuerza bruta lanza cada combinación de números para obtener una proporción de entrada deseada.

        Se optimizó aún más mediante la supervisión creativa de combinaciones similares, y los resultados se obtuvieron con el resultado y la desviación de un número de relación de entrada deseado para calcular manualmente los errores de rotación debido a un error proporcional en tiempos determinados, generalmente durante siglos.

        La idea era escalar hasta 10,000 años eventualmente porque quería hacer modelos de precisión teóricos para una precisión de largo período (lo cual es imposible con velocidades lineales, debido a la deriva cósmica y otros factores, pero trabajé en una dentición correcta no lineal para solucionar eso eventualmente también)

        Quería poner todo a disposición de todos gratuitamente, como un programa maestro para ayudar a otros horólogos.

        • RW versión 0.0.3 dice:

          Entiendo, no estoy muy informado al respecto, pero mi instinto dice que podrías buscar otros métodos para obtener una buena velocidad, un ejemplo de lo que hay por ahí ...
          https://stackoverflow.com/questions/6800193/what-is-the-most-efficient-way-of-finding-all-the-factors-of-a-number-in-python

          Porque si lo entiendo correctamente, lo que está haciendo es tomar un número grande, el informe final que desea, y tratar de separarlo en relaciones más pequeñas que se multipliquen, por lo que hay factores del número mayor.

          • Dibujos dice:

            El libro de Brian Hayes "Teoría de grupos en el dormitorio" discutió el tema perfectamente en contextos históricos en relación con un capítulo que explica la creación de las tablas Brocot para la factorización de engranajes y cómo era esencialmente un problema de factorización especial para ser resuelto por relojeros astronómicos.

            Me lo dieron cuando ya estaba tratando de proyectar algunas cosas, y también encontré mi propia copia de "Geared To The Stars" de Henry C. King. Hice algunas tablas Brocot a mano, luego las programé rápidamente para resolver mi problema de nicho.

            Tiene razón: sé desde el principio que básicamente se trata de una optimización de factores especiales, utilizando un conjunto de herramientas para mostrar una respuesta.

          • Dibujos dice:

            Para la memoria, probé específicamente una relación de 1 a 1,002737909350795.

            Para el año 2000 Conversión de Solar a Sideral.

  • Tux2000 dice:

    Tanto find como xargs admiten el argumento -0 (guión cero) y debe usarlo en ambos comandos. find ... -0 imprime nombres de archivo separados por ASCII NUL en lugar de saltos de línea, y xargs -0 lee nombres de archivo separados por ASCII NUL en lugar de saltos de línea. ¿Por qué? Simplemente porque los saltos de línea son una parte legal de un nombre de archivo, pero ASCII NUL no lo es. El uso de -0 no confundirá las cargas al encontrar nombres de archivos impresos con saltos de línea y otras sorpresas desagradables.

  • Comedias dice:

    Bastante interesante. Como necesita tener 16 subprocesos, ¿puede ejecutarlo con quizás 14 para ver si es diferente?

  • tekkieneet dice:

    > ¿Quién no tiene Raspberry Pis en su red?

    Yo no. Aprenda del centro de datos: Consolide el hardware y coloque los sistemas en vm. El dinero para algunos Pi se gastaría más sabiamente para obtener un tipo de procesadores Ryzen más alto. Deje un tratamiento de 8 bits con E / S en tiempo real
    Ryzen 3700X de 8 núcleos cuesta aproximadamente $ 273/8 = ~ $ 35 por núcleo

    • sale de dice:

      No hay lugar para absolutos en la-tecnologia.com, me temo. Si bien la mayor parte de mi infraestructura personal está en máquinas virtuales, tengo muchos RPis en mi red para algunas tareas que no quiero molestar con el paso a través de USB u otra basura (medios, cable, etc.) para iniciar el rack del servidor.

    • RW versión 0.0.3 dice:

      Seré "ese tipo" y señalaré que todavía te faltan $ 300 por un sistema mínimo. Por lo que creo, Pis está sobrecargado por aquellos para quienes es su primera vez en el entretenimiento ligero de Linux en lugar del espectacular hardware.

    • John dice:

      Raspberry pi de $ 35 tiene 4 núcleos. eso es un núcleo de $ 8 (RAM incluida). Todavía pierdes el punto del pi. Son mucho más pequeños y no requieren tanta inversión inicial.

      • RW versión 0.0.1 dice:

        Aproximadamente 1500Mhz de uno (Post P4) x86 core = 1 pi total aunque en el rendimiento de la computadora. 8 3700 núcleos al máximo turbo = 96 pi núcleos.

    • Hooptie J dice:

      También obtienes lo que pagas allí ...

      Ya tengo un montón de hardware muerto en una tienda superior a las 3 generaciones de hardware Intel combinadas ...

      no me malinterpretes, me encantan las cosas de AMD a bajo precio ... pero algún tipo de trabajo pesado, lo gastarás en hardware de reemplazo.

      es rápido y barato, eligieron sus dos.

      pierde un Pi en un clúster, tiene $ 40 y todo sigue funcionando.

      pierde su servidor Ryzen Vm, se cae y sale un poco más.

  • Un hombre viejo dice:

    Encuentro que usar grep suele ser suficiente cuando quiero usar grep.

  • Allan-H dice:

    > Nota: tratar archivos con espacios es un poco complicado.

    La opción -print0 en find y la opción -0 en xargs están pensadas para manejar esto usando cadenas terminadas en cero.

    • Cory Albrecht dice:

      Vine aquí para decir eso. Un Linux-fu es débil si no lo sabes.

      • Elliot Williams dice:

        Meh. Solo estoy eliminando todos los espacios de nombre de archivo. 🙂

  • Alan dice:

    Recuerdo el antiguo programa de seguimiento de radio PovRay. Ray rastrea cada píxel por un "cuadro", uno por uno.
    Debido a que la escena se basó en una descripción de archivo, puede visualizar videos en varias máquinas. Pero (de mi memoria polvorienta) también podría dividir un fotograma en varios núcleos.

    Hoy en día, los gráficos suelen ser manejados por una GPU, pero el principio aún debería permanecer.

  • Dmpalmer dice:

    Un poco más de Linux-fu: la mayoría de las versiones actuales de xargs tienen la opción -P para ejecutar múltiples procesos en paralelo.

    Incluso puede recortar el número de trabajos hacia arriba y hacia abajo mientras funciona (enviando señales al pid xargs con kill).

    Consulta las páginas de información o humanos

    https://www.gnu.org/software/findutils/manual/html_node/find_html/Controlling-Parallelism.html

Ricardo Vicente
Ricardo Vicente

Deja una respuesta

Tu dirección de correo electrónico no será publicada.