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/grub
và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 -eF
bạ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 -e
quá 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
nice -19 process