跳轉到內容

Oracle Cloud 永久免費實例優化與避坑指南 2026

Oracle Cloud ARM 實例優化

⚠️ 重要提醒: Oracle Cloud 免費實例雖然誘人,但存在被回收的風險。本文將告訴你如何安全使用這些資源,避免心血白費。

Oracle Cloud 的 Always Free 套餐提供了業界最慷慨的永久免費資源:

資源類型免費額度備註
ARM Ampere A14 核 + 24 GB 內存性能強勁,但有回收風險
x86 VM.Standard.E2.1.Micro2 臺(共享 CPU)穩定性更高
Block Volume200 GB可用於存儲
對象存儲10 GB適合靜態資源
帶寬10 TB/月出站流量

本文將從實例安全、性能優化、資源監控三個維度,教你如何讓這些免費資源為你長期服務。


一、為什麼免費實例會被回收?

1.1 回收機制解析

Oracle 官方並沒有公開明確的回收規則,但根據大量用戶經驗,主要原因包括:

觸發條件風險等級說明
長時間閒置(>7-14天)⭐⭐⭐⭐⭐最主要原因
資源佔用異常(CPU/GPU 持續 100%)⭐⭐⭐⭐被判定為挖礦
違反 TOS(商業用途)⭐⭐⭐⭐⭐直接封號
IP 濫用(發送垃圾郵件等)⭐⭐⭐⭐⭐直接封號
賬單逾期(即使免費也可能觸發)⭐⭐⭐⭐信用卡失效等
區域資源緊張⭐⭐⭐新用戶優先

1.2 官方回收通知模式

實例回收前通常會收到郵件通知:
1. 第一次警告:通知資源使用異常,要求在 7-14 天內整改
2. 第二次通知:警告即將回收
3. 最終通知:實例已被終止

經驗數據:約 30-40% 的免費用戶在使用 3-6 個月後會遇到回收問題。


二、防止實例被回收的 8 大策略

2.1 保持實例活躍

策略 1:定期活動檢測腳本

bash
#!/bin/bash
# 文件名: keep-alive.sh
# 作用: 保持實例活躍,防止被判定為閒置

LOGFILE="/var/log/keep-alive.log"

echo "[$(date)] 開始保持活躍任務" >> $LOGFILE

# 方法1: 定期訪問外部服務
curl -s --connect-timeout 5 https://www.baidu.com > /dev/null
curl -s --connect-timeout 5 https://www.google.com > /dev/null

# 方法2: 定期更新時間
ntpdate pool.ntp.org >> $LOGFILE 2>&1

# 方法3: 定期進行 CPU 活動(模擬正常使用)
for i in $(seq 1 5); do
    echo "scale=1000; 4*a(1)" | bc -l > /dev/null
    sleep 1
done

# 方法4: 定期寫入日誌
echo "[$(date)] 活躍檢測完成" >> $LOGFILE

exit 0

設置定時任務:

bash
# 添加到 crontab
crontab -e

# 添加以下內容(每 2 小時執行一次)
0 */2 * * * /root/scripts/keep-alive.sh >> /var/log/cron-keepalive.log 2>&1

策略 2:部署輕量級服務

bash
# 安裝一個輕量級的監控服務或 Web 服務
# 方案A: 安裝 nginx 作為靜態文件服務器
sudo apt install -y nginx

# 方案B: 安裝一個簡單的狀態監控頁面
mkdir -p /var/www/html/status
cat > /var/www/html/status/index.html <<EOF
<!DOCTYPE html>
<html>
<head><title>Server Status</title></head>
<body>
<h1>Server Status: Running</h1>
<p>Last checked: $(date)</p>
</body>
</html>
EOF

# 方案C: 部署一個簡單的 API 服務(Python)
pip install flask
cat > /opt/health-check/app.py <<EOF
from flask import Flask
import datetime

app = Flask(__name__)

@app.route('/health')
def health():
    return {
        'status': 'healthy',
        'timestamp': datetime.datetime.now().isoformat()
    }

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
EOF

# 設置開機自啟
echo "@reboot python3 /opt/health-check/app.py &" >> /etc/crontab

2.2 合理控制資源使用

策略 3:限制資源佔用

bash
# 限制 CPU 使用(避免被判定為挖礦)
# 創建 CPU 限制腳本
cat > /usr/local/bin/limit-cpu.sh << 'EOF'
#!/bin/bash
# 限制 CPU 使用不超過 80%

# 獲取當前 CPU 使用
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')

# 如果超過 80%,降低優先級
if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then
    echo "CPU 使用率過高: $CPU_USAGE%" >> /var/log/cpu-limit.log
    # 降低所有用戶進程優先級
    renice +5 -u root
    renice +5 -u $(whoami)
fi
EOF

chmod +x /usr/local/bin/limit-cpu.sh

# 每分鐘檢查一次
echo "* * * * * /usr/local/bin/limit-cpu.sh" >> /etc/crontab

策略 4:配置合理的資源分配

bash
# 檢查當前實例配置
echo "=== 當前實例信息 ==="
cat /proc/cpuinfo | grep "model name" | head -1
echo "內存: $(free -h | grep Mem | awk '{print $2}')"
echo "磁盤: $(df -h / | grep / | awk '{print $2}')"

# 配置內存使用限制(針對 Java 應用)
# 修改 /etc/profile 添加環境變量
echo "export JAVA_OPTS='-Xms256m -Xmx512m'" >> /etc/profile
source /etc/profile

2.3 合規使用策略

策略 5:合理配置防火牆

bash
# 只開放必要端口
sudo iptables -F
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD DROP

# 允許迴環接口
sudo iptables -A INPUT -i lo -j ACCEPT

# 允許已建立的連接
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# 開放必要端口
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT      # SSH
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT      # HTTP
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT     # HTTPS
sudo iptables -A INPUT -p tcp --dport 5000 -j ACCEPT    # 自定義服務

# 保存配置
sudo iptables-save > /etc/iptables/rules.v4

# 安裝 iptables-persistent 確保重啟後生效
sudo apt install -y iptables-persistent

策略 6:配置 Oracle Cloud 安全列表

bash
# 使用 OCI CLI 配置安全規則
# 允許 SSH (端口 22)
oci network security-list update \
  --security-list-id <your-security-list-id> \
  --egress-security-rules '[
    {
      "destination": "0.0.0.0/0",
      "protocol": "all"
    }
  ]' \
  --ingress-security-rules '[
    {
      "source": "0.0.0.0/0",
      "protocol": "tcp",
      "tcp-options": {
        "destination-port-range": "22"
      }
    },
    {
      "source": "0.0.0.0/0",
      "protocol": "tcp",
      "tcp-options": {
        "destination-port-range": "80"
      }
    },
    {
      "source": "0.0.0.0/0",
      "protocol": "tcp",
      "tcp-options": {
        "destination-port-range": "443"
      }
    }
  ]'

2.4 監控與告警

策略 7:設置資源監控告警

bash
# 安裝監控工具
sudo apt install -y htop glances

# 創建監控腳本
cat > /usr/local/bin/monitor-resources.sh << 'EOF'
#!/bin/bash
# 資源監控與告警腳本

THRESHOLD_CPU=90
THRESHOLD_MEM=90
THRESHOLD_DISK=80

CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
MEM_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
DISK_USAGE=$(df -h / | grep / | awk '{print $5}' | sed 's/%//g')

echo "[$(date)] CPU: $CPU_USAGE%, MEM: $MEM_USAGE%, DISK: $DISK_USAGE%" >> /var/log/resource-monitor.log

# CPU 告警
if (( $(echo "$CPU_USAGE > $THRESHOLD_CPU" | bc -l) )); then
    echo "ALERT: CPU 使用率超過閾值 $THRESHOLD_CPU%" | mail -s "OCI 資源告警" your@email.com
fi

# 內存告警
if (( $(echo "$MEM_USAGE > $THRESHOLD_MEM" | bc -l) )); then
    echo "ALERT: 內存使用率超過閾值 $THRESHOLD_MEM%" | mail -s "OCI 資源告警" your@email.com
fi

# 磁盤告警
if (( DISK_USAGE > THRESHOLD_DISK )); then
    echo "ALERT: 磁盤使用率超過閾值 $THRESHOLD_DISK%" | mail -s "OCI 資源告警" your@email.com
fi
EOF

chmod +x /usr/local/bin/monitor-resources.sh

# 每 10 分鐘檢查一次
echo "*/10 * * * * /usr/local/bin/monitor-resources.sh" >> /etc/crontab

策略 8:設置賬單提醒

bash
# 方法1: 設置預算告警(通過 OCI 控制檯)
# 方法2: 設置每月賬單郵件提醒
echo "0 1 1 * * echo '提醒: OCI 賬單日,請檢查賬戶狀態' | mail -s 'OCI 賬單提醒' your@email.com" >> /etc/crontab

# 檢查賬戶狀態腳本
cat > /usr/local/bin/check-oci-status.sh << 'EOF'
#!/bin/bash
# 檢查 OCI 賬戶狀態

# 檢查實例狀態
INSTANCE_STATUS=$(oci compute instance get --instance-id <your-instance-id> --query 'data."lifecycle-state"' --raw-output)

if [ "$INSTANCE_STATUS" != "RUNNING" ]; then
    echo "ALERT: 實例狀態異常: $INSTANCE_STATUS" | mail -s "OCI 實例告警" your@email.com
fi

# 檢查剩餘資源
echo "檢查剩餘資源..."
oci usage api-summary get
EOF

chmod +x /usr/local/bin/check-oci-status.sh

# 每天檢查一次
echo "0 9 * * * /usr/local/bin/check-oci-status.sh" >> /etc/crontab

三、ARM Ampere 實例性能優化

3.1 ARM vs x86 對比

特性ARM Ampere A1x86 VM.Standard.E2.1.Micro
CPU 核心4 核共享 1/8 核
內存24 GB1 GB
性能非常強勁基礎夠用
穩定性中等(有回收風險)
適合場景Docker、數據庫、AI 推理輕量服務、代理

3.2 性能優化技巧

優化 1:使用 ARM 優化的軟件

bash
# 更新系統並安裝優化工具
sudo apt update && sudo apt upgrade -y

# 安裝 ARM 優化的編譯器
sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

# 安裝性能監控工具
sudo apt install -y linux-tools-common linux-tools-generic

# 檢查 CPU 信息
cat /proc/cpuinfo | grep -A 5 "processor"

# 檢查內存配置
cat /proc/meminfo | grep MemTotal

# 檢查磁盤 I/O
iostat -x 1 5

優化 2:內核參數調優

bash
# 修改 /etc/sysctl.conf 添加優化參數
cat >> /etc/sysctl.conf << 'EOF'
# ARM 性能優化
vm.swappiness=10
vm.dirty_ratio=10
vm.dirty_background_ratio=5
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_max_syn_backlog=4096
net.core.somaxconn=4096
net.core.netdev_max_backlog=4096
EOF

# 應用配置
sudo sysctl -p

# 優化文件描述符限制
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf

優化 3:Docker 性能優化

bash
# 為 Docker 配置 ARM 優化
cat > /etc/docker/daemon.json << 'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.size=100G"
  ]
}
EOF

# 重啟 Docker
sudo systemctl restart docker

# 驗證配置
docker info | grep -E "Storage Driver|Cgroup Driver"

優化 4:內存優化

bash
# 創建合理的 swap(如果需要)
# 注意:ARM 實例內存充足,通常不需要 swap
# 但如果運行內存密集型應用,可以創建

# 檢查當前 swap
swapon --show

# 如果需要創建 swap
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 設置開機自啟
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

四、實例被回收後的恢復策略

4.1 備份策略

完整備份腳本

bash
#!/bin/bash
# 文件名: oci-backup.sh
# 作用: 定期備份實例數據到對象存儲

# 配置
BACKUP_DIR="/mnt/backup"
BUCKET_NAME="oci-backup-bucket"
DATE=$(date +%Y-%m-%d-%H%M%S)
KEEP_DAYS=7

# 創建備份目錄
mkdir -p $BACKUP_DIR

# 備份重要目錄
echo "開始備份..."

# 備份系統配置
tar -czf $BACKUP_DIR/etc-$DATE.tar.gz /etc

# 備份用戶數據
tar -czf $BACKUP_DIR/home-$DATE.tar.gz /home

# 備份 Docker 數據卷
docker save $(docker images -q) > $BACKUP_DIR/docker-images-$DATE.tar

# 備份數據庫(如果有)
if command -v mysqldump &> /dev/null; then
    mysqldump -u root -p --all-databases | gzip > $BACKUP_DIR/mysql-$DATE.sql.gz
fi

# 上傳到 OCI 對象存儲
oci os object put \
  --bucket-name $BUCKET_NAME \
  --file $BACKUP_DIR/etc-$DATE.tar.gz \
  --name backups/etc-$DATE.tar.gz

# 刪除舊備份
find $BACKUP_DIR -type f -mtime +$KEEP_DAYS -delete

echo "備份完成: $DATE"

4.2 快速恢復流程

bash
# 恢復步驟(在新實例上執行)

# 1. 安裝必要工具
sudo apt update && sudo apt install -y docker.io

# 2. 從對象存儲下載備份
oci os object get \
  --bucket-name $BUCKET_NAME \
  --name backups/etc-latest.tar.gz \
  --file /tmp/etc-backup.tar.gz

# 3. 恢復配置
tar -xzf /tmp/etc-backup.tar.gz -C /

# 4. 恢復 Docker 鏡像
docker load < /tmp/docker-images.tar

# 5. 啟動容器
docker-compose up -d

# 6. 恢復數據庫
gunzip < /tmp/mysql-backup.sql.gz | mysql -u root -p

4.3 自動備份定時任務

bash
# 添加到 crontab
crontab -e

# 添加以下內容(每天凌晨 2 點執行備份)
0 2 * * * /root/scripts/oci-backup.sh >> /var/log/oci-backup.log 2>&1

# 每週一清理過期備份
0 3 * * 1 find /mnt/backup -type f -mtime +30 -delete >> /var/log/backup-cleanup.log 2>&1

五、常見問題與解決方案

Q1:實例突然無法訪問怎麼辦?

檢查步驟:

bash
# 1. 檢查網絡連接
ping your-ip-address

# 2. 檢查實例狀態(通過 OCI CLI)
oci compute instance get --instance-id <your-instance-id> --query 'data."lifecycle-state"'

# 3. 檢查安全列表
oci network security-list get --security-list-id <your-security-list-id>

# 4. 檢查防火牆規則
sudo iptables -L

# 5. 檢查服務狀態
sudo systemctl status nginx
sudo systemctl status docker

可能原因與解決:

問題原因解決方案
SSH 無法連接安全列表未開放 22 端口在 OCI 控制檯添加規則
實例已停止被 Oracle 回收或資源不足嘗試啟動或提交工單
IP 地址變更重啟後公網 IP 變化更新 DNS 記錄

Q2:收到資源回收警告郵件怎麼辦?

立即行動清單:

bash
# 1. 檢查資源使用情況
top
free -h
df -h

# 2. 停止不必要的服務
sudo systemctl stop unused-service

# 3. 清理磁盤空間
sudo apt autoremove -y
sudo apt clean
rm -rf /var/log/*.log
find /tmp -type f -delete

# 4. 重啟實例(釋放資源)
sudo reboot

# 5. 提交工單說明情況
# 登錄 OCI 控制檯 -> Support -> Create Ticket

Q3:如何查詢剩餘免費額度?

bash
# 使用 OCI CLI 查詢
oci usage api-summary get

# 查詢特定服務使用情況
oci usage resource-usage-summary get \
  --service-name "compute" \
  --usage-period-type "MONTH"

# 查詢對象存儲使用
oci os bucket list --compartment-id <your-compartment-id>

# 查詢塊存儲使用
oci bv volume list --compartment-id <your-compartment-id>

Q4:如何避免信用卡扣款?

bash
# 1. 設置預算告警(推薦設置 $0 預算)
oci budgets budget create \
  --compartment-id <your-compartment-id> \
  --amount 0 \
  --budget-type "MONTHLY" \
  --reset-period "MONTHLY" \
  --name "Zero Budget"

# 2. 禁用自動升級
# 在 OCI 控制檯 -> Profile -> Billing -> Preferences
# 取消勾選 "Auto-renew subscriptions"

# 3. 定期檢查賬單
echo "0 9 1 * * oci billing invoice list --compartment-id <your-compartment-id> | mail -s 'OCI 賬單檢查' your@email.com" >> /etc/crontab

Q5:實例被回收後數據還能恢復嗎?

bash
# 如果啟用了自動備份,可以恢復
# 1. 創建新實例
# 2. 安裝 OCI CLI
# 3. 從對象存儲下載備份
# 4. 恢復數據

# 如果沒有備份,數據將永久丟失
# 強烈建議啟用自動備份!

六、最佳實踐總結

✅ 必做清單

⚠️ 絕對不要做

行為後果
長時間閒置(>7天)高概率被回收
CPU 持續 100%被判定為挖礦,立即回收
發送垃圾郵件賬號被封禁
運行挖礦程序賬號被封禁
商業用途違反 TOS,賬號被封禁

📊 資源使用建議

服務類型推薦配置注意事項
Docker 容器2-3 核,8-16 GB 內存避免同時運行過多容器
數據庫2 核,8 GB 內存使用輕量級數據庫(SQLite、PostgreSQL)
Web 服務1-2 核,2-4 GB 內存使用靜態文件服務或 CDN
AI 推理4 核,16-24 GB 內存使用量化模型(如 Ollama 7B 模型)

結語

Oracle Cloud 的免費資源是學習和實驗的絕佳平臺,但需要用心維護。遵循本文的建議,你可以大大降低實例被回收的風險,讓這些寶貴的資源為你長期服務。

記住: 免費資源不是無限的,合理使用、定期維護才是長久之計。

推薦閱讀:


☁️ 提示: 如果你的主要目標是穩定性和長期運行,建議考慮付費方案或其他雲服務商。但如果你只是學習和實驗,Oracle Cloud 的免費資源絕對值得嘗試!


延伸阅读

免责声明

本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。

最後更新於: