Prefer China speedtest servers for smart tuning

This commit is contained in:
byjoey
2026-06-13 10:12:42 +08:00
parent 1157b7743f
commit 0c4bba832c
2 changed files with 75 additions and 2 deletions
+2 -1
View File
@@ -191,11 +191,12 @@ net.ipv4.tcp_slow_start_after_idle = 0
10. BBR v3 智能带宽优化
```
脚本会优先安装并运行 Ookla 官方 `speedtest`自动尝试附近测速服务器并获取上传带宽、下载带宽和 Ping;如果测速失败会提示手动输入上传带宽。
脚本会优先安装并运行 Ookla 官方 `speedtest`让用户选择中国移动、中国联通、中国电信或自动匹配三大运营商,然后优先尝试中国境内最近的匹配测速节点并获取上传带宽、下载带宽和 Ping;如果找不到匹配节点,会降级为中国境内不限运营商节点,最后才使用 Ookla 自动选择。测速失败会提示手动输入上传带宽。
优化逻辑:
- 自动启用 `bbr` 拥塞控制和 `fq` 队列算法。
- 测速节点优先选择中国境内节点,并支持三大运营商选择。
- 根据上传带宽和地区模式映射推荐 TCP buffer 档位。
- 亚太线路使用较保守的 buffer,美欧高延迟线路使用更大 buffer。
- 按机器内存设置 TCP buffer 上限,避免小内存 VPS 过度放大缓冲区。
+73 -1
View File
@@ -225,6 +225,71 @@ ensure_ookla_speedtest() {
)
}
# 函数:选择中国境内测速运营商
select_china_speedtest_isp() {
local choice=""
echo -e "\033[36m请选择中国境内测速运营商:\033[0m" >&2
echo -e "\033[33m 1. 自动匹配三大运营商\033[0m" >&2
echo -e "\033[33m 2. 中国移动 / CMCC\033[0m" >&2
echo -e "\033[33m 3. 中国联通 / CUCC\033[0m" >&2
echo -e "\033[33m 4. 中国电信 / CTCC\033[0m" >&2
echo -n -e "\033[36m请选择 (1-4,默认 1): \033[0m" >&2
read -r choice
choice="${choice:-1}"
case "$choice" in
2)
SPEEDTEST_ISP_LABEL="中国移动"
SPEEDTEST_ISP_PATTERN='(Mobile|CMCC|China Mobile|中国移动|移动)'
;;
3)
SPEEDTEST_ISP_LABEL="中国联通"
SPEEDTEST_ISP_PATTERN='(Unicom|CUCC|China Unicom|中国联通|联通)'
;;
4)
SPEEDTEST_ISP_LABEL="中国电信"
SPEEDTEST_ISP_PATTERN='(Telecom|CTCC|China Telecom|中国电信|电信)'
;;
*)
SPEEDTEST_ISP_LABEL="三大运营商自动匹配"
SPEEDTEST_ISP_PATTERN='(Mobile|CMCC|China Mobile|中国移动|移动|Unicom|CUCC|China Unicom|中国联通|联通|Telecom|CTCC|China Telecom|中国电信|电信)'
;;
esac
}
# 函数:从 Ookla server list 中筛选中国境内节点
get_china_speedtest_servers() {
local isp_pattern="$1"
local server_output
local china_pattern='(China|Beijing|Shanghai|Guangzhou|Shenzhen|Hangzhou|Nanjing|Wuhan|Chengdu|Chongqing|Tianjin|Xi.?an|Zhengzhou|Changsha|Jinan|Qingdao|Fuzhou|Xiamen|Hefei|Suzhou|Ningbo|Dongguan|Foshan|中国|北京|上海|广州|深圳|杭州|南京|武汉|成都|重庆|天津|西安|郑州|长沙|济南|青岛|福州|厦门|合肥|苏州|宁波|东莞|佛山)'
server_output=$(speedtest --accept-license --accept-gdpr --servers 2>/dev/null || true)
if [[ -z "$server_output" ]]; then
return 1
fi
echo "$server_output" \
| grep -Ei "$china_pattern" \
| grep -Ei "$isp_pattern" \
| sed -nE 's/^[[:space:]]*([0-9]+).*/\1/p'
}
# 函数:从 Ookla server list 中筛选中国境内不限运营商节点
get_any_china_speedtest_servers() {
local server_output
local china_pattern='(China|Beijing|Shanghai|Guangzhou|Shenzhen|Hangzhou|Nanjing|Wuhan|Chengdu|Chongqing|Tianjin|Xi.?an|Zhengzhou|Changsha|Jinan|Qingdao|Fuzhou|Xiamen|Hefei|Suzhou|Ningbo|Dongguan|Foshan|中国|北京|上海|广州|深圳|杭州|南京|武汉|成都|重庆|天津|西安|郑州|长沙|济南|青岛|福州|厦门|合肥|苏州|宁波|东莞|佛山)'
server_output=$(speedtest --accept-license --accept-gdpr --servers 2>/dev/null || true)
if [[ -z "$server_output" ]]; then
return 1
fi
echo "$server_output" \
| grep -Ei "$china_pattern" \
| sed -nE 's/^[[:space:]]*([0-9]+).*/\1/p'
}
# 函数:运行 Ookla Speedtest 并解析 Ping/Download/Upload
run_speedtest_measurement() {
SPEEDTEST_PING=""
@@ -233,12 +298,19 @@ run_speedtest_measurement() {
ensure_ookla_speedtest || return 1
select_china_speedtest_isp
echo -e "\033[36m正在运行 Ookla Speedtest 测速,请稍候...\033[0m"
echo -e "\033[36m优先选择:中国境内最近的 ${SPEEDTEST_ISP_LABEL} 节点\033[0m"
local servers_list
local speedtest_output=""
local attempt=0
servers_list=$(speedtest --accept-license --accept-gdpr --servers 2>/dev/null | sed -nE 's/^[[:space:]]*([0-9]+).*/\1/p' | head -n 10)
servers_list=$(get_china_speedtest_servers "$SPEEDTEST_ISP_PATTERN" | head -n 10)
if [[ -z "$servers_list" ]]; then
echo -e "\033[33m⚠ 未找到匹配运营商的中国境内节点,改用中国境内不限运营商节点。\033[0m"
servers_list=$(get_any_china_speedtest_servers | head -n 10)
fi
if [[ -z "$servers_list" ]]; then
echo -e "\033[33m⚠ 未找到中国境内节点,改用 Ookla 自动选择。\033[0m"
servers_list="auto"
fi