
如何本地模拟受限 S3 网络Qdrant s3_proxy 带宽限制与延迟模拟设置【免费下载链接】qdrantQdrant - High-performance, massive-scale Vector Database and Vector Search Engine for the next generation of AI. Also available in the cloud https://cloud.qdrant.io/项目地址: https://gitcode.com/GitHub_Trending/qd/qdrant如果你需要测试依赖 S3 对象存储的代码路径例如 Qdrant edge 的 S3 相关逻辑但又不想真的连到一个远端 bucket 再靠慢速网络碰运气可以在本地用 Docker 起一个“受限”的 S3 端点把本地目录当作 S3 存储暴露出来同时在容器出方向上用 Linuxtc强制限带宽、加延迟模拟生产网络。Qdrant 仓库自带了这个工具s3_proxy一个自包含的 shell 脚本 s3_proxy.sh驱动一个 Docker 容器完成全部工作。完成本文后你可以做到在http://localhost:9000上获得一个可写入、可读的本地 S3 端点文件系统后端随时把它的出方向带宽钳制到指定速率如10gbit、1gbit并叠加单向延迟与抖动用status和bench核对限流确实生效。前置条件文档列出的要求只有 Docker。首次使用时脚本会拉取两个镜像andrewgaul/s3proxyS3 服务器文件系统后端nicolaka/netshootsidecar 容器用于在服务器容器的网络命名空间里执行tc命令只给 sidecar 加NET_ADMINcapability宿主机不需要 sudo。工具目录位于 lib/edge/tools/s3_proxy所有命令都在该目录下执行。启动受限 S3 端点cd lib/edge/tools/s3_proxy ./s3_proxy.sh up注意两个行为细节up会先删除已存在的同名容器s3-proxydocker rm -f再启动新容器脚本会在data/bucket下创建目录并把$DATA_DIR直接作为 S3 存储chmod -R arX使其可读。从 s3_proxy.sh 的实现看up [RATE]的第二个位置参数是延迟缺省取LATENCY_DEFAULT默认50ms所以默认一次up会同时应用10gbit带宽上限 50ms延迟。启动后脚本会轮询端点直到返回 HTTP 200/403再执行限流。启动成功后data/bucket/key下的文件会作为http://localhost:9000/bucket/key提供默认 bucket 是test-bucket。放入测试数据可选不需要mc/aws/rclone直接复制目录即可./s3_proxy.sh stage /path/to/dir my-prefix这会把/path/to/dir里的文件拷进data/test-bucket/my-prefixPREFIX缺省为源目录的 basename之后这些文件以bucket/prefix/...的形式作为 S3 对象提供。副作用是数据被复制进脚本目录下的data/存储区stage本身不删除任何东西。设置带宽限制与延迟限流的核心命令./s3_proxy.sh throttle 1gbit # 只限速率 ./s3_proxy.sh throttle 10gbit 20ms # 速率 20ms 延迟 ./s3_proxy.sh throttle 10gbit 20ms 5ms # 再加 5ms 抖动 ./s3_proxy.sh unthrottle # 移除限制恢复线速三个参数的文档定义来自 s3_proxy.sh 的注释RATE带宽上限通过tbf实现例如10gbit/1gbit/200mbit。脚本按速率量级自动调整 burst*mbit/*mbps用1mb*kbit用64kb其余10mbDELAY可选的出方向单向延迟netem如20ms/50ms省略或为0表示不加JITTER可选DELAY 的正负抖动如5ms前提是给了 DELAY。构建顺序是tbf(root, rate) - netem(child, delay)作用在容器eth0IFACE可改的出方向。文档说明选tbf做速率钳制是因为它在 10 Gbit 下准确而netem自带的rate不准确所以netem只用来加延迟。限流参数也可以通过环境变量一次性预设见 READMEDATA_DIR默认./data、BUCKETtest-bucket、PORT9000、RATE_DEFAULT10gbit、LATENCY_DEFAULT50ms、CONTAINERs3-proxy、IFACEeth0以及S3PROXY_IMAGE、NETSHOOT_IMAGE。例如想换一个端口和 bucketPORT8900 BUCKETqa-bucket ./s3_proxy.sh up验证限流是否生效看状态status输出容器状态、tcqdisc 配置和 bucket 对象列表./s3_proxy.sh status它会打印容器信息docker ps、容器 eth0 上的 qdisctc qdisc show以及通过?list-type2列出的 bucket 中对象数量与前 8 个 key。throttle命令执行后也会直接回显应用后的 qdisc。测吞吐bench会用curl下载对象并打印测得速率./s3_proxy.sh bench默认 key 是test-bucket/bigfile如果该对象不存在脚本会自动创建一个 2GB 的稀疏文件sparse objectmkfile -n 2g或truncate -s 2G位于data/下——也就是说bench首次运行会往本地数据目录写一个 2GB 文件磁盘上只占元数据大小的稀疏文件。文档给出的实测参考值作为“文档示例”理解不是你必须得到的固定数字设置实测吞吐throttle 10gbit约 9.6 Gbit/sthrottle 1gbit约 0.96 Gbit/s不限制loopback15–33 Gbit/s文档结论是上限确实“咬住”了大块传输the cap binds。限制与适用边界延迟加在服务端出方向即每个 GET 响应方向是 per-request 的小对象、多 GET 的负载受延迟影响最大。大 DELAY 会压低短传输的吞吐TCP 慢启动在带宽-时延积bandwidth-delay product下达不到线速只有长传输才能摸到速率上限。这是真实链路上的行为速率上限始终是天花板不是被突破的软限。上限对任意客户端生效限制打在容器出方向本地或远端客户端都受限。远端容器可以走发布端口访问例如host.docker.internal:9000。限流只作用在容器的eth0出方向修改IFACE环境变量时对应的是容器内网口不是宿主机网卡。清理./s3_proxy.sh downdown会停止并删除s3-proxy容器副作用容器内的 qdisc 随之消失但data/里已 stage 的文件和 bench 生成的 2GB 对象会保留在磁盘上需要的话自行处理该目录。整套流程就是up起服务 → 按需stage数据 →throttle RATE [DELAY] [JITTER]调整网络 →status/bench核对 →down收尾。所有参数取值均来自 README 与 s3_proxy.sh 的注释脚本头部注释块也可以直接作为帮助打印执行./s3_proxy.sh不带参数时。【免费下载链接】qdrantQdrant - High-performance, massive-scale Vector Database and Vector Search Engine for the next generation of AI. Also available in the cloud https://cloud.qdrant.io/项目地址: https://gitcode.com/GitHub_Trending/qd/qdrant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考