公司擁有一批云服務器,這些服務器托管在華為云上,然而,很多云服務器的資源利用率并不高,處于空閑狀態。我開始擔心領導會察覺到這些空閑資源,要求我們降低配置,并可能削減云服務器的采購預算。因此,我計劃編寫一個 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,其中參數解釋:
- if 代表輸入文件。如果不指定 if,默認就會從 stdin 中讀取輸入。
- of 代表輸出文件。如果不指定 of,默認就會將 stdout 作為默認輸出。
- bs 代表字節為單位的塊大小。
- count 代表被復制的塊數。
- /dev/zero 是一個字符設備,會不斷返回 0 值字節( 主站蜘蛛池模板: 日本一区二区三区在线 视频 | 国产三级国产精品国产国在线观看 | 国产在线观看免费 | 在线观看成年视频 | 国产三级在线视频播放线 | 欧美福利一区二区三区 | 一级毛片q片 | 一级片欧美 | 最新国产区| 日韩欧美在线综合网高清 | 国产精品久久久久久久久久直 | 国产精品高清在线观看93 | 美女张开腿让男人捅的视频 | 国产原创91 | 亚洲网址在线观看 | 九九国产在线视频 | 成人影院欧美大片免费看 | 国产天堂在线一区二区三区 | 一级毛片在线免费观看 | 高清精品女厕在线观看 | 美女张开腿让男人桶爽动漫视频 | 成人免费在线播放视频 | 97香蕉久久夜色精品国产 | 亚洲国产精品自产拍在线播放 | 亚洲国产欧美在线人成aaa | 欧美高清另类自拍视频在线看 | 免费观看欧美精品成人毛片能看的 | 国产成人精品免费视频大全五级 | 国产91精品露脸国语对白 | 日本一区二区不卡视频 | 99这里只有精品视频 | 国产中的精品一区的 | 4tube高清性欧美 | 在线视频一区二区三区在线播放 | 免费观看欧美成人h | 成年人网站免费视频 | 欧美精品成人一区二区在线观看 | 精品一区二区三区波多野结衣 | 亚洲免费视频一区二区三区 | 日本一区二区三区四区五区 | 高清欧美性狂猛bbbbbbxxxx |