Làm thế nào để đảm bảo CPU có sẵn cho một quy trình đang chạy?


25

Lúc đầu, câu hỏi có vẻ hơi ngớ ngẩn / khó hiểu vì HĐH thực hiện công việc quản lý thực thi quy trình.

Tuy nhiên, tôi muốn đo xem một số quy trình bị ràng buộc CPU / IO và tôi cảm thấy như hệ điều hành của tôi đang can thiệp vào các thử nghiệm của tôi, ví dụ, các quy trình HĐH được lên lịch.

Lấy ví dụ về tình huống sau: Tôi đã chạy quy trình A hai lần và nhận được đầu ra sau từ công cụ "thời gian" (cột thời gian tính bằng giây):

+---+-------+---------+-----------+---------+
|Run|Process|User Time|System Time|Wall time|
+---+-------+---------+-----------+---------+
|1  |A      |196.3    |5.12       |148.86   |
|2  |A      |190.79   |4.93       |475.46   |
+---+-------+---------+-----------+---------+

Như chúng ta có thể thấy, mặc dù thời gian của người dùng và hệ thống tương tự nhau, thời gian trôi qua của cả hai thay đổi mạnh mẽ (chênh lệch ~ 5 phút). Cảm thấy như một cái gì đó trong môi trường của tôi gây ra một số tranh cãi.

Tôi muốn dừng mọi quy trình / dịch vụ nền có thể để tránh bất kỳ loại tiếng ồn nào trong các thử nghiệm của mình nhưng tôi tự coi mình là người dùng unix mới / trung gian và tôi không biết cách đảm bảo điều này.

Tôi đang sử dụng Linux 4.4.0-45 chung với Ubuntu 14.04 LTS 64 bit.

Tôi thực sự đánh giá cao sự hỗ trợ. Nếu các bạn cần bất kỳ thông tin thiếu, tôi sẽ nhanh chóng chỉnh sửa bài viết của tôi.

Thông tin CPU

$ grep proc /proc/cpuinfo | wc -l
8
$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Stepping:              3
CPU MHz:               4002.609
BogoMIPS:              7183.60
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7

Bạn có thể bắt đầu quá trình của mình bằng cách sử dụng mức độ ưu tiên caonice -19 process
Dababi

Câu trả lời:


26

Bạn có một cấu hình tùy chọn kernel trong đó CPU sẽ không được HĐH sử dụng, nó được gọi isolcpus.

cô lập - Cách ly CPU khỏi bộ lập lịch kernel.

Tóm tắt nội dung cô lập = cpu_number [, cpu_number, ...]

Mô tả Loại bỏ các CPU được chỉ định, như được xác định bởi các giá trị cpu_number, từ các đại số cân bằng SMP và trình lập lịch biểu chung. Cách duy nhất để di chuyển một quá trình lên hoặc tắt CPU "bị cô lập" là thông qua các tòa nhà ái lực của CPU. cpu_number bắt đầu từ 0, vì vậy giá trị tối đa là 1 ít hơn số lượng CPU trên hệ thống.

Cấu hình này tôi sắp mô tả cách thiết lập, có thể có nhiều cách sử dụng hơn là để thử nghiệm.

Ví dụ, Meru sử dụng công nghệ này trong các bộ điều khiển AP dựa trên Linux của họ, để giữ cho lưu lượng mạng không bị cản trở hoạt động bên trong của HĐH, cụ thể là các hoạt động I / O.

Tôi cũng sử dụng nó trong một trang web rất bận rộn, vì những lý do khá giống nhau: Tôi đã phát hiện ra từ trải nghiệm cuộc sống rằng tôi mất kiểm soát quá thường xuyên vì sở thích của tôi về máy chủ đó; phải khởi động lại nó một cách mạnh mẽ cho đến khi tôi tách daemon mặt trước trên CPU của riêng mình.

Khi bạn có 8 CPU, bạn có thể kiểm tra đầu ra của lệnh:

$ grep -c proc /proc/cpuinfo
8

hoặc là

$ lscpu | grep '^CPU.s'
CPU(s):                8

Thêm vào Debian / Ubuntu trong tệp /etc/default/grubvào tùy chọn GRUB_CMDLINE_LINUX:

GRUB_CMDLINE_LINUX="isolcpus=7"

(nó là 7, vì nó bắt đầu bằng 0 và bạn có 8 lõi)

Sau đó chạy,

sudo update-grub

Điều này nói với kernel không sử dụng một trong các lõi của bạn.

Khởi động lại hệ thống.

Sau đó bắt đầu quá trình của bạn.

Ngay sau khi khởi động nó, bạn có thể thay đổi cho CPU thứ 8 (7 vì 0 là số 1) và khá chắc chắn rằng bạn là người duy nhất sử dụng CPU đó.

Đối với điều đó, sử dụng lệnh:

taskset -cp 7 PID_number

tasket - lấy hoặc đặt ái lực CPU của một tiến trình

TÓM TẮC

   taskset [options] [mask | list ] [pid | command [arg]...]

SỰ MIÊU TẢ

tasket được sử dụng để thiết lập hoặc truy xuất ái lực CPU của một pro pro đang chạy được cung cấp cho PID của nó hoặc để khởi chạy một LỰA CHỌN mới với ái lực CPU nhất định. Ái lực CPU là một thuộc tính lập lịch biểu "liên kết" một quá trình với một bộ CPU nhất định trên hệ thống. Bộ lập lịch Linux sẽ tôn vinh mối quan hệ CPU đã cho và quá trình sẽ không chạy trên bất kỳ CPU nào khác. Lưu ý rằng bộ lập lịch Linux cũng hỗ trợ mối quan hệ CPU tự nhiên: bộ lập lịch cố gắng giữ các tiến trình trên cùng một CPU miễn là thực tế vì lý do hiệu năng. Do đó, việc buộc một mối quan hệ CPU cụ thể chỉ hữu ích trong một số ứng dụng nhất định.

Để đọc thêm về nó, xem: segcpus, numactl và tasket

Cũng sử dụng ps -eFbạn sẽ thấy trong cột PSR bộ xử lý đang được sử dụng.

Tôi có một máy chủ với CPU 2 và 3 bị cô lập, và thực sự, nó có thể được nhìn thấy với ps -equá trình duy nhất trong vùng người dùng như dự định, là pound.

# ps -eo psr,command | tr -s " " | grep "^ [2|3]"
 2 [cpuhp/2]
 2 [watchdog/2]
 2 [migration/2]
 2 [ksoftirqd/2]
 2 [kworker/2:0]
 2 [kworker/2:0H]
 3 [cpuhp/3]
 3 [watchdog/3]
 3 [migration/3]
 3 [ksoftirqd/3]
 3 [kworker/3:0]
 3 [kworker/3:0H]
 2 [kworker/2:1]
 3 [kworker/3:1]
 3 [kworker/3:1H]
 3 /usr/sbin/pound

Nếu bạn so sánh nó với các CPU không bị cô lập, chúng sẽ chạy nhiều thứ khác (cửa sổ bên dưới các slide ):

# ps -eo psr,command | tr -s " " | grep "^ [0|1]"
 0 init [2]
 0 [kthreadd]
 0 [ksoftirqd/0]
 0 [kworker/0:0H]
 0 [rcu_sched]
 0 [rcu_bh]
 0 [migration/0]
 0 [lru-add-drain]
 0 [watchdog/0]
 0 [cpuhp/0]
 1 [cpuhp/1]
 1 [watchdog/1]
 1 [migration/1]
 1 [ksoftirqd/1]
 1 [kworker/1:0]
 1 [kworker/1:0H]
 1 [kdevtmpfs]
 0 [netns]
 0 [khungtaskd]
 0 [oom_reaper]
 1 [writeback]
 0 [kcompactd0]
 0 [ksmd]
 1 [khugepaged]
 0 [crypto]
 1 [kintegrityd]
 0 [bioset]
 1 [kblockd]
 1 [devfreq_wq]
 0 [watchdogd]
 0 [kswapd0]
 0 [vmstat]
 1 [kthrotld]
 0 [kworker/0:1]
 0 [deferwq]
 0 [scsi_eh_0]
 0 [scsi_tmf_0]
 1 [vmw_pvscsi_wq_0]
 0 [bioset]
 1 [jbd2/sda1-8]
 1 [ext4-rsv-conver]
 0 [kworker/0:1H]
 1 [kworker/1:1H]
 1 [bioset]
 0 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 0 [jbd2/sda3-8]
 1 [ext4-rsv-conver]
 1 /usr/sbin/rsyslogd
 0 /usr/sbin/irqbalance --pid=/var/run/irqbalance.pid
 1 /usr/sbin/cron
 0 /usr/sbin/sshd
 1 /usr/sbin/snmpd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid
 1 /sbin/getty 38400 tty1
 1 /lib/systemd/systemd-udevd --daemon
 0 /usr/sbin/xinetd -pidfile /run/xinetd.pid -stayalive
 1 [kworker/1:2]
 0 [kworker/u128:1]
 0 [kworker/0:2]
 0 [bioset]
 1 [xfsalloc]
 1 [xfs_mru_cache]
 1 [jfsIO]
 1 [jfsCommit]
 0 [jfsCommit]
 0 [jfsCommit]
 0 [jfsCommit]
 0 [jfsSync]
 1 [bioset]
 0 /usr/bin/monit -c /etc/monit/monitrc
 1 /usr/sbin/pound
 0 sshd: rui [priv]
 0 sshd: rui@pts/0,pts/1
 1 -bash
 1 -bash
 1 -bash
 1 [kworker/u128:0]
 1 -bash
 0 sudo su
 1 su
 1 bash
 0 bash
 0 logger -t cmdline root[/home/rui] 
 1 ps -eo psr,command
 0 tr -s 
 0 grep ^ [0|1]
 0 /usr/bin/vmtoolsd

Tôi không biết có thể làm điều đó :) Tôi sẽ kiểm tra tài liệu tham khảo của bạn. Mong được đánh dấu chủ đề này như đã giải quyết;)
Jeanderson Candido

Tôi gần như quên mất ... có cách nào để giám sát việc thực hiện để kiểm tra xem sự cô lập này có hoạt động không?
Jeanderson Candido

Không có chi. Đã thêm một đoạn giới thiệu nhỏ như đoạn 2. Lưu ý rằng tôi đã thấy một số hướng dẫn trên mạng nói về nhiệm vụ, nhưng thường thì họ không đề cập cùng với nóisolcpus
Rui F Ribeiro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.