0.前言

        这是一个令人发狂的故事,我需要在一个网络有限制的CentOS7的linux环境中进行显卡的压力测试(烤机),受环境限制GLIBC只能到2.17版本无法升级(升级GLIBC的风险极大而且也很麻烦),这就导致了主流的什么furmark(对!这货竟然出linux版了!)、GPU-burn等等全用不了.....因为CUDA的版本是12.8,他们都需要GLIBC2.18以上版本支持.....折腾了半宿,终于是用nvidia自带的cuda-samples中的样例完成了这次测试.....非常麻烦,而且,其实效果不如那些专业工具,所以,如果有一线希望,都去升级GLIBC版本吧!这个文章只适用于低版本GLIBC且显卡为nvidia系列且CUDA版本比较高(即GLIBC和CUDA版本不匹配)的用户。

1.各种工具下载

编号  软件名下载地址说明
1cuda-samplescuda-samples官方下载地址nvidia官方测试样例
2cmakecmake官方下载地址

cmake编译

2.操作流程

2.1.下载并配置cuda-samples

2.1.1.下载cuda-samples

        首先检查nvidia的驱动有没有正确安装

nvidia-smi

        若输出类似以下信息则证明驱动安装正确,若无输出或提示命令不存在则需要先安装显卡驱动

        检查 CUDA 工具包

nvcc --version

        若正确安装了则会输出cuda版本相关信息,若没有信息输出或提示命令不存在,则需要重新安装cuda或重新设置环境变量

        检查现有Samples 

        通常默认安装位置为:/usr/local/cuda/samples/

        可以通过查询命令查看是否存在

ls /usr/local/cuda/samples/

        进入samples目录后,查看是否存在内容,如果存在,恭喜,你能省点事儿了,如果不存在,继续吧.....(我的就不存在,ε=(´ο`*)))唉)

        下载官方samples

        首先需要确定自己的CUDA版本

nvcc --version

        输出结果如下,红框中的就是版本号

        根据你的CUDA版本号,在nvidia官方的下载地址(cuda-samples下载地址)下载对应版本号的cuda-samples,下载成功,你会得到一个压缩包

        将这个压缩包放到你的被测服务器的任意位置,方便日后使用,放到原本的/usr/local/cuda/samples/目录下就可以

2.1.2.构建CUDA-samples

        解压上一步的压缩包

tar -zxvf cuda-samples-12.8.tar.gz

        并进入到解压后的文件目录,这个时候你会看到一个CMakelists.exe文件,证明这个包需要使用cmake进行编译,我们先在当前目录新建一个目录名字任意,为了方便记忆我的就叫build了

mkdir build

        进入这个build,并执行编译命令

#cmake后面的..表示需要编译的内容在上一层
cmake ..

        如果可以编译成功,那恭喜你是天选之人,不成功的接着往下看

2.1.2.1.安装cmake

        首先就是cmake命令不存在或者类似的报错,这个时候需要先下载安装cmake,由于我的网络无法直接下载,所以只能手动下载后再编译安装

        首先,从官网(cmake官方下载地址)选择并下载合适的安装包

        下载成功我们会获得一个压缩包

        将这个压缩包放到你的linux服务器的任意目录下,为了方便管理,最好把所有工具放在一个大的目录下,效果类似如下

        解压上述压缩包

tar -zxvf cmake-4.1.0.tar.gz

        获得一个cmake的文件夹

        进入这个文件夹

cd cmake-4.1.0

        使用ll命令可以查看当前路径下的文件信息,找到bootstrap文件

        运行它(运行引导配置脚本 (bootstrap))

./bootstrap

        如果出现如下报错,证明缺少openssl插件库,一般也会顺带缺少一些c++编译相关的插件之类的。

        安装缺少的插件依赖

sudo yum groupinstall "Development Tools"
sudo yum install openssl-devel

        上述插件依赖安装完成后,再次执行./bootstrap命令,看到类似下面的信息,证明配置脚本运行成功

        执行gmake命令,开始编译

gmake

        当看到类似如下信息,证明编译成功

        运行如下命令,安装cmake

sudo make install

        安装完成后,使用下列命令验证安装是否成功

cmake --version

        若有类似版本信息,则证明cmake安装成功,我们可以回去继续构建CUDA-samples啦

        好了,现在cmake安装好了,可以回到2.1.2继续尝试构建了,再次尝试构建,可能报如下错误,这个是由于你的编译器版本太低不支持c++17的一些特性导致的

        这个时候我们可以先尝试更新一下编译器

sudo yum install centos-release-scl
sudo yum install devtoolset-11-gcc devtoolset-11-gcc-c++

        执行sudo yum install centos-release-scl后看到如下提示,证明安装成功了

        执行sudo yum install devtoolset-11-gcc devtoolset-11-gcc-c++的时候,可能会看到如下报错

        这个时候,有两种情况,第一种是其实已经下载了并且存在,只是没有启动,这种情况执行如下命令启动devtoolset-11,这个命令只在当前会话有效

source /opt/rh/devtoolset-11/enable

        执行完毕后检查版本

gcc --version
g++ --version

        如果版本已经更新,就不需要换源下载操作了,如果发现版本确实没有更新,可以尝试下面的换源操作后,重新安装:

1、访问阿里云官网(阿里云源官网链接)查看源链接

2、备份自己本来的源配置文件

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

3、在阿里云官网上找到自己的系统对应的配置,我的是centos 7所以找到对应配置,直接复制粘贴到自己服务器上执行即可

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

4、运行 yum makecache 生成缓存

5、重新尝试安装

在确定gcc和g++版本更新后后,可以使用以下命令永久启用devtoolset-11。

echo "source /opt/rh/devtoolset-11/enable" >> ~/.bashrc
source ~/.bashrc

好了,我们继续回去构建CUDA-samples(如果不是边操作编写,我都快忘了我的目的是干啥了.....)

如果看到如下提示,恭喜,建camke终于成功了!

        成功后,build中文件情况如下

        执行make命令进行构建,如果提示全部成功,恭喜你,运气不错,我因为没全部成功过(因为GLIBC版本过低,一些样例一定会失败),就没法截图了,下面我来说一下没全部成功的情况,如果看到类似下图中错误,证明一些样例没有成功make,因为GLIBC版本过低

        不重要,我们这个时候只make我们需要的样例即可,执行下面这个命令

make matrixMul

        看到如下提示证明make成功

        执行下面这个命令

make simpleZeroCopy

        看到如下提示证明make成功

2.1.3.测试samples

        首先,回忆一下我们要干啥,我们要压测显卡.....(真的快忘了),samples里面有非常多的样例可以干很多事,不过,其实,我们主要用到两个:matrixmul和simpleZeroCopy。

        打开显卡的性能检测软件,可以使用任意监测工具,或者nvidia-smi命令或者自己搞一套性能监测平台,方法参考windows部署基于Prometheus+Grafana的性能资源监控平台-CSDN博客

2.1.3.1.matrixmul(乘法矩阵)

        matrixmul使用不断运算乘法矩阵的方式模拟gpu运算压力,通俗来说也就是可以拉高GPU使用率,模拟GPU高占用情况

        首先我们进入matrixmul的目录。

        注意,我的是放在了home目录下所以是从home开始,这里需要进入自己放cuda-samples的路径。

home/cuda-samples-12.8/build/Samples/0_Introduction/matrixMul

        执行如下命令

./matrixMul -wA=4096 -hA=4096 -wB=4096 -hB=4096

        看到类似提示,证明执行成功了

        同时,可以查看性能监测看到GPU使用率被拉高了一下

        但是,这样,只会执行一次,肯定是没法用于压测,我们可以使用如下命令,使上面的命令重复执行,达到持续拉高gpu使用率的效果。

while true; do ./matrixMul -wA=4096 -hA=4096 -wB=4096 -hB=4096; done

        (但是,注意,这个命令执行是有间隔的,无法100%保持GPU运算占用,这就是为什么不到万不得已不要使用这种压测方式,他无法长时间100%维持GPU100%占用,压测效果不如专业压测工具)

2.1.3.2. simpleZeroCopy (零拷贝内存)

        simpleZeroCopy通过拷贝的方法占用内存,并且让GPU直接访问锁页系统内存来测试PCIe带宽极限,避免传统拷贝开销,最大化测量内存传输性能,通俗来讲就是拉高显存占用,模拟高显存占用情况。

        首先我们进入matrixmul的目录。

        注意,我的是放在了home目录下所以是从home开始,这里需要进入自己放cuda-samples的路径。

cd home/cuda-samples-12.8/build/Samples/0_Introduction/simpleZeroCopy

        这个样例,直接执行只会产生瞬间占用,几乎无法被记录到,我们需要写一个脚本来达到持续占用显存的目的。

        首先执行下列命令

cat > continuous_mem_test_fixed.cu << 'EOF'
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>  // 添加这行,包含 sleep() 函数
#include <cuda_runtime.h>

int main(int argc, char **argv) {
    size_t size = 16 * 1024 * 1024 * 1024ULL; // 16GB
    if (argc > 1) {
        size = atoll(argv[1]) * 1024 * 1024 * 1024ULL;
    }

    printf("Starting continuous GPU memory stress test\n");
    printf("Allocating %.2f GB of GPU memory...\n", size / 1024.0 / 1024.0 / 1024.0);

    float *d_data;
    cudaError_t err = cudaMalloc(&d_data, size);
    
    if (err != cudaSuccess) {
        printf("Memory allocation failed: %s\n", cudaGetErrorString(err));
        return 1;
    }

    printf("✅ Successfully allocated %.2f GB\n", size / 1024.0 / 1024.0 / 1024.0);
    printf("Memory will be held until Ctrl+C is pressed\n");
    printf("GPU memory usage should remain constant at %.2f GB\n", size / 1024.0 / 1024.0 / 1024.0);

    // 持续进行内存访问以保持活跃
    while (true) {
        // 定期进行内存操作防止超时
        cudaMemset(d_data, 0, 1024); // 只操作少量内存
        sleep(1); // 每秒一次小操作
    }

    cudaFree(d_data);
    return 0;
}
EOF

        生成源文件continuous_mem_test_fixed.cu

        编译并授权这个文件

#1.编译文件
nvcc continuous_mem_test_fixed.cu -o continuous_mem_test
#2.授权
chmod +x continuous_mem_test

        得到文件continuous_mem_test

        执行下列命令

cat > run_continuous.sh << 'EOF'
#!/bin/bash
SIZE=${1:-16}  # 默认16GB

echo "Starting continuous memory test with ${SIZE}GB allocation"
echo "Press Ctrl+C to stop"

while true; do
    echo "=== Cycle started at: $(date) ==="
    ./continuous_mem_test $SIZE
    if [ $? -ne 0 ]; then
        echo "Test failed, retrying in 5 seconds..."
        sleep 5
    else
        echo "Test completed successfully"
    fi
done
EOF

        得到脚本run_continuous.sh,注意上述脚本中的size大括号中的16表示占用16G显存,这个参数需要根据自己的显卡显存进行调整,并且有内置限制,无法设置全部显存,会有显存不足提示,这也是samples样例做压测的局限性。每次调整后需要重新授权再启动即可。

        给他受个权

chmod +x run_continuous.sh

        启动脚本

        看到如下提示,证明脚本启动成功

        同时,可以查看性能监测看到GPU显存占用被拉高了。

好了,打完收工,有些细节还需要调整完善,之后有空在搞,先这样吧,ε=(´ο`*)))唉.....

Logo

欢迎来到FlagOS开发社区,这里是一个汇聚了AI开发者、数据科学家、机器学习爱好者以及业界专家的活力平台。我们致力于成为业内领先的Triton技术交流与应用分享的殿堂,为推动人工智能技术的普及与深化应用贡献力量。

更多推荐