Skip to main content

Running Multiple NoETL Workers pool

Quick Start Scripts

Use the provided scripts for easy management:

  • Start three workers at once
./bin/start_multiple_workers.sh
  • Stop workers
./bin/stop_multiple_workers.sh

supports running multiple worker pool instances simultaneously, allowing to distribute workloads across different worker pools optimized for specific tasks (e.g., CPU-intensive vs GPU-intensive workloads).

Overview

Each worker instance pool runs as a separate process with its own unique PID file, enabling independent management and monitoring of different worker pools.

Prerequisites

  • NoETL installed and configured
  • NoETL server running and accessible
  • Environment variables properly configured

Quick Start with Pre-configured Files

A pre-configured environment files and scripts created in the root folder of the project:

Pre-configured Environment Files

The following environment files are ready to use:

  • .env.worker-cpu-01 - CPU worker configuration
  • .env.worker-cpu-02 - Second CPU worker configuration
  • .env.worker-gpu-01 - GPU worker configuration

Quick Start Scripts

Use the provided scripts for easy management:

# Start all three workers at once and prevents duplicates
./bin/start_multiple_workers.sh

# Force restart all workers (stops existing, then starts new)
./bin/start_multiple_workers.sh --force

# Stop all workers
./bin/stop_multiple_workers.sh

### Manual Start (Alternative)

Or start workers individually:

```bash
# Start CPU Worker 01
NOETL_WORKER_POOL_NAME=worker-cpu-01 . .env.worker-cpu-01 && make worker-start

# Start CPU Worker 02
NOETL_WORKER_POOL_NAME=worker-cpu-02 . .env.worker-cpu-02 && make worker-start

# Start GPU Worker 01
NOETL_WORKER_POOL_NAME=worker-gpu-01 . .env.worker-gpu-01 && make worker-start

Using Environment Files

Create separate environment files for each worker:

.env.worker-cpu

NOETL_WORKER_POOL_NAME=worker-cpu-01
NOETL_WORKER_POOL_RUNTIME=cpu
NOETL_DEBUG=true

.env.worker-gpu

NOETL_WORKER_POOL_NAME=worker-gpu-01
NOETL_WORKER_POOL_RUNTIME=gpu
NOETL_DEBUG=true

Then start each worker with its specific environment file:

# Start CPU worker
NOETL_WORKER_POOL_NAME=worker-cpu-01 . .env.worker-cpu && make worker-start

# Start GPU worker
NOETL_WORKER_POOL_NAME=worker-gpu-01 . .env.worker-gpu && make worker-start

Worker Management

Checking Running Workers

Each worker creates a unique PID file in ~/.noetl/:

ls -la ~/.noetl/
# Output:
# -rw-r--r-- 1 user staff 5 Aug 27 11:36 noetl_worker_worker_cpu_01.pid
# -rw-r--r-- 1 user staff 5 Aug 27 11:36 noetl_worker_worker_gpu_01.pid

Stopping Workers

Interactive Stop

To stop workers interactively:

make worker-stop

This will display a menu of running workers:

Stopping NoETL workers...
Running workers:
1. worker_cpu_01 (PID: 75337)
2. worker_gpu_01 (PID: 75819)
Enter the number of the worker to stop:

Select the worker by entering its number.

Direct Stop by Name

To stop a specific worker directly:

noetl worker stop --name worker-cpu-01

Force Stop

To force stop a worker without confirmation:

noetl worker stop --name worker-gpu-01 --force

Worker Configuration

Worker Pool Names

Worker pool names should follow this convention:

  • Use lowercase letters, numbers, and underscores only
  • Avoid hyphens (they are converted to underscores internally)
  • Examples: worker_cpu_01, gpu_worker, batch_processor

Runtime Types

Common runtime types:

  • cpu: For CPU-intensive tasks
  • gpu: For GPU-accelerated tasks
  • qpu: For QPU-processing workloads

Environment Variables

Key environment variables for workers:

VariableDescriptionExample
NOETL_WORKER_POOL_NAMEUnique name for the worker poolworker-cpu-01
NOETL_WORKER_POOL_RUNTIMERuntime type (cpu, gpu, etc.)cpu
NOETL_DEBUGEnable debug loggingtrue
NOETL_HOSTServer API hostlocalhost
NOETL_PORTServer API port8083
NOETL_PLAYBOOK_PATHPath to playbook file./playbooks/my-playbook.yaml

Monitoring Multiple Workers

Process Monitoring

Check running worker processes:

ps aux | grep "noetl worker start" | grep -v grep

Log Files

Each worker creates its own separate log file:

  • CPU Worker 01: logs/worker_worker_cpu_01.log
  • CPU Worker 02: logs/worker_worker_cpu_02.log
  • GPU Worker 01: logs/worker_worker_gpu_01.log

API Monitoring

Workers register themselves with the NoETL server API. You can check worker status via the API:

  • Check all worker pools
curl http://localhost:8083/api/worker/pools
  • Or check via the web interface
open http://localhost:8083/docs

Best Practices

1. Unique Naming

Always use unique worker pool names to avoid conflicts and enable proper management.

2. Resource Allocation

  • CPU workers: Allocate based on available CPU cores
  • GPU workers: Ensure GPU resources are available and properly configured
  • Monitor resource usage to optimize worker distribution

3. Environment Isolation

Use separate environment files for different worker types to maintain configuration isolation.

4. Log Management

Consider implementing log rotation for long-running worker instances.

5. Health Monitoring

Regularly check worker status and restart failed workers as needed.

Duplicate Prevention

The startup script includes built-in duplicate prevention:

Automatic Detection

  • PID File Check: Verifies if worker PID files exist
  • Process Validation: Confirms if processes are actually running
  • Stale Cleanup: Removes PID files for dead processes

Safe Startup Behavior

# Safe start (skips if already running)
./bin/start_multiple_workers.sh

Force Restart

# Force restart (stops existing workers first)
./bin/start_multiple_workers.sh --force

Orphaned Process Cleanup

The script automatically detects and cleans up orphaned worker processes that don't have corresponding PID files.

Troubleshooting

Orphaned Worker Processes

If you have worker processes running without corresponding PID files:

Automatic Cleanup: The startup script automatically detects and cleans up orphaned processes.

Manual Cleanup (if needed):

# The startup script handles this automatically, but if needed manually:
pkill -9 -f "noetl worker start"
rm -f ~/.noetl/noetl_worker_*.pid

Worker Not Responding

  • Use noetl worker stop --name <worker-name> --force to force stop
  • Check system resources and logs for issues

Example Setup

The pre-configured environment files provide a complete setup for three workers: two CPU workers and one GPU worker. Simply use:

  • Quick start all workers
./bin/start_multiple_workers.sh
  • Check running workers
ls ~/.noetl/noetl_worker_*.pid
ps aux | grep "noetl worker" | grep -v grep

Manual Setup (Alternative)

If you prefer to create environment files:

  • Create environment files
cat > .env.worker-cpu-01 << EOF
NOETL_WORKER_POOL_NAME=worker-cpu-01
NOETL_WORKER_POOL_RUNTIME=cpu
NOETL_DEBUG=false
NOETL_HOST=localhost
NOETL_PORT=8083
EOF

cat > .env.worker-cpu-02 << EOF
NOETL_WORKER_POOL_NAME=worker-cpu-02
NOETL_WORKER_POOL_RUNTIME=cpu
NOETL_DEBUG=false
NOETL_HOST=localhost
NOETL_PORT=8083
EOF

cat > .env.worker-gpu-01 << EOF
NOETL_WORKER_POOL_NAME=worker-gpu-01
NOETL_WORKER_POOL_RUNTIME=gpu
NOETL_DEBUG=false
NOETL_HOST=localhost
NOETL_PORT=8083
EOF
  • Start all workers
NOETL_WORKER_POOL_NAME=worker-cpu-01 . .env.worker-cpu-01 && make worker-start
NOETL_WORKER_POOL_NAME=worker-cpu-02 . .env.worker-cpu-02 && make worker-start
NOETL_WORKER_POOL_NAME=worker-gpu-01 . .env.worker-gpu-01 && make worker-start
  • Check running workers
ls ~/.noetl/noetl_worker_*.pid
ps aux | grep "noetl worker" | grep -v grep
  • Check worker-specific log files
ls logs/worker_*.log