Ansible 並發管理數百台跨 IDC 服務器時,SSH 握手延遲會線性累積為分鐘級耗時。開啟 **ControlMaster + ControlPersist** 復用 TCP 連接,單次節省 ~1 秒,百台節省 ~1 分鐘。本文記錄 CentOS 6.4 編譯新版 OpenSSH、配置多路復用、驗證效果全過程。
~/.ssh/sockets/%r@%h-%p),後續連接復用此 Socket,跳過 TCP 握手、密鑰交換、認證。yum -y groupinstall "Development tools"
yum -y install pam-devel rpm-build rpmdevtools zlib-devel krb5-devel \
tcp_wrappers tcp_wrappers-devel tcp_wrappers-libs
mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS,TMP}
cat > ~/.rpmmacros <<'EOF'
%_topdir /home/dong.guo/rpmbuild
%_tmppath /home/dong.guo/TMP
EOF
yum update openssl
cd ~/rpmbuild/SOURCES
wget https://mirror.team-cymru.org/pub/OpenBSD/OpenSSH/portable/openssh-6.6p1.tar.gz
wget https://mirror.team-cymru.org/pub/OpenBSD/OpenSSH/portable/openssh-6.6p1.tar.gz.asc
openssl dgst -sha1 openssh-6.6p1.tar.gz # 校驗
cd ~/rpmbuild/SPECS
tar xfz ../SOURCES/openssh-6.6p1.tar.gz openssh-6.6p1/contrib/redhat/openssh.spec
mv openssh-6.6p1/contrib/redhat/openssh.spec openssh-6.6p1.spec
rm -rf openssh-6.6p1
# 禁用 GNOME/X11 askpass 依賴
sed -i -e 's/%define no_gnome_askpass 0/%define no_gnome_askpass 1/g' openssh-6.6p1.spec
sed -i -e 's/%define no_x11_askpass 0/%define no_x11_askpass 1/g' openssh-6.6p1.spec
sed -i -e 's/BuildPreReq/BuildRequires/g' openssh-6.6p1.spec
rpmbuild -ba openssh-6.6p1.spec
cd ~/rpmbuild/RPMS/x86_64
rpm -e openssh-askpass openssh-ldap # 移除衝突包
rpm -Fvh openssh*6.6p1-1*rpm
# 注意:sshd_config 會備份為 .rpmnew,需手動合併自定義配置
mkdir -p ~/.ssh/sockets
chmod 700 ~/.ssh/sockets
cat > ~/.ssh/config <<'EOF'
Host *
Compression yes
ServerAliveInterval 60
ServerAliveCountMax 5
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 4h
EOF
yum install -y epel-release git
git clone https://github.com/ClockworkNet/cmc.git
cp cmc/cmc ~/bin/
# 用法:cmc -l 列出, cmc -X 關閉所有
| 場景 | 命令 | 耗時 | 說明 |
|---|---|---|---|
| 首次連接 (無 Socket) | time ssh host 'hostname -s' | 9.48s | 完整 TCP+SSH 握手 |
| 復用 Socket | time ssh host 'hostname -s' | 0.24s | 直接走 Unix Socket,跳過握手 |
| 清理 Socket 後 | time ssh host 'hostname -s' | 9.46s | 恢復首次連接耗時 |
ulimit -n,調大 /etc/security/limits.conf。ControlPersist 過長可能殘留殭屍 Master,建議 1-4h。ansible.cfg 中 [ssh_connection] control_path = ~/.ssh/sockets/%%r@%%h-%%p 即可複用。在跨公網、高延遲鏈路、大規模並發運維場景下,ControlPersist 是**零代碼修改、即開即用、收益顯著**的 SSH 加速銀彈。