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.
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...
#!/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