久综合色-久综合网-玖草影视-玖草资源在线-亚洲黄色片子-亚洲黄色片在线观看

Hello! 歡迎來到小浪云!


linux模擬資源占用 你會嗎


avatar
小浪云 2025-01-02 124

公司擁有一批云服務器,這些服務器托管在華為云上,然而,很多云服務器的資源利用率并不高,處于空閑狀態。我開始擔心領導會察覺到這些空閑資源,要求我們降低配置,并可能削減云服務器的采購預算。因此,我計劃編寫一個 shell 腳本,用于模擬資源占用的情況。

實施思路

  • 使用 stress 工具對內存進行壓力測試,占用剩余內存的80%,以模擬CPU和內存的消耗情況。
  • 使用 dd 命令生成大文件,占用第二塊硬盤剩余空間的80%,以模擬硬盤空間的消耗和IO操作。
  • 讓腳本運行持續20分鐘,一旦檢測到內存占用超過80%,則停止壓力測試。
  • 避免對CPU進行壓力測試,因為過高的CPU占用率可能導致應用異常或服務器重啟的風險。

相關工具

stress

stress 命令主要用來模擬系統負載較高時的場景,本文介紹其基本用法。文中 demo 的演示環境為 Ubuntu 18.04。

可選參數

-c, –cpu N 產生 N 個進程,每個進程都反復不停的計算隨機數的平方根

-i, –io N 產生 N 個進程,每個進程反復調用 sync() 將內存上的內容寫到硬盤上

-m, –vm N 產生 N 個進程,每個進程不斷分配和釋放內存 –vm-bytes B 指定分配內存的大小

–vm-stride B 不斷的給部分內存賦值,讓 COW(copy On Write)發生 –vm-hang N 指示每個消耗內存的進程在分配到內存后轉入睡眠狀態 N 秒,然后釋放內存,一直重復執行這個過程

–vm-keep 一直占用內存,區別于不斷的釋放和重新分配(默認是不斷釋放并重新分配內存)

-d, –hadd N 產生 N 個不斷執行 write 和 unlink 函數的進程(創建文件,寫入內容,刪除文件)

–hadd-bytes B 指定文件大小

-t, –timeout N 在 N 秒后結束程序 –backoff N 等待N微妙后開始運行

-q, –quiet 程序在運行的過程中不輸出信息

-n, –dry-run 輸出程序會做什么而并不實際執行相關的操作

–version 顯示版本號

-v, –verbose 顯示詳細的信息

消耗 CPU 資源

stress 消耗 CPU 資源是通過調用 sqrt 函數計算由 rand 函數產生的隨機數的平方根實現。下面的命令會產生 4 個這樣的進程不斷計算:

$?stress?-c? 

使用 top 命令查看 CPU 的狀態如下(CPU 在用戶態滿負荷運轉):

消耗內存資源

下面的命令產生兩個子進程,每個進程分配 300M 內存:

$?stress?--vm?2?--vm-bytes?300M?--vm-keep 

父進程處于睡眠狀態,兩個子進程負責資源消耗。

–vm-keep 一直占用內存,區別于不斷的釋放和重新分配(默認是不斷釋放并重新分配內存)。 –vm-hang N 指示每個消耗內存的進程在分配到內存后轉入睡眠狀態 N 秒,然后釋放內存,一直重復執行這個過程。

–vm-keep 和 –vm-hang 都可以用來模擬只有少量內存的機器,但是指定它們時 CPU 的使用情況是不一樣的。

$stress?--vm?2?--vm-bytes?500M?--vm-keep 

一直在進行默認的 stride 操作,user 非常高(cpu 在用戶態忙碌)。

$?stress?--vm?2?--vm-bytes?500M?--vm-hang?5 

上面這兩種狀態不斷切換,但整體上看 CPU 的負載并不高。

–vm-stride B 不斷的給部分內存賦值,讓 COW(Copy On Write)發生。只要指定了內存相關的選項,這個操作就會執行,只是大小為默認的 4096。賦值內存的比例由參數決定:

for (i = 0; i

$?stress?--vm?2?--vm-bytes?500M?--vm-stride?64 $?stress?--vm?2?--vm-bytes?500M?--vm-stride?1M 

為什么會產生這樣的結果?原因是單獨的賦值和對比操作可以讓 CPU 在用戶態的負載占到 99% 以上。–vm-stride 值增大就意味著減少賦值和對比操作,這樣就增加了內存的釋放和分配次數(cpu在內核空間的負載)。 不指定 –vm-stride 選項就使用默認值是 4096,CPU 負載情況居于前兩者之間:

$?stress?--vm?2?--vm-bytes?500M 

消耗 IO 資源 下面的命令產生 4 個進程,每個進程都反復調用 sync 函數將內存上的內容寫到硬盤上:

$?stress?-i?4 

使用 top 命令查看 CPU 的狀態如下:

sy 升高,wa(iowait) 非常高。

壓測磁盤及 IO 下面的命令創建一個進程不斷的在磁盤上創建 10M 大小的文件并寫入內容:

$?stress?-d?1?--hdd-bytes?10M 

使用 top 命令查看 CPU 的狀態如下(此時的 CPU 主要消耗在內核態):

下面是 iostat 2 的輸出(同樣是高 iowait,瓶頸是寫磁盤):

其它選項

–verbose 顯示 stress 程序運行過程中的詳細信息:

–timeout N 在 N 秒后結束程序。

–quiet stress 程序運行的過程中不輸出信息。

-n, –dry-run 輸出程序會做什么而并不實際執行相關的操作:

–backoff N 讓新 fork 出來的進程 sleep N 微秒再開始運行。

除了單獨指定某一類的選項,還可以同時執行多個類型的任務,比如產生 3 個 CPU 進程、3 個 IO 進程、2 個10M 的 vm 進程,并且每個 vm 進程中不循環分配釋放內存:

$?stress?--cpu?3?--io?3?--vm?2?--vm-bytes?10M?--vm-keep 

dd

dd 命令 用于復制文件并對原文件的內容進行轉換和格式化處理。dd 命令功能很強大的,對于一些比較底層的問題,使用 dd 命令往往可以得到出人意料的效果。用的比較多的還是用 dd 來備份裸設備。但是不推薦,如果需要備份 oracle 裸設備,可以使用 rman 備份,或使用第三方軟件備份,使用 dd 的話,管理起來不太方便。需要的時候使用 dd 對物理磁盤操作,如果是文件系統的話還是使用 tar backup cpio 等其他命令更加方便。另外,使用 dd 對磁盤操作時,最好使用塊設備文件。

語法

dd?(選項) 

命令選項

bs=:將ibs(輸入)與obs(輸出)設成指定的字節數; cbs=:轉換時,每次只轉換指定的字節數; conv=:指定文件轉換的方式; count=:僅讀取指定的區塊數; ibs=:每次讀取的字節數; obs=:每次輸出的字節數; of=:輸出到文件; seek=:一開始輸出時,跳過指定的區塊數; skip=:一開始讀取時,跳過指定的區塊數; --help:幫助; --version:顯示版本信息。 

實例

>?dd?if=/dev/zero?of=sun.txt?bs=1M?count=1 1+0?records?in 1+0?records?out 1048576?bytes?(1.0?MB)?copied,?0.006107?seconds,?172?MB/s  [root@localhost?text] 1.1M????sun.txt 

該命令創建了一個 1M 大小的文件 sun.txt,其中參數解釋: