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\n", $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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM