Bài 16. Bash Nâng Cao: Parallel Execution trong DevOps Hiệu Quả

Bash Nâng Cao – Parallel Execution trong DevOps

Khi script Bash của bạn phải xử lý nhiều task – như kiểm tra 50 server hoặc build 20 container – chạy tuần tự (sequential) có thể mất hàng giờ. Parallel Execution trong Bash DevOps giúp bạn chạy song song Bash, tối ưu Bash, và biến script thành multi-thread Bash để hoàn thành nhanh hơn. Trong bài thứ mười sáu của series Bash Script Chuyên Sâu cho DevOps, tôi sẽ dẫn bạn qua cách dùng Bash để chạy song song, kèm thực hành thực tế. Đây là mẹo tôi học được khi tối ưu pipeline và hệ thống, không chỉ là lý thuyết đâu nhé!

Parallel Execution Là Gì?

Chạy Song Song trong Bash

Parallel execution là chạy nhiều task cùng lúc thay vì chờ từng task hoàn thành:

  • Tuần tự: Kiểm tra server1 → server2 → server3.
  • Song song: Kiểm tra server1, server2, server3 cùng lúc.

Ví dụ: Script SSH kiểm tra 10 server mất 50 giây tuần tự, nhưng chỉ 5 giây khi song song.

Lợi Ích trong DevOps

  • Tốc độ: Giảm thời gian xử lý task lớn.
  • Hiệu quả: Tận dụng tài nguyên server/runner.
  • Pipeline: Tăng tốc build/test/deploy.

Thực tế: Tôi từng tối ưu script kiểm tra 30 container từ 2 phút xuống 10 giây nhờ parallel – tiết kiệm cả đống thời gian trong CI.

Công Cụ Parallel trong Bash

Background Jobs (&)

Chạy lệnh nền với &:

sleep 5 & sleep 3 & sleep 1 &
  • Cả 3 lệnh chạy cùng lúc, hoàn thành sau 5 giây (thay vì 9 giây tuần tự).

Wait Command

Đợi tất cả job nền hoàn thành:

sleep 5 & sleep 3 &
wait
echo "Tất cả xong"

Xargs với -P

Chạy lệnh song song trên danh sách:

echo "server1 server2 server3" | xargs -n 1 -P 3 ssh user@{} "df -h"
  • -n 1: Một đối số mỗi lần.
  • -P 3: Tối đa 3 process song song.

GNU Parallel

Công cụ mạnh hơn (cần cài):

parallel -j 3 ssh user@{} "df -h" ::: server1 server2 server3
  • -j 3: 3 job cùng lúc.

Thực Hành: Script Kiểm Tra Multi-Server Song Song

Script Parallel

Tạo parallel_check.sh:

#!/bin/bash

set -e
trap 'echo "Lỗi tại dòng $LINENO: $BASH_COMMAND" >&2; exit 1' ERR

# Biến
SERVERS=("user@server1" "user@server2" "user@server3")  # Thay bằng server thật
LOG_FILE="/var/log/parallel_check.log"
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
MAX_JOBS=3

# Hàm ghi log (thread-safe)
log() {
    echo "[$TIMESTAMP] $1" >> "$LOG_FILE.lock" 2>/dev/null
    mv "$LOG_FILE.lock" "$LOG_FILE"  # Đảm bảo atomic write
}

# Hàm kiểm tra server
check_server() {
    local SERVER=$1
    local DISK=$(ssh "$SERVER" "df -h / | tail -1 | awk '{print \$5}' | cut -d'%' -f1" 2>/dev/null)
    if [ -z "$DISK" ]; then
        log "Lỗi: Không kết nối được $SERVER"
    elif [ "$DISK" -gt 80 ]; then
        log "Cảnh báo: Disk $SERVER vượt $DISK%"
    else
        log "Disk $SERVER ổn: $DISK%"
    fi
}

# Chạy song song với background jobs
for SERVER in "${SERVERS[@]}"
do
    check_server "$SERVER" &
    # Giới hạn số job
    while [ $(jobs -r | wc -l) -ge "$MAX_JOBS" ]
    do
        sleep 0.1
    done
done

# Đợi tất cả hoàn thành
wait

echo "Kiểm tra song song hoàn tất, xem log tại $LOG_FILE"

Chuẩn Bị và Chạy

  1. Setup SSH (bài 13):

    ssh-copy-id user@server1
    ssh-copy-id user@server2
    ssh-copy-id user@server3
  2. Chạy script:

    chmod +x parallel_check.sh
    ./parallel_check.sh
    • Kết quả mẫu:
      Kiểm tra song song hoàn tất, xem log tại /var/log/parallel_check.log
    • Log:
      [2025-03-13 10:00:00] Disk user@server1 ổn: 42%
      [2025-03-13 10:00:00] Disk user@server2 vượt 85%
      [2025-03-13 10:00:00] Disk user@server3 ổn: 33%

Giải thích:

  • &: Chạy check_server nền.
  • jobs -r: Đếm job đang chạy.
  • wait: Đợi tất cả xong.

DevOps: Script này kiểm tra multi-server nhanh hơn tuần tự, có thể dùng trong cron hoặc pipeline.

Dùng Xargs Thay Thế

printf "%s\n" "${SERVERS[@]}" | xargs -n 1 -P "$MAX_JOBS" bash -c 'check_server() { ... }; check_server "$1"' _ {}
  • -P 3: 3 job song song.

Debug Parallel

  • Thêm debug:
    log "Debug: Bắt đầu $SERVER"
    bash -x parallel_check.sh
  • Kiểm tra job:
    jobs -l

Thực tế: Tôi từng để quá nhiều job, server quá tải – giới hạn MAX_JOBS cứu tôi khỏi crash.

Ứng Dụng trong DevOps

Tối Ưu Multi-Server

  • Cập nhật song song:
    printf "%s\n" "${SERVERS[@]}" | xargs -n 1 -P 3 ssh {} "sudo apt update"

Pipeline CI/CD

  • Build container song song:
    build:
    script:
      - echo "app1 app2 app3" | xargs -n 1 -P 3 bash -c 'docker build -t $1:$CI_COMMIT_SHA ./$1' _

Case study: Một team dùng parallel để test 20 microservice, giảm thời gian từ 15 phút xuống 2 phút.

Best Practice

  • Giới hạn job để tránh quá tải.
  • Đảm bảo log thread-safe.
  • Test tuần tự trước khi parallel.

Kết Luận

Parallel Execution trong Bash DevOps với chạy song song Bash là cách tối ưu Bash để xử lý task lớn nhanh hơn. Thực hành với parallel_check.sh cho thấy bạn có thể áp dụng multi-thread Bash hiệu quả – kỹ năng nâng cao trong DevOps. Bài tiếp theo, chúng ta sẽ khám phá Bash và API – cách gọi API như pro.

Điều hướng chuỗi bài viết<< Bài 15. Monitoring với Bash DevOps: Báo Cáo Hệ Thống Hiệu Quả
>> Bài 17. Bash và API trong DevOps: Gọi và Xử Lý API Hiệu Quả
Article Thumbnail
Datadog Webinar: Modernize AWS Logs at Scale
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận