Skip to content

Instantly share code, notes, and snippets.

@codedeep79
Last active August 10, 2025 03:00
Show Gist options
  • Save codedeep79/e87c1cfc969ab575ed1aa3266680ed34 to your computer and use it in GitHub Desktop.
Save codedeep79/e87c1cfc969ab575ed1aa3266680ed34 to your computer and use it in GitHub Desktop.

Revisions

  1. codedeep79 renamed this gist Aug 10, 2025. 1 changed file with 0 additions and 13 deletions.
    13 changes: 0 additions & 13 deletions scylla_scheduler_test.md → scylla_scheduler_test.sh
    Original file line number Diff line number Diff line change
    @@ -1,15 +1,3 @@
    1. Tạo file `scylla_scheduler_test.sh`

    Bản universal script hoàn chỉnh, chạy được trên bare metal lẫn tất cả cloud provider phổ biến (AWS, GCP, Azure, OCI, KVM/OpenStack, VMware...).
    Script này sẽ:
    + Phát hiện volume Scylla (hoặc volume chỉ định).
    + Nhận diện cloud provider dựa trên MODEL / VENDOR.
    + Liệt kê scheduler khả dụng.
    + Nếu có nhiều scheduler → benchmark bằng fio.
    + Xuất bảng kết quả p99 latency + khuyến nghị.
    + Nếu đang ở cloud và scheduler không ảnh hưởng → cảnh báo.

    ```sh
    #!/bin/bash
    set -e

    @@ -83,4 +71,3 @@ if [[ "$CLOUD_PROVIDER" != "Unknown" && "$CLOUD_PROVIDER" != "BareMetal" ]]; the
    fi
    echo "Scheduler tốt nhất: $BEST_SCHED (p99 = $BEST_LAT µs)"
    echo "Đặt scheduler mặc định: echo $BEST_SCHED | sudo tee /sys/block/$DEVICE_NAME/queue/scheduler"
    ```
  2. codedeep79 renamed this gist Aug 10, 2025. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. codedeep79 created this gist Aug 10, 2025.
    86 changes: 86 additions & 0 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,86 @@
    1. Tạo file `scylla_scheduler_test.sh`

    Bản universal script hoàn chỉnh, chạy được trên bare metal lẫn tất cả cloud provider phổ biến (AWS, GCP, Azure, OCI, KVM/OpenStack, VMware...).
    Script này sẽ:
    + Phát hiện volume Scylla (hoặc volume chỉ định).
    + Nhận diện cloud provider dựa trên MODEL / VENDOR.
    + Liệt kê scheduler khả dụng.
    + Nếu có nhiều scheduler → benchmark bằng fio.
    + Xuất bảng kết quả p99 latency + khuyến nghị.
    + Nếu đang ở cloud và scheduler không ảnh hưởng → cảnh báo.

    ```sh
    #!/bin/bash
    set -e

    DATA_PATH="${1:-/var/lib/scylla}"

    echo "=== [1/6] Phát hiện thiết bị chứa dữ liệu ScyllaDB ($DATA_PATH) ==="
    DEVICE=$(df "$DATA_PATH" | tail -1 | awk '{print $1}' | sed 's/[0-9]*$//')
    DEVICE_NAME=$(basename "$DEVICE")

    if [ -z "$DEVICE" ]; then
    echo "[ERROR] Không tìm thấy thiết bị chứa $DATA_PATH"
    exit 1
    fi

    MODEL=$(lsblk -d -n -o NAME,MODEL | grep "$DEVICE_NAME" | awk '{$1=""; print $0}' | xargs)
    VENDOR=$(cat /sys/block/$DEVICE_NAME/device/vendor 2>/dev/null || echo "")
    echo "[INFO] Thiết bị: $DEVICE_NAME ($MODEL | $VENDOR)"

    echo "=== [2/6] Nhận diện Cloud Provider ==="
    CLOUD_PROVIDER="Unknown"
    if [[ "$MODEL" =~ "Amazon Elastic Block Store" ]] || [[ "$VENDOR" =~ "Amazon" ]]; then
    CLOUD_PROVIDER="AWS"
    elif [[ "$MODEL" =~ "Google PersistentDisk" ]] || [[ "$VENDOR" =~ "Google" ]]; then
    CLOUD_PROVIDER="GCP"
    elif [[ "$MODEL" =~ "Micros" ]] || [[ "$VENDOR" =~ "Msft" ]]; then
    CLOUD_PROVIDER="Azure"
    elif [[ "$MODEL" =~ "VIRTIO" ]] || [[ "$VENDOR" =~ "Virtio" ]]; then
    CLOUD_PROVIDER="KVM / Generic"
    elif [[ "$MODEL" =~ "VMware" ]] || [[ "$VENDOR" =~ "VMware" ]]; then
    CLOUD_PROVIDER="VMware"
    fi
    echo "[INFO] Cloud Provider phát hiện: $CLOUD_PROVIDER"

    echo "=== [3/6] Liệt kê scheduler khả dụng ==="
    SCHEDS=$(cat /sys/block/$DEVICE_NAME/queue/scheduler | tr -d '[]')
    echo "[INFO] Scheduler khả dụng: $SCHEDS"

    if [ $(echo $SCHEDS | wc -w) -le 1 ]; then
    echo "[WARN] Chỉ có 1 scheduler → Không thể so sánh."
    echo "[NOTE] Trên $CLOUD_PROVIDER, tối ưu I/O bằng storage type hoặc Scylla I/O queues."
    exit 0
    fi

    echo "=== [4/6] Benchmark từng scheduler với fio ==="
    rm -f fio-*.json
    for sched in $SCHEDS; do
    echo "[TEST] Scheduler: $sched"
    echo $sched | sudo tee /sys/block/$DEVICE_NAME/queue/scheduler > /dev/null
    sleep 1
    fio --filename=$DEVICE --direct=1 --rw=randread --bs=4k \
    --ioengine=libaio --iodepth=32 --runtime=10 --time_based \
    --name=test-${sched} --output=fio-${sched}.json --output-format=json
    done

    echo "=== [5/6] So sánh p99 latency ==="
    printf "%-15s %-15s\n" "Scheduler" "p99_latency(µs)"
    BEST_SCHED=""
    BEST_LAT=999999
    for sched in $SCHEDS; do
    P99=$(jq '.jobs[0].read.clat.percentile."99.000000"' fio-${sched}.json)
    printf "%-15s %-15s\n" "$sched" "$P99"
    if (( $(echo "$P99 < $BEST_LAT" | bc -l) )); then
    BEST_LAT=$P99
    BEST_SCHED=$sched
    fi
    done

    echo "=== [6/6] KHUYẾN NGHỊ ==="
    if [[ "$CLOUD_PROVIDER" != "Unknown" && "$CLOUD_PROVIDER" != "BareMetal" ]]; then
    echo "[NOTE] Đang chạy trên $CLOUD_PROVIDER → Scheduler ở guest có thể không ảnh hưởng đáng kể."
    fi
    echo "Scheduler tốt nhất: $BEST_SCHED (p99 = $BEST_LAT µs)"
    echo "Đặt scheduler mặc định: echo $BEST_SCHED | sudo tee /sys/block/$DEVICE_NAME/queue/scheduler"
    ```