简介:本资源面向需要在无外网环境下开展Linux性能压测的运维与后端人员,提供CentOS平台stress工具的离线安装方案,解决内网服务器无法通过yum在线获取压测组件的问题。压缩包共43个文件,约46.66MB,以rpm依赖包为主,同时包含configure、install-sh等构建脚本,以及readme、changelog、news等说明文档和源码相关文件,兼顾直接安装与源码编译两种使用方式。资源描述中提及附带sar命令,便于在压测过程中同步采集系统性能数据,形成压力施加与指标观测的完整链路。目前已有2589人学习下载,适合具备一定Linux基础、需要验证服务器CPU、内存、IO等负载能力的工程师参考使用,可帮助快速完成离线部署并开展稳定性与容量测试。
1. 离线环境装 stress:为什么你下的包总是缺依赖
机房内网一台 CentOS 7.9 要压测,外网连不上,yum 源全是内网镜像,yum install stress直接报找不到包。这种场景我遇到过不止一次——不是 stress 本身难装,是离线环境里依赖链断了一环,你根本不知道断在哪。stress 是个极简的 Linux 压力测试工具,就一个二进制加一个 man page,但它依赖 libgomp、libstdc++ 这些基础库,CentOS 最小化安装时不一定齐全。很多人从某台能上网的机器上yumdownloader stress拷过来,rpm -ivh一执行就报Failed dependencies,然后开始一个个手动找 so 文件,越找越乱。这篇笔记面向的是需要在无外网 CentOS 上完成 stress 离线安装的运维和开发,从版本选择、依赖梳理、rpm 安装到编译兜底,把每一步的命令和参数都写清楚,照着走能跑通,装坏了也知道怎么回退。
2. 装之前先定版本:CentOS 7/8 该选哪个 stress 包
2.1 确认系统版本和架构
离线安装最怕拿错包。CentOS 7 和 CentOS 8 的 glibc 版本不同,stress 的 rpm 包不能混用。先确认目标机器的系统版本和 CPU 架构:
# 查看系统发行版和版本号 cat /etc/centos-release # 查看内核版本,辅助判断兼容性 uname -r # 查看 CPU 架构,决定下载 x86_64 还是 aarch64 的包 uname -m/etc/centos-release输出类似CentOS Linux release 7.9.2009 (Core),这就是你选包的依据。uname -m输出x86_64就下 x86_64 的 rpm,输出aarch64就得找 ARM 架构的包。我一般会在能上网的机器上执行同样的命令,确保两边架构一致再下载。如果目标机器是 CentOS 8,/etc/centos-release会显示CentOS Linux release 8.x,这时候用 CentOS 7 的 rpm 大概率会因为 glibc 版本不匹配而失败。
2.2 stress 版本选择和获取方式
stress 的版本更新很慢,1.0.4 是流传最广的稳定版,1.0.7 修了一些信号处理的边界问题。CentOS 7 的 EPEL 源里长期提供的是 1.0.4-16.el7 这个版本,CentOS 8 的 EPEL 里是 1.0.4-24.el8。离线环境下你有两条路:一是直接拿对应版本的 rpm 包,二是拿源码包自己编译。rpm 包省事但依赖必须齐,源码编译灵活但需要 gcc 和 make。
我一般优先找 rpm,因为 stress 的依赖不多,凑齐的概率大。获取 rpm 的常见做法是在一台同版本 CentOS 上执行:
# 安装 yum-utils 以获得 yumdownloader 工具 yum install -y yum-utils # 下载 stress 的 rpm 包到当前目录,不安装 yumdownloader stress # 同时下载它的所有依赖包,--resolve 会自动解析依赖树 yumdownloader --resolve stressyumdownloader会把 stress 及其依赖的 rpm 全部下到当前目录。--resolve是关键参数,不加它只会下 stress 一个包,依赖还得自己找。下载完成后你会看到类似stress-1.0.4-16.el7.x86_64.rpm和libgomp-4.8.5-44.el7.x86_64.rpm这样的文件。把这些 rpm 全部拷到目标机器的同一个目录下,后面统一安装。
提示:如果目标机器是 CentOS 8,把上面的命令在 CentOS 8 环境里执行,不要用 CentOS 7 的包替代。
2.3 依赖清单和版本对照
stress 在 CentOS 7 上的直接依赖通常只有两个:libgomp和libstdc++。但libstdc++又依赖glibc,glibc的版本是系统自带的,一般不用动。下面这张表是我在 CentOS 7.9 最小化安装环境里实测的依赖对照:
| 包名 | CentOS 7 典型版本 | 是否必须 | 说明 |
|---|---|---|---|
| stress | 1.0.4-16.el7 | 是 | 主程序 |
| libgomp | 4.8.5-44.el7 | 是 | OpenMP 运行时库 |
| libstdc++ | 4.8.5-44.el7 | 是 | C++ 标准库 |
| glibc | 2.17-317.el7 | 系统自带 | 一般无需单独安装 |
在目标机器上用rpm -q检查这些包是否已存在:
# 逐个检查依赖包是否已安装 rpm -q libgomp libstdc++ glibc # 如果输出 "package xxx is not installed" 就需要补装如果libgomp和libstdc++都已经在系统里,那你只需要拷 stress 一个 rpm 过去就行。最小化安装的 CentOS 7 通常缺libgomp,libstdc++一般都有。这一步先查清楚,能少拷很多不必要的包。
3. 离线安装实操:rpm 和源码编译两条路
3.1 用 rpm 安装 stress 及依赖
把所有 rpm 包放到目标机器的/tmp/stress-offline/目录下,然后一次性安装。我习惯用rpm -ivh而不是yum localinstall,因为离线环境下 yum 可能因为源配置问题卡住,rpm 更直接:
# 进入存放 rpm 包的目录 cd /tmp/stress-offline/ # 一次性安装目录下所有 rpm,--nodeps 不要加,让 rpm 自己检查依赖 rpm -ivh *.rpm-i是安装,-v显示详细信息,-h显示进度条。如果依赖齐全,你会看到每个包依次安装成功。如果报Failed dependencies,说明还有包没拷全,根据报错信息里的包名回到能上网的机器上继续yumdownloader下载。注意不要加--nodeps强行安装,那样即使装上了 stress 也跑不起来,运行时会报error while loading shared libraries。
安装完成后验证:
# 查看 stress 是否安装成功 rpm -q stress # 查看 stress 版本 stress --versionrpm -q stress输出stress-1.0.4-16.el7.x86_64就说明装上了。stress --version输出stress 1.0.4说明二进制能正常执行。
3.2 源码编译作为兜底方案
如果 rpm 依赖实在凑不齐,或者目标机器是 CentOS 8 而手头只有 CentOS 7 的包,源码编译是更稳的路。需要目标机器上有 gcc 和 make,离线环境下这两个工具如果也没有,就得先补装gcc、make、glibc-devel这几个 rpm。
源码包从 stress 的官方发布页获取,通常是一个stress-1.0.4.tar.gz文件。拷到目标机器后:
# 解压源码包 tar -zxvf stress-1.0.4.tar.gz # 进入解压后的目录 cd stress-1.0.4/ # 配置编译选项,--prefix 指定安装路径 ./configure --prefix=/usr/local/stress # 编译,-j4 表示用 4 个核并行编译,加快速度 make -j4 # 安装到指定路径 make install--prefix=/usr/local/stress把 stress 装到独立目录,不污染系统路径,卸载时直接删目录就行。make -j4的-j参数根据目标机器的 CPU 核数调整,核多就写大一点。编译过程中如果报gcc: command not found,说明 gcc 没装,需要先补装 gcc 的 rpm 包。如果报configure: error: C compiler cannot create executables,通常是glibc-devel缺失。
编译安装后需要把/usr/local/stress/bin加到 PATH 里:
# 临时生效,当前终端可用 export PATH=$PATH:/usr/local/stress/bin # 永久生效,写入 profile echo 'export PATH=$PATH:/usr/local/stress/bin' >> /etc/profile source /etc/profileexport PATH只对当前会话有效,写入/etc/profile后对所有用户永久生效。source /etc/profile让修改立即生效,不用重新登录。
3.3 安装后的目录结构和文件确认
rpm 安装和源码编译安装的文件分布不同,确认一下关键文件在哪:
# rpm 安装的查询文件列表 rpm -ql stress # 源码编译的查看安装目录 ls -la /usr/local/stress/bin/rpm 安装的 stress 二进制在/usr/bin/stress,man page 在/usr/share/man/man1/stress.1.gz。源码编译的二进制在/usr/local/stress/bin/stress。确认二进制存在且可执行,后面压测才能正常调用。
4. 避坑排查:离线装 stress 最容易翻车的五个点
4.1 报错 Failed dependencies 但不知道缺哪个包
现象是rpm -ivh stress-1.0.4-16.el7.x86_64.rpm输出Failed dependencies: libgomp.so.1()(64bit) is needed by stress-...。原因是目标机器没装libgomp。解决方法是回到能上网的机器执行yumdownloader --resolve stress,把libgomp的 rpm 一起拷过来。如果yumdownloader也解析不出来,直接用rpm -q --whatprovides 'libgomp.so.1()(64bit)'在能上网的机器上查是哪个包提供的,然后单独下载那个包。
4.2 装完后执行 stress 报 cannot open shared object file
现象是stress --version输出stress: error while loading shared libraries: libgomp.so.1: cannot open shared object file: No such file or directory。原因是 rpm 安装时用了--nodeps强行跳过依赖检查,或者libgomp装了但路径不对。解决方法是先rpm -q libgomp确认包在不在,不在就补装;在的话用ldconfig刷新动态链接库缓存:
# 刷新动态链接库缓存 ldconfig # 再次验证 stress --versionldconfig会重新扫描/etc/ld.so.conf里配置的库路径,把新装的库纳入缓存。如果还不行,用ldd $(which stress)查看 stress 依赖的每个 so 文件的实际路径,缺哪个补哪个。
4.3 CentOS 8 上装了 CentOS 7 的包导致 glibc 版本冲突
现象是rpm -ivh报libc.so.6(GLIBC_2.28)(64bit) is needed之类的错误。原因是 CentOS 8 的 glibc 是 2.28,CentOS 7 的包编译时依赖的是 2.17,版本对不上。解决方法是不要在 CentOS 8 上装 CentOS 7 的 rpm,要么找 CentOS 8 的 EPEL 包,要么直接源码编译。源码编译时用的是目标机器自己的 glibc,不存在版本冲突。
4.4 源码编译时 make 报错找不到 gcc
现象是./configure或make阶段报gcc: command not found或make: command not found。原因是目标机器最小化安装,没装编译工具链。解决方法是先离线补装gcc、make、glibc-devel、kernel-headers这几个 rpm。在能上网的机器上执行:
# 下载编译工具链的 rpm 及依赖 yumdownloader --resolve gcc make glibc-devel kernel-headers把这些包拷到目标机器安装后再重新编译 stress。
4.5 安装后 PATH 没生效,直接敲 stress 提示 command not found
现象是源码编译安装到/usr/local/stress/bin后,直接敲stress提示找不到命令。原因是/usr/local/stress/bin不在 PATH 里。解决方法是按 3.2 节的方法把路径写入/etc/profile并source生效。如果不想改 profile,也可以创建软链接:
# 创建软链接到 /usr/local/bin,该目录默认在 PATH 里 ln -s /usr/local/stress/bin/stress /usr/local/bin/stressln -s创建符号链接,/usr/local/bin默认在 PATH 中,这样不用改环境变量也能直接调用。
5. 装完怎么验证:三条命令确认 stress 真能跑起来
装完不验证等于没装。我一般用三条命令逐层确认:先看版本,再跑一个短时压测,最后检查系统负载是否真的上去了。
第一条,确认二进制可执行:
# 查看版本,能输出版本号说明二进制和依赖都没问题 stress --version第二条,跑一个 10 秒的 CPU 压测,开 2 个 worker:
# -c 2 表示启动 2 个 CPU 压力进程,-t 10 表示持续 10 秒 stress -c 2 -t 10-c 2是 CPU 压力进程数,-t 10是超时时间,单位秒。执行后你会看到 stress 输出stress: info: [pid] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd,然后等 10 秒自动退出。如果这 10 秒内没有报错,说明 stress 能正常调度 CPU 压力。
第三条,在另一个终端用top或uptime观察负载:
# 查看 1 分钟、5 分钟、15 分钟的平均负载 uptime # 或者用 top 看 CPU 使用率 top -bn1 | head -5uptime输出的load average三个值分别对应 1、5、15 分钟的平均负载。跑stress -c 2时,如果机器是 2 核,load average 应该接近 2.0。top -bn1的-b是批处理模式,-n1是只刷新一次,适合脚本里抓取。如果 load 没变化,说明 stress 没真正跑起来,回到第 4 章排查。
内存压测也顺手验一下:
# -m 1 表示启动 1 个内存压力进程,--vm-bytes 256M 表示每个进程分配 256MB stress -m 1 --vm-bytes 256M -t 10-m 1是内存压力进程数,--vm-bytes 256M是每个进程分配的内存大小。跑的时候用free -m看内存变化,确认 stress 确实在吃内存。
从那以后我每次离线装完 stress,都强制走一遍「版本 → CPU 压测 → 内存压测 → load 确认」这四步,不看到 load average 真的上去不算完。希望帮到你。
本文还有配套的精品资源,点击获取