zoukankan      html  css  js  c++  java
  • Linux极端场景模拟实现

    一、高CPU占用

    1.1 使用长时间任务

    高cpu很自然会想到的是让操作系统不停地在做事,而不停做事的有做一件很久的事和做死循环两种实现方式。

    但是现践来看不管是哪种实现都只能占用一定比例的cpu,在cpu原本空闲的情况下很难使cpu占用到百分之八九十。

    # 计算/dev/zero的sha1值
    sha1sum /dev/zero
    # 不断从/dev/zero读数据输出到/dev/null
    dd if=/dev/zero of=/dev/null
    # 列循环
    while true; do echo; done

    1.2 使用stress实现

    # 安装
    yum install stress -y
    # 查看当前cpu核心数
    lscpu
    # 指定多少核心就会实现全占多少核心
    # 我这里指定全占4个核,持续10秒
    stress --cpu 4 --timeout 10

    参考:

    https://stackoverflow.com/questions/2925606/how-to-create-a-cpu-spike-with-a-bash-command

    https://www.tecmint.com/linux-cpu-load-stress-test-with-stress-ng-tool/

    二、高IO占用

    2.1 使用dd模拟高io

    # 高速写测试
    # 从/dev/zero伪设备读,输出到当前目录下的test.dd文件,每次8k,一共30万次(约2.4G)
    dd if=/dev/zero of=test.dd bs=8k count=300000
    # 高写读测试
    # 要测试的/dev/sda设备读取,输出到/dev/null伪设备,每次8k,一共30万次(约2.4G)
    dd if=/dev/sda of=/dev/null bs=8k count=300000
    # 如果只是想测试磁盘最大读速可使用hdparm
    # hdparm -t /dev/sda

    2.2 使用stress模拟高io

    # 使用4个进程对当前目录对应设备进行高io
    stress -d 4

    三、模拟高内存占用

    # 占用2 * 1G内存,持续10秒
    stress-ng --vm 2 --vm-bytes 1G --timeout 10
    # 占用90%的内存
    stress-ng --vm-bytes $(awk '/MemAvailable/{printf "%d
    ", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1

    参考:

    https://unix.stackexchange.com/questions/99334/how-to-fill-90-of-the-free-memory

    四、模拟大量文件场景

    有时候我们需要一个存在大量文件的环境,这就涉及如何快速创建大量文件的问题。

    最直观的就是写个几层循环,不断touch文件,如下:

    dir_list=("aaaaa" "bbbbb" "ccccc" "ddddd" "eeeee")
    abs_path="/test"
    
    # 最终整个文件数是 5 * 5 * 100000
    for tmp_dir in ${dir_list[@]}
    do
        abs_path="${abs_path}/${tmp_dir}"
        for tmp_dir_inner in ${dir_list[@]}
        do
            abs_path_inner="${abs_path}/${tmp_dir_inner}"
            # echo "mkdir ${abs_path_inner}"
            mkdir -p ${abs_path_inner}
            for index in {1..100000}
            do
                # echo "create ${abs_path_inner}/test${index}.txt"
                touch "${abs_path_inner}/test${index}.txt"
            done
        done
    done

    但实际来看这种一次生成一个文件的循环,速度还是比较慢的。

    可以把 touch test.txt改成touch test.txt.{1..1000}等形式,这样就能从一次创建1个文件变为一次创建1000个文件,速度会快很多。

    但touch一次创建的文件数是有上限的(感觉本质是总的文件名称的长度),最多大概是10000这样,超过了会报错,本质不清楚。

    dir_list=("aaaaa" "bbbbb" "ccccc" "ddddd" "eeeee")
    abs_path="/test"
    
    # 最终整个文件数是 5 * 5 * 100 * 1000
    for tmp_dir in ${dir_list[@]}
    do
        abs_path="${abs_path}/${tmp_dir}"
        for tmp_dir_inner in ${dir_list[@]}
        do
            abs_path_inner="${abs_path}/${tmp_dir_inner}"
            # echo "mkdir ${abs_path_inner}"
            mkdir -p ${abs_path_inner}
            for index in {1..100}
            do
                # echo "create ${abs_path_inner}/test${index}.txt"
                touch ${abs_path_inner}/${index}_{1..1000}
            done
        done
    done
  • 相关阅读:
    页面上一些小icon的制作方法及技术选择
    移动端h5页面touch事件与点击穿透问题
    浅析 jquerydom操作方法--remove(),detach(),empty()
    jquery中attr和prop的区别
    正则表达式的基本入门
    浏览器对中文标点符号折行的处理差异
    关于阴影:box-shadow
    ubuntu nginx ftp 配置图片服务器
    ubuntu 18 安装ftp 并远程配置访问用户
    WIn10系统软件默认安装c盘后消失看不见问题
  • 原文地址:https://www.cnblogs.com/lsdb/p/13161821.html
Copyright © 2011-2022 走看看