吐槽一下阿里云轻量应用服务器的IO
阿里云香港轻量服务器IO性能优化实战记录阿里云香港 2 核 2 GB 轻量应用服务器用了大半年，最大的感受只有一句话：IO 性能太差，稍微一跑任务就卡得怀疑人生。下面把踩坑和解决过程完整记录下来，给同样打算入坑轻量服务器的朋友一个参考。一、问题起源这台机器平时只跑一些小脚本和个人站点，本来 2H2G 的规格就不高，可只要做一点磁盘读写——哪怕只是解压、更新依赖、跑个数据库迁移——系统就开始疯狂掉队：iostat -x 1 看到读写延迟动不动 500+ ms；整个 SSH 会话假死，只能强行重启。最离谱的是，系统日志里经常能看到自动重启记录，明显是 IO 卡死触发的崩溃保护。二、跑分对比为了搞清楚究竟差在哪里，我用我的腾讯云腾讯云轻量，用 fio 做了简单对比：平台顺序读速顺序写速偶发延迟香港阿里轻量 2H2G60G≈ 95 MB/s≈ 140 MB/s500+ ms上海阿里轻量 2H4G80G≈ 115 MB/s≈ 150 MB/s500+ ms上海腾讯轻量 2H4G60G≈ 350 MB/s≈ 450 MB/s< 300 ms光看数字就知道，两者不是一个量级。腾讯轻量读写都三四百 MB/s，阿里只有它的三分之一不到。三、排查真凶：云盾监控组件既然规格相同，而差距如此巨大，八成是系统里有什么常驻进程在疯狂刷盘。重启后立刻用 iotop -aoP 持续观察，果然每次 IO 高峰时榜单前几名必定出现：aegis / yundun-*aliyun-servicecloudmonitor_ctl这就是阿里云盾及其监控组件。云盾会定时全盘扫描、收集日志、上传数据；CloudMonitor 会做资源监控和心跳。它们在高配置 ECS 上影响不大，可对低配轻量来说就是灾难：本就有限的 IOPS 被它们抢走，业务进程只能排队等磁盘，系统自然卡。阿里工单的回复也很直接："轻量 IO 有限制，属于正常现象"，暗示这就是产品定位——低价、低 IO。如果想提升只能上更高配或换 ECS。四、解决办法：卸载监控组件若只是跑个人服务，安全需求不高，其实完全可以把云盾和监控拆掉，马上能见效。阿里云卸载命令以下操作在 CentOS / Ubuntu 均验证通过：卸载阿里云盾wget "http://update2.aegis.aliyun.com/download/uninstall.sh" chmod +x uninstall.sh ./uninstall.sh卸载 CloudMonitorbash /usr/local/cloudmonitor/cloudmonitorCtl.sh stop bash /usr/local/cloudmonitor/cloudmonitorCtl.sh uninstall rm -rf /usr/local/cloudmonitor腾讯云卸载命令腾讯云同样有监控组件占用IO资源，卸载方法如下：步骤一：卸载 BaradAgent进入 BaradAgent 安装目录：cd /usr/local/qcloud/monitor/barad/admin卸载 BaradAgent（该命令不显示结果，如果不存在/usr/local/qcloud/monitor/barad文件夹，则说明卸载成功）：./uninstall.sh步骤二：卸载 Sgagent进入 Sgagent 安装目录：cd /usr/local/qcloud/stargate/admin卸载 Sgagent（该命令不显示结果，可执行crontab -l |grep stargate 命令查看是否有计划任务，若无计划任务，则说明卸载成功）：./uninstall.sh说明：BaradAgent 上报云服务器部分指标数据，卸载后会停止数据上报。Sgagent 基本占用极少的内存，但为了彻底释放IO资源，建议一并卸载。卸载完立即再测：延迟稳定在几十毫秒；跑分虽仍不及高配服务器，但至少不再卡死；一周连续运行，再没因 IO 崩过机。五、经验与建议轻量服务器定位"吃到饱"，IO 的确是硬限制。如果你对磁盘性能敏感，轻量本身就不适合，更别说还让监控组件抢资源。无备案或不依赖内网互通，建议对比选择。腾讯云轻量同价位性能更好，阿里云轻量价格便宜但IO受限，根据需求选择。必须留在某家云厂商（因为域名已备案、同区域内网通信等），第一件事就是卸载监控组件，把多余的守护进程全关掉，再定期用 iostat 或 fio 做健康检查。对安全有硬性要求，可以考虑自己装轻量级的入侵检测/日志审计工具，如 fail2ban、ossec 等，比官方监控组件轻得多。无论哪家轻量，及时备份 永远是刚需。IO 卡死、磁盘坏块、系统崩溃都不是稀奇事，手里有备份才能真正安心。六、写在最后轻量服务器便宜，却也充满坑。各大云厂商的监控组件都会占用一定IO资源，在低配轻量服务器上表现尤为明显。幸运的是，只要不是生产强安全场景，彻底卸载这些监控组件就能大幅缓解问题。如果你也被莫名其妙的高延迟折磨，不妨试试上面的卸载命令。祝大家的 VPS 都能远离卡顿，跑得顺畅！
面对非单次请求建议使用Session来发送请求1.对动态代理的支持更好2.比起直接request速度更快3.不用重复复制header更方便为什么推荐用 Session 管理代理集中配置：只需在一个地方设置，后续所有请求自动复用。连接复用：Session 会复用 TCP 连接，性能更优。动态多层代理支持更好：在多级代理链（如先走动态调度代理，再链式转发到后端代理）场景下，普通的 requests.get(..., proxies=...) 每次都会重新建立连接，可能丢失中间代理握手或认证上下文；而 Session 底层维护连接上下文，可正确建立并复用多层代理管道，避免连接失败。Session 的其他常用功能自定义请求头session.headers.update({ "User-Agent": "MyCrawler/1.0", "Accept-Language": "zh-CN,zh;q=0.9", })统一认证session.auth = ("username", "password")Cookie 管理Session 会自动保存服务器返回的 Set-Cookie，并在后续请求中带上；也可手动读写session.cookies.set("token", "abcdef123456")挂载适配器（Adapter）可对特定协议或域名进行重试、连接池大小等高级配置from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry retries = Retry(total=3, backoff_factor=0.5) adapter = HTTPAdapter(max_retries=retries, pool_maxsize=10) session.mount("https://", adapter)综合示例下面的示例展示了如何在一个 Session 中同时配置代理、请求头和认证，并发起一次请求：import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry # 创建会话 session = requests.Session() # 1. 代理配置 session.proxies.update({ "http": "http://用户名:密码@代理IP:端口", "https": "http://用户名:密码@代理IP:端口", }) # 2. 自定义请求头 session.headers.update({ "User-Agent": "MyAgent/1.0", "Accept-Language": "zh-CN,zh;q=0.9", }) # 3. 统一认证（如需要） session.auth = ("api_user", "secret_pass") # 4. 挂载带重试策略的 HTTPAdapter retries = Retry(total=3, backoff_factor=0.5) adapter = HTTPAdapter(max_retries=retries) session.mount("https://", adapter) # 发起请求 resp = session.get("https://httpbin.org/headers", timeout=(3, 10)) print(resp.json())注意事项超时配置：建议同时指定连接和读取超时，如 timeout=(3, 10)，防止代理卡住。认证信息安全：尽量通过环境变量或配置文件读取，不要硬编码到源码。SOCKS 代理：使用 SOCKS5 时需安装 requests[socks]，并写成 socks5://...。小结requests.Session 不仅能集中管理代理，还能轻松定制 headers、认证、Cookie、重试策略等，帮助你构建更稳定、可维护的 HTTP 客户端。
在CentOS 9 Stream上配置IPv6子网NDP代理完整指南背景和问题在IPv6环境中，服务提供商通常会分配一个/64的子网，但默认情况下只有一个地址可用。要使整个子网内的任意IPv6地址都能被路由到您的服务器，需要配置NDP(邻居发现协议)代理。本文介绍如何在CentOS 9 Stream上实现此功能。什么是NDP代理？IPv6使用邻居发现协议(NDP)来替代IPv4中的ARP协议。当路由器接收到发往特定IPv6地址的数据包时，它会发送邻居请求来确定哪台设备拥有该地址。NDP代理允许您的服务器响应发往整个子网的请求，即使这些地址尚未配置在服务器上。配置步骤1. 启用IPv6转发首先，需要启用IPv6转发和NDP代理功能：# 配置IPv6转发 echo "net.ipv6.conf.all.forwarding=1" > /etc/sysctl.d/99-ipv6-proxy.conf echo "net.ipv6.conf.default.forwarding=1" >> /etc/sysctl.d/99-ipv6-proxy.conf echo "net.ipv6.conf.all.proxy_ndp=1" >> /etc/sysctl.d/99-ipv6-proxy.conf echo "net.ipv6.conf.default.proxy_ndp=1" >> /etc/sysctl.d/99-ipv6-proxy.conf # 为特定接口启用转发和代理 echo "net.ipv6.conf.enp1s0.forwarding=1" >> /etc/sysctl.d/99-ipv6-proxy.conf echo "net.ipv6.conf.enp1s0.proxy_ndp=1" >> /etc/sysctl.d/99-ipv6-proxy.conf # 应用配置 sysctl -p /etc/sysctl.d/99-ipv6-proxy.conf2. 安装NDP代理守护程序(ndppd)# 启用EPEL源 dnf install -y epel-release # 安装ndppd dnf install -y ndppd3. 配置ndppd ！重要！# 创建配置文件，替换enp1s0为您的实际网络接口名称 可以ifconfig看 cat > /etc/ndppd.conf << EOF proxy enp1s0 { router no rule 2001:19f0:xxxx:xxxx::/64 { static } } EOF4. 创建PID文件目录# 创建PID文件目录 mkdir -p /var/run/ndppd chmod 755 /var/run/ndppd5. 启动ndppd服务# 启用ndppd服务开机自启 systemctl enable ndppd # 启动ndppd服务 systemctl start ndppd6. 添加本地路由这是关键步骤，确保系统能处理发往子网内任意地址的流量：# 添加本地路由 ！！非常重要！！ ip -6 route add local 2001:19f0:xxxx:xxxx::/64 dev lo7. 配置防火墙# 允许IPv6相关流量 firewall-cmd --permanent --zone=public --add-protocol=ipv6-icmp firewall-cmd --permanent --zone=public --add-service=dhcpv6-client firewall-cmd --reload验证配置使用tcpdump监控NDP请求和响应：# 监控NDP请求和响应 验证服务商是否支持NDP已知vultr支持 tcpdump -i enp1s0 icmp6 and '(ip6[40] = 135 or ip6[40] = 136)'正常情况下，当有外部设备尝试访问子网内的任意地址时，您应该能看到：外部设备发送邻居请求(Neighbor Solicitation)您的服务器回应邻居公告(Neighbor Advertisement)排障要点确保使用正确的网络接口名称：使用ip -6 addr show命令检查实际的接口名称检查ndppd服务状态：使用systemctl status ndppd确认服务正在运行PID文件权限问题：这通常不影响功能，只要服务显示为"active (running)"务必添加本地路由：如果NDP代理工作但仍无法ping通，很可能是缺少本地路由检查防火墙规则：确保允许ICMPv6流量完整的解决方案通过配置NDP代理和本地路由，您的CentOS 9 Stream服务器现在可以响应整个IPv6子网的请求，使子网内的任意地址都能被路由到服务器。这对于需要使用多个IPv6地址的场景（如网站托管、VPN服务等）非常有用。这种方法比手动为每个IPv6地址配置NDP代理更加高效，能够处理整个/64子网（包含约18.4×10^18个地址）。
前言本篇文章先写一部分最后整合。云函数服务商阿里云 支持到较新版本的python，在线开发体验还好，后台比较绕层数很多腾讯云 最多只支持到python3.7貌似很久没更新了在线开发bug有很多，默认openssl最多只支持到1.0.2亚马逊 未测试（免费）国内用的话还是优先阿里云把。#将环境安装到当前目录（为了避免错误这是必要的！！！） pip3 install --target=./ -r requirements.txt
如果您看到这篇文章,表示您的 blog 已经安装成功.