Last active
August 10, 2025 03:00
-
-
Save codedeep79/e87c1cfc969ab575ed1aa3266680ed34 to your computer and use it in GitHub Desktop.
Script này được thiết kế để kiểm tra và tối ưu I/O Scheduler cho ScyllaDB trên hệ thống Debian hoặc các hệ điều hành Linux tương tự, chạy được cả trên môi trường bare metal lẫn trên các nền tảng đám mây phổ biến như AWS, GCP, Azure, VMware, OpenStack...
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment