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