天天看點

python 讓cpu滿載

搞zabbix監控的時候,linux伺服器的負載很低,如何寫一個python腳本,讓它滿載呢?

網上搜了一堆,發現各種不靠譜。後來終于發現了更簡單的方法,就是定義一個死循環函數,讓函數什麼都不做就好了

def deadloop():
    while True:
         pass
 
deadloop()           

複制

就是這麼簡單的幾行就能讓cpu的一個線程滿載

執行之後,檢視top

[root@localhost ~]# top
top - 17:13:36 up  5:24,  8 users,  load average: 0.23, 0.08, 0.06
Tasks: 132 total,   2 running, 130 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.3 us,  0.7 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3874004 total,  2856660 free,   410604 used,   606740 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  3183588 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 7519 root      20   0  122852   5496   2428 R  99.3  0.1   0:13.11 python3
 6439 root      20   0  862228  49056   8776 S   1.3  1.3   0:22.24 python3
 7520 root      20   0  157752   2236   1576 R   0.3  0.1   0:00.01 top           

複制

發現隻有一個cpu是滿載的,使用w檢視負載,還是很低

[root@localhost ~]# w
 17:14:35 up  5:25,  8 users,  load average: 0.72, 0.25, 0.12           

複制

如何讓4個cpu都滿載呢?

使用多程序,那麼開幾個程序合适呢?根據CPU核心數來!

擷取CPU核心數

寫一個測試腳本

from multiprocessing import cpu_count
print(cpu_count())           

複制

執行輸出:4

使用多程序并結合CPU核心數

from multiprocessing import cpu_count
from multiprocessing import Process

def func():  # 死循環函數,讓cpu滿載
    while True:
         pass

if __name__ == '__main__':
    p_lst = []  # 定義一個清單
    core_count = cpu_count()  # CPU核心數
    for i in range(core_count):
        p = Process(target=func)  # 子程序調用函數
        p.start()  # 啟動子程序
        p_lst.append(p)  # 将所有程序寫入清單中
    for p in p_lst: p.join()  # 檢測p是否結束,如果沒有結束就阻塞直到結束,否則不阻塞
    print('結束')           

複制

執行此腳本,并檢視top狀态

[root@localhost ~]# top
top - 17:18:52 up  5:30,  8 users,  load average: 0.11, 0.20, 0.14
Tasks: 134 total,   5 running, 129 sleeping,   0 stopped,   0 zombie
%Cpu0  : 99.7 us,  0.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3874004 total,  2915672 free,   351628 used,   606704 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  3242624 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 7564 root      20   0  132664   6040   1192 R 100.0  0.2   0:08.65 python3
 7566 root      20   0  132664   6000   1152 R 100.0  0.2   0:08.64 python3
 7565 root      20   0  132664   5988   1140 R  99.7  0.2   0:08.63 python3
 7567 root      20   0  132664   6004   1156 R  99.7  0.2   0:08.63 python3           

複制

檢視cpu使用率,發現4個python3程序都是100%

等待1分鐘,檢視負載,發現CPU負載在不斷上升

[root@localhost ~]# w
 17:20:32 up  5:31,  8 users,  load average: 3.29, 1.29, 0.54
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      16:51   23:28   0.56s  0.56s -bash           

複制

伺服器的風扇,在呼呼的叫。先停止吧,當機就完蛋了!