xticks barplot python celery celeryd

python - barplot - Comprender la precarga de tareas de apio



pandas plot (4)

  1. La captura previa puede mejorar el rendimiento. Los trabajadores no necesitan esperar el próximo mensaje de un intermediario para procesar. Comunicarse con un intermediario una vez y procesar una gran cantidad de mensajes le da un aumento en el rendimiento. Recibir un mensaje de un intermediario (incluso de uno local) es costoso en comparación con el acceso a la memoria local. Los trabajadores también pueden acusar mensajes en lotes

  2. Prefetching puesto a cero significa "sin límite específico" en lugar de ilimitado

  3. El ajuste de la captación previa a 1 está documentado para ser equivalente a apagarlo, pero puede no ser siempre el caso (consulte https://stackoverflow.com/a/33357180/71522 ).

  4. La captura previa permite enviar mensajes en lotes. CELERY_ACKS_LATE = True impide el reconocimiento de mensajes cuando llegan a un trabajador

Acabo de CELERYD_PREFETCH_MULTIPLIER opción de configuración CELERYD_PREFETCH_MULTIPLIER ( docs ). El valor predeterminado es 4, pero (creo) quiero que la recuperación previa sea tan baja como sea posible. Lo configuré en 1 ahora, que está lo suficientemente cerca de lo que estoy buscando, pero todavía hay algunas cosas que no entiendo:

  1. ¿Por qué esta captación previa es una buena idea? Realmente no veo una razón para ello, a menos que haya mucha latencia entre la cola de mensajes y los trabajadores (en mi caso, actualmente se están ejecutando en el mismo host y en el peor de los casos podrían ejecutarse en diferentes hosts en los mismos datos) centrar). La documentación solo menciona las desventajas, pero no explica cuáles son las ventajas.

  2. Mucha gente parece configurar esto a 0, esperando poder desactivar la captación previa de esa manera (una suposición razonable en mi opinión). Sin embargo, 0 significa captación previa ilimitada. ¿Por qué alguien querría una captación previa ilimitada, no elimina por completo la concurrencia / asincronicidad para la que introdujo una cola de tareas en primer lugar?

  3. ¿Por qué no se puede desactivar la captación previa? Puede que no sea una buena idea que el rendimiento lo apague en la mayoría de los casos, pero ¿hay alguna razón técnica para que esto no sea posible? ¿O simplemente no está implementado?

  4. A veces, esta opción está conectada a CELERY_ACKS_LATE . Por ejemplo. Roger Hu escribe «[...] a menudo lo que [los usuarios] realmente quieren es que un trabajador solo reserve tantas tareas como procesos secundarios. Pero esto no es posible sin habilitar los reconocimientos tardíos [...] »No entiendo cómo se conectan estas dos opciones y por qué una no es posible sin la otra. Otra mención de la conexión se puede encontrar here . ¿Alguien puede explicar por qué las dos opciones están conectadas?


No puedo comentar las respuestas de David Wolever, ya que mi stackcred no es lo suficientemente alto. Por lo tanto, he enmarcado mi comentario como una respuesta ya que me gustaría compartir mi experiencia con Apio 3.1.18 y un intermediario de Mongodb. Logré dejar de captar previamente con lo siguiente:

  1. agregue CELERYD_PREFETCH_MULTIPLIER = 1 a la configuración de apio
  2. agregue CELERY_ACKS_LATE = True a la configuración de apio
  3. Inicie el trabajador de apio con opciones: --concurrency=1 -Ofair

Dejando CELERY_ACKS_LATE al valor predeterminado, el trabajador aún realiza una búsqueda previa. Al igual que el OP, no entiendo completamente el vínculo entre la captación previa y los acks tardíos. Entiendo lo que David dice "CELERY_ACKS_LATE = Verdadero impide reconocer los mensajes cuando llegan a un trabajador", pero no entiendo por qué los atrasos tarde serían incompatibles con la captación previa. En teoría, una búsqueda previa aún permitiría ackear el derecho tardío, incluso si no está codificado como tal en el apio.


Pregunta anterior, pero aún agrego mi respuesta en caso de que ayude a alguien. Mi comprensión de algunas pruebas iniciales fue la misma que en la respuesta de David Wolever. Acabo de probar esto más en apio 3.1.19 y -Ofair funciona. Solo que no está destinado a deshabilitar la captación previa en el nivel del nodo trabajador. Eso continuará sucediendo. El uso de -Ofair tiene un efecto diferente que se encuentra en el nivel del trabajador de la agrupación. En resumen, para deshabilitar la captación previa por completo, haz esto:

  1. Establecer CELERYD_PREFETCH_MULTIPLIER = 1
  2. Establecer CELERY_ACKS_LATE = True a nivel global o nivel de tarea
  3. Uso -Ofair al iniciar los trabajadores
  4. Si establece la concurrencia en 1, entonces el paso 3 no es necesario. Si desea una mayor concurrencia, entonces el paso 3 es esencial para evitar que las tareas se respalden en un nodo que podría ejecutar tareas de ejecución prolongada.

Agregando algunos más detalles:

Descubrí que el nodo trabajador siempre realizará la captación previa de manera predeterminada. Solo puede controlar la cantidad de tareas que realiza la precarga utilizando CELERYD_PREFETCH_MULTIPLIER . Si se establece en 1, solo captará previamente tantas tareas como la cantidad de trabajadores de la agrupación (concurrencia) en el nodo. Por lo tanto, si tiene concurrencia = n, las tareas máximas que el nodo precargó serán n.

Sin la opción -Ofair , lo que sucedió para mí fue que si uno de los procesos del grupo de trabajo estaba ejecutando una tarea de larga ejecución, los otros trabajadores en el nodo también dejarían de procesar las tareas que el nodo ya había captado previamente. Al usar -Ofair , eso cambió. A pesar de que uno de los trabajadores en el nodo estaba ejecutando tareas de larga ejecución, otros no detendrían el procesamiento y continuarían procesando las tareas que el nodo había captado previamente. Entonces veo dos niveles de captación previa. Uno en el nivel del nodo trabajador. El otro a nivel de trabajador individual. Usar -Ofair para mí pareció deshabilitarlo a nivel de trabajador.

¿Cómo se relaciona ACKS_LATE ? ACKS_LATE = True significa que la tarea se reconocerá solo cuando la tarea tenga éxito. Si no, supongo que sucedería cuando lo reciba un trabajador. En el caso de la captación previa, la tarea la recibe primero el trabajador (confirmada por los registros) pero se ejecutará más tarde . Me acabo de dar cuenta de que los mensajes captados previamente se muestran en "mensajes no reconocidos" en rabbitmq. Así que no estoy seguro de si configurarlo en True es absolutamente necesario. De todos modos, teníamos nuestras tareas establecidas de esa manera (tarde ack) por otras razones.


Solo una advertencia: a partir de mis pruebas con el corredor de redis + Apio 3.1.15, todos los consejos que he leído relativos a CELERYD_PREFETCH_MULTIPLIER = 1 deshabilitar la CELERYD_PREFETCH_MULTIPLIER = 1 es demostrablemente falso.

Para demostrar esto:

  1. Establecer CELERYD_PREFETCH_MULTIPLIER = 1
  2. Ponga en cola hasta 5 tareas que tomarán cada unos segundos (por ejemplo, time.sleep(5) )
  3. Comience a ver la longitud de la cola de tareas en Redis: watch redis-cli -c llen default

  4. Comience celery worker -c 1

  5. Observe que la longitud de la cola en Redis caerá inmediatamente de 5 a 3

CELERYD_PREFETCH_MULTIPLIER = 1 no impide la CELERYD_PREFETCH_MULTIPLIER = 1 , simplemente limita la CELERYD_PREFETCH_MULTIPLIER = 1 a 1 tarea por cola.

-Ofair , a pesar de lo que dice la documentación , tampoco impide la -Ofair .

A menos que modifique el código fuente, no he encontrado ningún método para deshabilitar por completo la captación previa.