文章目录
- 一、背景说明
- 二、测试环境
- 三、离线安装包准备
- 四、上传离线安装包
- [五、安装 Python 依赖](#五、安装 Python 依赖)
-
- [1. 安装 six](#1. 安装 six)
- [2. 安装 python-dateutil](#2. 安装 python-dateutil)
- [3. 安装 python-magic](#3. 安装 python-magic)
- [4. 安装 s3cmd](#4. 安装 s3cmd)
- [六、验证 Python 模块是否正常](#六、验证 Python 模块是否正常)
- [七、配置 s3cmd](#七、配置 s3cmd)
- 八、基础连通性验证
-
- [1. 查看 s3cmd 版本](#1. 查看 s3cmd 版本)
- [2. 查看当前配置](#2. 查看当前配置)
- [3. 查看已有 Bucket](#3. 查看已有 Bucket)
- [九、Bucket 创建测试](#九、Bucket 创建测试)
- 十、小文件上传下载测试
-
- [1. 创建测试目录](#1. 创建测试目录)
- [2. 创建小文件](#2. 创建小文件)
- [3. 上传小文件](#3. 上传小文件)
- [4. 查看 Bucket 内容](#4. 查看 Bucket 内容)
- [5. 下载文件](#5. 下载文件)
- [6. 校验内容](#6. 校验内容)
- 十一、大对象上传测试
-
- [1. 生成 10MiB 测试文件](#1. 生成 10MiB 测试文件)
- [2. 上传 10MiB 文件](#2. 上传 10MiB 文件)
- [3. 查看容量统计](#3. 查看容量统计)
- [4. 递归查看对象](#4. 递归查看对象)
- 十二、大数据传输测试流程
-
- [1. 创建 1GB 文件](#1. 创建 1GB 文件)
- [2. 上传 1GB 文件](#2. 上传 1GB 文件)
- [3. 下载 1GB 文件](#3. 下载 1GB 文件)
- [4. MD5 校验](#4. MD5 校验)
- [十三、10GB 大文件测试](#十三、10GB 大文件测试)
-
- [1. 生成 10GB 文件](#1. 生成 10GB 文件)
- [2. 上传 10GB 文件](#2. 上传 10GB 文件)
- [3. 下载 10GB 文件](#3. 下载 10GB 文件)
- [4. 校验 MD5](#4. 校验 MD5)
- 十四、并发上传测试
- 十五、持续上传稳定性测试
- 十六、测试过程中建议观察的系统指标
-
- [1. 查看 CPU 和内存](#1. 查看 CPU 和内存)
- [2. 查看网卡流量](#2. 查看网卡流量)
- [3. 查看磁盘 IO](#3. 查看磁盘 IO)
- 十七、清理测试数据
-
- [1. 删除所有对象](#1. 删除所有对象)
- [2. 删除 Bucket](#2. 删除 Bucket)
- [3. 最终确认](#3. 最终确认)
- 我遇到的问题及处理
-
- [问题 1:安装 s3cmd 时自动访问 PyPI](#问题 1:安装 s3cmd 时自动访问 PyPI)
- [问题 2:python-dateutil 安装时报 setuptools_scm](#问题 2:python-dateutil 安装时报 setuptools_scm)
- [问题 3:配置文件中 access_key 写错](#问题 3:配置文件中 access_key 写错)
- [问题 4:host_bucket 配置不兼容](#问题 4:host_bucket 配置不兼容)
- [问题 5:python-magic 报 libmagic.so 找不到](#问题 5:python-magic 报 libmagic.so 找不到)
一、背景说明
在一些政务、医院、企业内网环境中,服务器通常无法直接访问公网,因此无法通过 yum install 或 pip install 在线安装工具。
本次场景是在 银河麒麟 V10SP3 测试机上,离线安装 s3cmd 2.4.0,然后通过 深信服 AD 硬件 IP 负载 访问后端 X10000 分布式存储资源池 的 S3 服务。
整体访问链路如下:
text
源测试机 -> 深信服 AD 硬件负载 -> X10000 分布式存储资源池
二、测试环境
| 项目 | 内容 |
|---|---|
| 操作系统 | 银河麒麟 V10SP3 |
| Python 版本 | Python 2.7 |
| S3 客户端 | s3cmd 2.4.0 |
| 访问协议 | S3 over HTTP |
| HTTPS | False |
| 负载设备 | 深信服 AD 硬件负载 |
| 后端存储 | X10000 分布式存储资源池 |
| 测试 Bucket | s3://fztest-demo |
三、离线安装包准备
由于服务器无法访问公网,所以需要提前下载好源码包,然后拷贝到目标服务器。
本次使用的安装包如下:
text
s3cmd-2.4.0.tar.gz
six-1.16.0.tar.gz
python-magic-0.4.27.tar.gz
python-dateutil-2.6.1.tar.gz
下载地址可以从 PyPI 获取:
https://pypi.org/project/s3cmd/2.4.0/#files
https://pypi.org/project/six/1.16.0/#files
https://pypi.org/project/python-magic/0.4.27/#files
https://pypi.org/project/python-dateutil/2.6.1/#files
注意:这里使用 python-dateutil-2.6.1,不要直接使用 2.8.2 或 2.7.5,因为在 Python2.7 离线环境中,它们会尝试下载 setuptools_scm,导致安装失败。(我测试了 2.8.2 和 2.7.5 都安装失败)
四、上传离线安装包
将安装包上传到服务器目录,例如:
bash
/home/squiduser
查看文件:
bash
cd /home/squiduser
ll
示例:
text
python-dateutil-2.6.1.tar.gz
python-magic-0.4.27.tar.gz
s3cmd-2.4.0.tar.gz
six-1.16.0.tar.gz

五、安装 Python 依赖
建议先安装依赖,再安装 s3cmd。
1. 安装 six
bash
cd /home/squiduser
tar xzf six-1.16.0.tar.gz
cd six-1.16.0
python setup.py install
cd ..
2. 安装 python-dateutil
bash
cd /home/squiduser
tar xzf python-dateutil-2.6.1.tar.gz
cd python-dateutil-2.6.1
python setup.py install
cd ..
安装成功后一般会看到类似输出:
text
Installed /usr/lib/python2.7/site-packages/python_dateutil-2.6.1-py2.7.egg
Finished processing dependencies for python-dateutil==2.6.1
3. 安装 python-magic
bash
cd /home/squiduser
tar xzf python-magic-0.4.27.tar.gz
cd python-magic-0.4.27
python setup.py install
cd ..
4. 安装 s3cmd
bash
cd /home/squiduser
tar xzf s3cmd-2.4.0.tar.gz
cd s3cmd-2.4.0
python setup.py install
安装完成后验证版本:
bash
s3cmd --version
正常输出:
text
s3cmd version 2.4.0

六、验证 Python 模块是否正常
执行:
bash
python - <<'PY'
for m in ("six", "dateutil", "magic"):
mod = __import__(m)
print(m, "OK", getattr(mod, "__file__", ""))
PY
正常情况下会看到:
text
six OK ...
dateutil OK ...
magic OK ...
如果 python-magic 报 libmagic.so 相关错误,需要安装系统库:
bash
yum install -y file file-libs
七、配置 s3cmd
s3cmd 的配置文件一般位于:
bash
~/.s3cfg
可以执行:
bash
vi ~/.s3cfg
示例配置如下:
ini
[default]
access_key = YOUR_ACCESS_KEY
secret_key = YOUR_SECRET_KEY
host_base = 10.xx.xx.xx:1234
host_bucket = 10.xx.xx.xx:1234
use_https = False
bucket_location = default
signature_v2 = False

说明:
text
access_key S3 访问 AK
secret_key S3 访问 SK
host_base S3 服务访问地址
host_bucket Bucket 访问地址模板
use_https 是否使用 HTTPS
bucket_location 默认区域
signature_v2 是否使用 V2 签名
注意不要把 access_key 写成 sccess_key,否则会导致认证失败(我当时写错了排查了半天)
如果你的对象存储需要 path-style 访问,也可以尝试:
ini
host_bucket = 10.xx.xx.xx:xxxx/%(bucket)s
具体以现场对象存储服务兼容方式为准。
八、基础连通性验证
1. 查看 s3cmd 版本
bash
s3cmd --version
2. 查看当前配置
bash
cat ~/.s3cfg
确认以下字段正确:
text
access_key
secret_key
host_base
host_bucket
use_https
3. 查看已有 Bucket
bash
s3cmd ls

九、Bucket 创建测试
创建测试 Bucket:
bash
s3cmd mb s3://fztest-demo
查看 Bucket:
bash
s3cmd ls

十、小文件上传下载测试
1. 创建测试目录
bash
mkdir -p /tmp/s3test
mkdir -p /tmp/download
2. 创建小文件
bash
echo "hello s3cmd" > /tmp/s3test/test1.txt
查看文件内容:
bash
cat /tmp/s3test/test1.txt
输出:
text
hello s3cmd
3. 上传小文件
bash
s3cmd put /tmp/s3test/test1.txt s3://fztest-demo/
4. 查看 Bucket 内容
bash
s3cmd ls s3://fztest-demo/
正常可以看到:
text
s3://fztest-demo/test1.txt
5. 下载文件
bash
s3cmd get s3://fztest-demo/test1.txt /tmp/download/
6. 校验内容
bash
cat /tmp/download/test1.txt

十一、大对象上传测试
1. 生成 10MiB 测试文件
bash
dd if=/dev/zero of=/tmp/s3test/test10m.bin bs=1M count=10
查看大小:
bash
ls -lh /tmp/s3test/test10m.bin
2. 上传 10MiB 文件
bash
s3cmd put /tmp/s3test/test10m.bin s3://fztest-demo/
3. 查看容量统计
bash
s3cmd du s3://fztest-demo
4. 递归查看对象
bash
s3cmd ls --recursive s3://fztest-demo

本次现场测试中,10MiB 对象上传成功,容量统计与递归列表结果均符合预期,截图中 10MiB 单对象上传速率约为 67.13 MB/s。该速率只能作为现场参考值,不等同于完整性能压测结论。
十二、大数据传输测试流程
如果需要进一步做大数据传输测试,可以增加 1GB、10GB、并发上传、下载校验等测试。
1. 创建 1GB 文件
bash
dd if=/dev/zero of=/tmp/s3test/test1g.bin bs=1M count=1024
查看文件:
bash
ls -lh /tmp/s3test/test1g.bin
2. 上传 1GB 文件
bash
time s3cmd put /tmp/s3test/test1g.bin s3://fztest-demo/
3. 下载 1GB 文件
bash
time s3cmd get s3://fztest-demo/test1g.bin /tmp/download/
4. MD5 校验
bash
md5sum /tmp/s3test/test1g.bin
md5sum /tmp/download/test1g.bin
两个 MD5 值一致,说明文件传输完整。
十三、10GB 大文件测试
1. 生成 10GB 文件
bash
dd if=/dev/zero of=/tmp/s3test/test10g.bin bs=1M count=10240
查看文件:
bash
ls -lh /tmp/s3test/test10g.bin
2. 上传 10GB 文件
bash
time s3cmd put /tmp/s3test/test10g.bin s3://fztest-demo/
3. 下载 10GB 文件
bash
time s3cmd get s3://fztest-demo/test10g.bin /tmp/download/
4. 校验 MD5
bash
md5sum /tmp/s3test/test10g.bin
md5sum /tmp/download/test10g.bin
十四、并发上传测试
创建多个 1GB 文件:
bash
cd /tmp/s3test
cp test1g.bin test1g_1.bin
cp test1g.bin test1g_2.bin
cp test1g.bin test1g_3.bin
cp test1g.bin test1g_4.bin
执行 4 并发上传:
bash
time (
s3cmd put /tmp/s3test/test1g_1.bin s3://fztest-demo/ &
s3cmd put /tmp/s3test/test1g_2.bin s3://fztest-demo/ &
s3cmd put /tmp/s3test/test1g_3.bin s3://fztest-demo/ &
s3cmd put /tmp/s3test/test1g_4.bin s3://fztest-demo/ &
wait
)
查看结果:
bash
s3cmd ls --recursive s3://fztest-demo
十五、持续上传稳定性测试
可以循环上传同一个文件,观察是否出现中断、超时、速度下降等情况。
bash
for i in {1..20}
do
echo "===== upload round $i ====="
time s3cmd put /tmp/s3test/test1g.bin s3://fztest-demo/test1g_round_${i}.bin
done
查看对象数量和容量:
bash
s3cmd du s3://fztest-demo
s3cmd ls --recursive s3://fztest-demo
十六、测试过程中建议观察的系统指标
1. 查看 CPU 和内存
bash
top
free -h
2. 查看网卡流量
bash
sar -n DEV 1
3. 查看磁盘 IO
bash
iostat -x 1
重点关注:
text
1. 上传速度是否稳定
2. 下载速度是否稳定
3. 是否出现超时
4. 是否出现认证失败
5. CPU 是否打满
6. 网卡是否跑满
7. 磁盘 IO 是否成为瓶颈
8. 大文件 MD5 是否一致
9. 并发上传是否存在失败对象
十七、清理测试数据
测试完成后,可以清理 Bucket 中的数据。
1. 删除所有对象
bash
s3cmd del --recursive s3://fztest-demo
2. 删除 Bucket
bash
s3cmd rb s3://fztest-demo
3. 最终确认
bash
s3cmd ls
确认测试 Bucket 已删除。
我遇到的问题及处理
问题 1:安装 s3cmd 时自动访问 PyPI
报错示例:
text
Reading https://pypi.org/simple/python-magic/
Download error ...
No local packages or working download links found for python-magic
原因:
text
离线环境无法访问 PyPI,但 setup.py 会尝试自动下载依赖。
解决方法:
text
提前下载 python-magic、python-dateutil、six 源码包,先离线安装依赖,再安装 s3cmd。
问题 2:python-dateutil 安装时报 setuptools_scm
报错示例:
text
Could not find suitable distribution for Requirement.parse('setuptools_scm')
原因:
text
部分 python-dateutil 版本安装时需要 setuptools_scm,离线环境无法自动下载。
解决方法:
text
安装 python-dateutil-2.6.1。
问题 3:配置文件中 access_key 写错
错误示例:
ini
sccess_key = xxxxx
正确写法:
ini
access_key = xxxxx
问题 4:host_bucket 配置不兼容
可以先使用:
ini
host_bucket = 10.xx.xx.xx:1234
如果访问 Bucket 异常,可以尝试:
ini
host_bucket = 10.xx.xx.xx:1234/%(bucket)s
具体取决于对象存储服务使用 path-style 还是 virtual-hosted-style。
问题 5:python-magic 报 libmagic.so 找不到
解决方法:
bash
yum install -y file file-libs