Saturday, 22 December 2018

Làm full tất cả CPU bằng 1 câu lệnh

Cách nào để làm CPU chạy full load ?

Khi mang em laptop bị nóng rồi tự tắt đi sửa, các anh kỹ thuật dùng cách vào youtube và tìm video 4k rồi mở fullscreen để xem...

Cách này chưa chắc đã làm full CPU, lại yêu cầu phải có mạng internet đủ nhanh.
Những options nào khác?

1. Dùng bash
while true; do true; done
2. Dùng Python
python -c 'while True: pass'


Hai cách này nghe có vẻ ổn, nhưng chúng chỉ làm full 01 CPU. Trong khi máy bạn có thể có nhiều CPU - ngay cả các Android smartphone của năm 2016 cũng đã có 4 CPU rồi.

Lấy số CPU của máy

Khái niệm CPU được hiểu theo nghĩa khác nhau trong các hòan cảnh khác nhau.
Nếu hiểu theo nghĩa: số chương trình chạy đồng thời cùng lúc (thực sự - chứ không phải giả đồng thời bằng cách chuyển nhanh qua các chương trình khác nhau chạy mỗi cái 1 tí như cách 1 CPU làm để chạy nhiều chương trình), ta có thể gõ `top` rồi bấm 1.


Trên Linux, mọi thứ đều là file , thông tin CPU nằm trong /proc/cpuinfo
$ grep 'core id' /proc/cpuinfo
core id        : 0
core id        : 0
core id        : 1
core id        : 1
getconf là câu lệnh đi kèm glibc, chuẩn POSIX tức có trên cả OSX, BSD ...
$ getconf -a | grep processor -i
_NPROCESSORS_CONF                  4
_NPROCESSORS_ONLN                  4
$ getconf _NPROCESSORS_ONLN
4

Ở đây có tất cả 4 processor (CPU).
Với 2 core, mỗi core 2 processor -> 2 x 2 = 4

$ sysctl -a | grep cpu
...
cũng sẽ hiện thông tin lần lượt cho các CPU0 1 2 3

Trên Linux, lệnh lscpu sẽ cho thông tin
chi tiết:

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 69
Model name:            Intel(R) Core(TM) i5-4200U CPU @ 1.60GHz
Với 1 socket, với 2 core, mỗi core có 2 thread, => 1 x 2 x 2 = 4

CPUs = Threads per core X cores per socket X sockets
Vậy cách làm đúng ở đây là mở 4 cửa sổ và chạy theo cách python hoặc cách bash nói trên.
Với máy tính có 128 CPU thì chúc bạn vui vẻ nhé!

Chạy lệnh song song với xargs

xargs là câu lệnh giải quyết bài tóan chạy song song các câu lệnh ở đây.

Đầu tiên lấy số CPU online (khái niệm offline xuất hiện trên máy tính có nhiều khe cắm CPU - các máy server)
$ getconf _NPROCESSORS_ONLN
4

Tạo ra dãy số từ 1 đến 4 với lệnh seq

$ seq $(getconf _NPROCESSORS_ONLN)
1
2
3
4

Biến 4 dòng này thành 4 đầu vào cho chương trình, mỗi chương trình có nhiệm vụ chạy full CPU
seq $(getconf _NPROCESSORS_ONLN) | xargs -n1 -P$(getconf _NPROCESSORS_ONLN) yes > /dev/null
yes là câu lệnh in ra màn hình liên tục dòng chữ `y`, nó có tác dụng như 1 vòng lặp vô hạn.

export CPUS=$(getconf _NPROCESSORS_ONLN); seq $CPUS | xargs -n1 -P $CPUS python -c 'while True: pass'

Sử dụng chương trình `psensor`, nhiệt độ của các Core được hiển thị trên biểu đồ, tăng từ ~45 nhiệt độ bình thường lên 69, 70 độ C (nóng).



Các thiết bị làm mát phải vào cuộc, đảm bảo nhiệt độ không cao hơn, nếu không sẽ xảy ra cháy thiết bị - sau một vài phút ta có thể bắt đầu nghe thấy tiếng quạt CPU kêu khi nó bắt đầu hoạt động. Nếu quạt hỏng không quay, nhiệt độ sẽ tăng cao và hệ điều hành thường sẽ tắt thiết bị để đảm bảo không có cháy nổ.

Các option của lệnh xargs:
- n 1 : số argument gửi tới mỗi chương trình, ở đây là 1
- P : số process tối đa được chạy đồng thời - ở đây set bằng số CPU online = 4
python -c 'while True: pass' - câu lệnh được chạy, như thấy ở hình top, các chương trình này lần lượt nhận đầu vào là 1 2 3 4.

4 chương trình sau sẽ được chạy song song
python -c 'while True: pass' 1
python -c 'while True: pass' 2
python -c 'while True: pass' 3
python -c 'while True: pass' 4
Với máy có lệnh `nproc`, có thể dùng lệnh này
seq $(nproc) | xargs -n1 -P $(nproc) python -c 'while True: pass'
$ whatis nproc
nproc (1)            - print the number of processing units available
$ dpkg -S `which nproc`
coreutils: /usr/bin/nproc
 Tham khảo:
- CPU count: https://unix.stackexchange.com/a/279354

Hết.
HVN at https://pymi.vn and https://www.familug.org

No comments:

Post a Comment