成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

這次我們看看阿里的人是如何蹂躪CPU的

商務(wù)辦公
在前面的系列文章中皮皮就介紹過如何使得CPU、I/O滿載,如何實現(xiàn)網(wǎng)絡(luò)延遲、丟包和中斷,如何模擬線程、進程以及機器假死。

 [[273967]]

前言

在前面的系列文章中皮皮就介紹過如何使得CPU、I/O滿載,如何實現(xiàn)網(wǎng)絡(luò)延遲、丟包和中斷,如何模擬線程、進程以及機器假死。

本文介紹是阿里巴巴混沌工程工具ChaosBlade中的CPU滿載的故障模擬的實現(xiàn)方式。之前看的是Netflix的Simain Army中的實現(xiàn),看上去一目了然,通過java的形式調(diào)用一下模擬腳本,腳本的內(nèi)容如下;

  1. #!/bin/bash 
  2.  
  3. cat << EOF > /tmp/infiniteburn.sh 
  4. #!/bin/bash 
  5. while true
  6.     do openssl speed; 
  7. done 
  8. EOF 
  9.  
  10. for i in {1..32} 
  11. do 
  12.     nohup /bin/bash /tmp/infiniteburn.sh & 
  13. done 

通過調(diào)用openssl speed來模擬CPU滿負荷運作,這里的方式還比較粗暴,直接開了32個線程來執(zhí)行openssl speed這種CPU密集型計算程序。如果CPU的內(nèi)核數(shù)大于32,那么就需要修改這里的硬編碼腳本了。

通過翻看阿里巴巴混沌工程工具ChaosBlade的代碼(golang project),發(fā)現(xiàn)它對于CPU的蹂躪方式要細膩很多。比如CPU的內(nèi)核個數(shù)使用runtime.NumCPU()來獲取。當然了還會有一些其它的附加細節(jié),這個下面會詳述。

我們先來簡單的了解一下ChaosBlade對于這一塊的實現(xiàn)布局。在ChaosBlade中,我們實現(xiàn)故障(類似cpu 100%、I/O 100%、網(wǎng)絡(luò)中斷等)注入的入口是通過blade命令。例如:使得CPU滿載負荷,那么可以使用./blade create cpu fullload來實現(xiàn)。

其實ChaosBlade中的blade命令只是采用Cobra封裝的CLI入口,其內(nèi)部實現(xiàn)是調(diào)用bin/目錄下的chaos_burncpu程序。

ChaosBlades(releases版)的下載地址為:https://github.com/chaosblade-io/chaosblade/releases。解壓之后的目錄結(jié)構(gòu)為:

  1. hidden@hidden:~/chaos/chaosblade-0.2.0$ tree 
  2. ├── bin 
  3. │   ├── chaos_burncpu 
  4. │   ├── chaos_burnio 
  5. │   ├── chaos_changedns 
  6. │   ├── chaos_delaynetwork 
  7. │   ├── chaos_dropnetwork 
  8. │   ├── chaos_filldisk 
  9. │   ├── chaos_killprocess 
  10. │   ├── chaos_lossnetwork 
  11. │   ├── chaos_stopprocess 
  12. │   ├── cplus-chaosblade.spec.yaml 
  13. │   ├── jvm.spec.yaml 
  14. │   └── tools.jar 
  15. ├── blade 
  16. ├── chaosblade.dat 
  17. └── lib --<snip> 

可以看到bin/目錄下處理chaos_burncpu之外還有很多chaos_***形式的程序,比如chaos_burnio是讓I/O滿載負荷。這些chaos_***形式的程序的使用方式都是大同小異的。

使用指南

我們這里不使用ChaosBlade提供的blade命令,因為這只是外部的一層封裝,使用這個無法使我們能夠透徹的理解內(nèi)部的實現(xiàn)。我們這里使用bin/chaos_burncpu來演示一下具體的用法。調(diào)用方式如下:

  1. bin/chaos_burncpu --start 

這里命令可以讓當前機器的CPU滿載負荷。取消CPU滿載負荷可以使用如下的命令:

  1. bin/chaos_burncpu --stop 

bin/chaos_burncpu命令還可以通過--cpu-count來指定CPU中需要滿載負荷的內(nèi)核個數(shù),示例如下:

  1. # 指定需要滿載負荷的CPU的內(nèi)核個數(shù)為4 
  2. bin/chaos_burncpu --start --cpu-count 4 

假設(shè)現(xiàn)在測試所使用的機器的cpu共有4個內(nèi)核,那么我們讓其中3個內(nèi)核滿載,效果如何呢?首先運行sar -u 1 100命令來監(jiān)測cpu的使用情況,然后運行:

  1. bin/chaos_burncpu --start --cpu-count 3 

可以在持續(xù)運行sar命令的shell終端中看到CPU的%idle數(shù)值變成了25%左右:

  1. 02:21:35 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle 
  2. 02:21:44 PM     all     73.95      0.00      1.24      0.00      0.00     24.81 

我們還可以指定讓某個CPU內(nèi)核滿載,比如下面的示例中讓內(nèi)核編號為1的滿載:

  1. bin/chaos_burncpu --start --cpu-list 1 

sar命令中還可以通過—P參數(shù)查看指定編號的內(nèi)核的使用情況,比如使用sar -u -P 1 1 100來指定編號為1的CPU內(nèi)核的使用情況:

  1. hidden@hidden:~$ sar -u -P 1 1 100 
  2. Linux 4.4.0-33.bm.1-amd64 (n224-008-172)     08/15/2019  _x86_64_    (4 CPU) 
  3.  
  4. 02:45:19 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle 
  5. 02:45:20 PM       1     98.00      0.00      2.00      0.00      0.00      0.00 
  6. 02:45:21 PM       1     98.99      0.00      1.01      0.00      0.00      0.00 

可以看到這個內(nèi)核已經(jīng)滿載。至于怎么實現(xiàn)掛載單個CPU內(nèi)核的在下面會有詳細的介紹。

我們再來通過-P 0來看一下編號為0的CPU內(nèi)核的使用情況:

  1. 02:47:32 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle 
  2. 02:47:33 PM       0      1.00      0.00      2.00      0.00      0.00     97.00 
  3. 02:47:34 PM       0      0.00      0.00      0.00      0.00      0.00    100.00 

可以看到這個內(nèi)核還是處于空閑狀態(tài)(%idle接近100%)。

原理

CPU滿載

chaos_burncpu中實現(xiàn)CPU滿載負荷的邏輯其實相當簡單,通過程序讓CPU一直運作即可。代碼如下:

  1. func burnCpu() { 
  2.     runtime.GOMAXPROCS(cpuCount) 
  3.  
  4.     for i := 0; i < cpuCount; i++ { 
  5.         go func() { 
  6.             for { 
  7.                 for i := 0; i < 2147483647; i++ { 
  8.                 } 
  9.                 runtime.Gosched() //讓出CPU時間片 
  10.             } 
  11.         }() 
  12.     } 
  13.     select {} // wait forever 

讀者可以自己比較一下這個和Simain Army中的openssl speed的區(qū)別。

關(guān)閉

關(guān)閉CPU滿載負荷的過程也比較簡單粗暴,總共分為兩步:

  1. 使用ps -ef | grep … 命令找出chaos_burncpu的pid。
  2. 使用kill -9 pid命令干掉它。

指定內(nèi)核滿載

我們在上面就了解到通過--cpu-count可以指定CPU滿載的內(nèi)核個數(shù),通過--cpu-list可以指定內(nèi)核滿載。ChaosBlade相比于Simian Army中的細膩之處也就體現(xiàn)在這里。

--cpu-count的功能很好實現(xiàn),在上面的func burnCpu()函數(shù)中的cpuCount就是--cpu-count所指定的值。

--cpu-list的功能比較復(fù)雜,總共分為3步:

  • 第一步:執(zhí)行nohup bin/chaos_burncpu --nohup --cpu-count 1 --cpu-processor [cpu內(nèi)核編號] > /dev/null 2>&1 &。假設(shè)我們要指定編號為1的內(nèi)核滿載,那么對應(yīng)的命令即為:nohup bin/chaos_burncpu --nohup --cpu-count 1 --cpu-processor 1 > /dev/null 2>&1 &。其實這個也只是個煙霧彈,實際上還是調(diào)用原本的bin/chaos_burncpu --start --cpu-count 1而已,只不過這里多指定了一個cpu-processor的信息。
  • 第二步:執(zhí)行ps -ef | grep … 命令找出對應(yīng)的pid。
  • 第三步:將進程pid綁定到編號為cpu-processor的內(nèi)核上。那么這一步怎么操作呢?我們先來看一下CPU Affinity。

CPU Affinity

基本概念

CPU affinity (親和力/親和性)是一種調(diào)度屬性(scheduler property), 它可以將一個進程"綁定" 到一個或一組CPU上。

將進程與CPU綁定,最直觀的好處就是減少cpu之間的cache同步和切換,提高了cpu cache的命中率,提高代碼的效率。

從CPU架構(gòu)上,NUMA擁有獨立的本地內(nèi)存,節(jié)點之間可以通過互換模塊做連接和信息交互,因此每個CPU可以訪問整個系統(tǒng)的內(nèi)存,但是訪問遠地內(nèi)存訪問效率大大降低,綁定CPU操作對此類系統(tǒng)運行速度會有較大提升,UMA架構(gòu)下,多CPU通過系統(tǒng)總線訪問存儲模塊。不難看出,NUMA使用CPU綁定時,每個核心可以更專注地處理一件事情,資源體系被充分使用,減少了同步的損耗。

表示方法

CPU affinity 使用位掩碼(bitmask)表示, 每一位都表示一個CPU, 置1表示"綁定"。最低位表示第一個邏輯CPU, 最高位表示最后一個邏輯CPU。CPU affinity典型的表示方法是使用16進制,具體如下:

  1. 0x00000001 
  2.     is processor #0 
  3.  
  4. 0x00000003 
  5.     is processors #0 and #1 
  6.  
  7. 0xFFFFFFFF 
  8.     is all processors (#0 through #31) 

taskset命令

taskset命名用于獲取或者設(shè)定CPU affinity。

  1. # 命令行形式 
  2. Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]] 
  3.  
  4. PARAMETER 
  5.     mask : cpu親和性,當沒有-c選項時, 其值前無論有沒有0x標記都是16進制的, 
  6.         當有-c選項時,其值是十進制的. 
  7.     command : 命令或者可執(zhí)行程序 
  8.     arg : command的參數(shù) 
  9.     pid : 進程ID,可以通過ps/top/pidof等命令獲取 
  10.  
  11.  
  12. OPTIONS 
  13.     -a, --all-tasks (舊版本中沒有這個選項) 
  14.         這個選項涉及到了linux中TID的概念,他會將一個進程中所有的TID都執(zhí)行一次CPU親和性設(shè)置. 
  15.         TID就是Thread ID,他和POSIX中pthread_t表示的線程ID完全不是同一個東西. 
  16.         Linux中的POSIX線程庫實現(xiàn)的線程其實也是一個進程(LWP),這個TID就是這個線程的真實PID. 
  17.        -p, --pid 
  18.               操作已存在的PID,而不是加載一個新的程序 
  19.        -c, --cpu-list 
  20.               聲明CPU的親和力使用數(shù)字表示而不是用位掩碼表示. 例如 0,5,7,9-11. 
  21.        -h, --help 
  22.               display usage information and exit 
  23.        -V, --version 
  24.               output version information and exit 
  25.   USAGE 
  26.     1) 使用指定的CPU親和性運行一個新程序 
  27.       taskset [-c] mask command [arg]... 
  28.         舉例:使用CPU0運行l(wèi)s命令顯示/etc/init.d下的所有內(nèi)容  
  29.           taskset -c 0 ls -al /etc/init.d/ 
  30.     2) 顯示已經(jīng)運行的進程的CPU親和性 
  31.       taskset -p pid 
  32.         舉例:查看init進程(PID=1)的CPU親和性 
  33.           taskset -p 1 
  34.     3) 改變已經(jīng)運行進程的CPU親和力 
  35.         taskset -p[c] mask pid 
  36.         舉例:打開2個終端,在第一個終端運行top命令,第二個終端中 
  37.           首先運行:[~]# ps -eo pid,args,psr | grep top #獲取top命令的pid和其所運行的CPU號 
  38.           其次運行:[~]# taskset -cp 新的CPU號 pid       #更改top命令運行的CPU號 
  39.           最后運行:[~]# ps -eo pid,args,psr | grep top #查看是否更改成功 
  40.   PERMISSIONS 
  41.         一個用戶要設(shè)定一個進程的CPU親和性,如果目標進程是該用戶的,則可以設(shè)置,如果是其他用戶的,則會設(shè)置失敗,提示 Operation not permitted.當然root用戶沒有任何限制. 
  42.         任何用戶都可以獲取任意一個進程的CPU親和性. 

應(yīng)用taskset

下面我們就來詳細實踐一下CPU指定內(nèi)核滿載的過程。

首先我們讓某個內(nèi)核滿載,這里我們還并未指定哪一個內(nèi)核(對應(yīng)前面所說第一步):

  1. bin/chaos_burncpu --start --cpu-count 1 

第二步,我們找到這個進程的pid:

  1. hidden@hidden:~$ ps -ef | grep chaos_burncpu 
  2. zhuzhon+  572792  490371 99 18:20 pts/0    00:00:14 bin/chaos_burncpu --nohup --cpu-count 1 --cpu-processor 1 
  3. zhuzhon+  572860  551590  0 18:20 pts/3    00:00:00 grep chaos_burncpu 

此時,我們查看pid=572792的進程的親和力為f(即二進制的1111,也就是CPU內(nèi)核編號0-3),也就是說CPU中的4個內(nèi)核都有可能運行這個滿載程序。

  1. hidden@hidden:~$ taskset -p 572792 
  2. pid 572792's current affinity mask: f 
  3.  
  4. hidden@hidden:~$ taskset -c -p 572792 
  5. pid 572792's current affinity list: 0-3 

上面第一步中,指定某個單獨的內(nèi)核滿載的實際效果應(yīng)該時每個內(nèi)核都會有一定的時間處于滿載狀態(tài)。對此有疑問的同學(xué)可以通過sar -u -P [cpu-processor] 1 1000來驗證一下。

第三步,我們指定編號為0的內(nèi)核滿負荷:

  1. hidden@hidden:~$ taskset -cp 0 572792 
  2. pid 572792's current affinity list: 0-3 
  3. pid 572792's new affinity list: 0 

此時我們可以通過sar -u -P [cpu-processor] 1 1000命令來檢測4個內(nèi)核的各個使用情況。不出意外的話,內(nèi)核編號為0的檢測結(jié)果應(yīng)該和下面的類似:

  1. hidden@hidden:~$ sar -u -P 0 1 1000 
  2. Linux 4.4.0-33.bm.1-amd64 (n224-008-172)     08/15/2019  _x86_64_    (4 CPU) 
  3.  
  4. 06:22:08 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle 
  5. 06:38:46 PM       0    100.00      0.00      0.00      0.00      0.00      0.00 
  6. 06:38:47 PM       0    100.00      0.00      0.00      0.00      0.00      0.00 
  7. 06:38:48 PM       0    100.00      0.00      0.00      0.00      0.00      0.00 

而其他內(nèi)核的%idle應(yīng)該都接近在100%。

總結(jié)

本文不僅介紹了如何“蹂躪”CPU,還附帶了一個知識點就是CPU affinity,程序開發(fā)者比機器更懂程序,如果用好它,可以有意想不到的效果。還有,在之前的《看我如何作死 | 將CPU、IO打爆》中不僅介紹了如何使得CPU滿載,還介紹了I/O如何滿載,這里不妨透漏一下,阿里和Netflix對于I/O滿載的模擬都是使用的linux dd工具,所以本文就不多做贅述啦。

責任編輯:武曉燕 來源: 朱小廝的博客
相關(guān)推薦

2022-07-05 21:53:26

記錄圖片WebP

2021-05-10 08:20:32

CPU 符號整數(shù)

2014-03-05 16:14:31

2019-07-10 05:08:05

CPU內(nèi)存分頁管理

2018-12-06 12:58:50

CPU內(nèi)存模塊

2015-04-01 13:15:04

2020-06-10 07:40:36

CPU內(nèi)核態(tài)多線程

2018-09-05 08:59:51

服務(wù)器DNS網(wǎng)絡(luò)

2012-12-10 15:12:43

2022-01-19 08:35:24

指標敏感度CTR

2021-08-19 17:14:31

人工智能科技算法

2013-01-09 09:38:34

Java 8JDK8新版Java

2013-01-08 14:11:14

JavaJDK8lambda

2020-08-05 12:27:18

Go語言碼農(nóng)

2017-04-21 07:15:57

機器人

2022-06-26 23:41:40

人工智能機器算法

2021-01-25 08:00:20

團隊管理阿里

2020-12-16 06:30:41

職場工作產(chǎn)品

2021-07-28 07:53:20

CPU 線程切換

2022-04-26 12:45:52

TikTok機器學(xué)習(xí)人工智能
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 中文字幕一区二区三区在线观看 | 亚洲综合在线一区二区 | 午夜国产在线 | 国产精品视频免费观看 | 九九伊人sl水蜜桃色推荐 | 成人在线视频免费观看 | 久综合 | 91一区二区 | 久久精品二区亚洲w码 | 大久 | 久久99成人 | 久久在线| 国产91综合 | 成年人视频免费在线观看 | 亚洲成人免费视频 | 国产乱码精品一区二区三区中文 | 三级黄色大片网站 | 天色综合网 | 午夜理伦三级理论三级在线观看 | 亚洲三区视频 | 夜夜干夜夜操 | 91精品国产综合久久久久 | 天天澡天天狠天天天做 | www久久99 | 天天干天天爱天天操 | 69精品久久久久久 | 欧美激情网站 | 欧美三级在线 | 国产成人a亚洲精品 | 在线免费观看a级片 | 91xxx在线观看 | 九九天堂网 | 亚洲精品国产电影 | 久久精品国产99国产 | 日本成人综合 | 一级片在线免费播放 | 精品91久久久 | 欧美日韩不卡合集视频 | 999在线精品 | 国产一区二区毛片 | 日韩欧美一区二区三区免费观看 |