Bạn đã từng nghe đến thuật ngữ processor affinity chưa? Đây là một tính năng cho phép bạn liên kết hoặc hủy liên kết các tiến trình với một bộ xử lý trung tâm cụ thể hoặc một loạt CPU. Đúng vậy, bạn có thể cho hệ thống biết lõi CPU nào sẽ được sử dụng để chạy một tiến trình cụ thể. Để biết thông tin chi tiết về mặt lý thuyết về lý do tại sao processor affinity tồn tại, hãy truy cập tại đây.
Trong hướng dẫn này, chúng ta sẽ thảo luận về một tiện ích - được gọi là taskset - cho phép bạn đạt được processor affinity. Nhưng trước khi thực hiện điều đó, cần lưu ý rằng tất cả các ví dụ trong hướng dẫn này đều đã được thử nghiệm trên máy Ubuntu 22.04 LTS và trên Debian 11.
Đây là cách trang hướng dẫn của công cụ giải thích về nó:
Sau đây là một số ví dụ theo kiểu Hỏi & Đáp sẽ giúp bạn hiểu rõ hơn về cách lệnh tasket hoạt động.
Chỉ cần thay PID bằng ID của tiến trình có mối quan hệ CPU mà bạn muốn lấy. Bạn có thể lấy ID tiến trình của một tiến trình, ví dụ: bằng cách sử dụng lệnh ps.
ID tiến trình nằm trong cột PID.
Ví dụ:
Lệnh trên trả về kết quả đầu ra sau:
Vì vậy, giá trị thập lục phân '3' ở đây có nghĩa là tiến trình có thể chạy trên bất kỳ lõi bộ xử lý nào trong số 4 lõi: 0,1,2,3.
Nếu bạn muốn kết quả đầu ra theo phạm vi CPU, bạn có thể thêm tùy chọn dòng lệnh -c.
Sau đây là kết quả đầu ra trong trường hợp này:
Ví dụ: mối quan hệ CPU hiện tại của quy trình Gedit (PID: 9726) là 'f'.
Để thay đổi mối quan hệ thành 0x11, hãy sử dụng lệnh sau:
Sau đó, bạn có thể kiểm tra lại mối quan hệ mới bằng cách sử dụng lệnh sau:
Các ảnh chụp màn hình sau đây hiển thị đầu ra cho các lệnh này trong trường hợp của tôi:
Vì vậy, bạn có thể thấy rằng mối quan hệ đã thay đổi.
Đây là một ví dụ:
taskset -cp 0,3 9726
Sau đây là đầu ra được tạo ra trong trường hợp này:
Ví dụ, tôi đã khởi chạy trình soạn thảo văn bản gedit với mức độ tương thích CPU là 0xa.
taskset 0xa gedit
Trong hướng dẫn này, chúng ta sẽ thảo luận về một tiện ích - được gọi là taskset - cho phép bạn đạt được processor affinity. Nhưng trước khi thực hiện điều đó, cần lưu ý rằng tất cả các ví dụ trong hướng dẫn này đều đã được thử nghiệm trên máy Ubuntu 22.04 LTS và trên Debian 11.
Lệnh tasket của Linux
Lệnh tasket cho phép bạn thiết lập hoặc truy xuất mức độ tương thích CPU của một tiến trình. Sau đây là cú pháp của nó:
Mã:
taskset [tùy chọn] mask command [đối số...]
taskset [tùy chọn] -p [mask] pid
Mã:
taskset được sử dụng để thiết lập hoặc truy xuất mối quan hệ CPU của một quy trình đang chạy
với pid của nó hoặc để khởi chạy lệnh mới với mối quan hệ CPU
nhất định. Mối quan hệ CPU là một thuộc tính của trình lập lịch "liên kết" một quy trình
với một tập hợp CPU nhất định trên hệ thống. Trình lập lịch Linux sẽ tôn trọng
mối quan hệ CPU nhất định và quy trình sẽ không chạy trên bất kỳ CPU nào khác.
Lưu ý rằng trình lập lịch Linux cũng hỗ trợ mối quan hệ CPU tự nhiên: trình lập lịch cố gắng giữ các quy trình trên cùng một CPU miễn là thực tế?
được tính vì lý do hiệu suất. Do đó, việc áp đặt một affin?
CPU cụ thể chỉ hữu ích trong một số ứng dụng nhất định.
Affin? CPU được biểu diễn dưới dạng bitmask, với bit bậc thấp nhất
tương ứng với CPU logic đầu tiên và bit bậc cao nhất corre?
tương ứng với CPU logic cuối cùng. Không phải tất cả CPU đều có thể tồn tại trên một hệ thống nhất định nhưng một mặt nạ có thể chỉ định nhiều CPU hơn số lượng hiện có. Một mặt nạ được lấy ra sẽ chỉ phản ánh các bit tương ứng với các CPU vật lý trên hệ thống. Nếu mặt nạ không hợp lệ được đưa ra (tức là mặt nạ không tương ứng với
bất kỳ CPU hợp lệ nào trên hệ thống hiện tại), thì lỗi sẽ được trả về. Các mặt nạ
có thể được chỉ định ở dạng thập lục phân (có hoặc không có "0x" ở đầu) hoặc dưới dạng
danh sách CPU với tùy chọn --cpu-list. Ví dụ,
0x00000001 là bộ xử lý số 0,
0x00000003 là bộ xử lý số 0 và số 1,
0xFFFFFFFF là bộ xử lý số 0 đến số 31,
32 là bộ xử lý số 1, số 4 và số 5,
--cpu-list 0-2,6
là bộ xử lý số 0, số 1, số 2 và số 6.
Khi tasket trả về, đảm bảo rằng chương trình đã cho đã được
lên lịch cho một CPU hợp lệ.
Câu hỏi 1. Làm thế nào để sử dụng tasket để lấy mối quan hệ CPU của một tiến trình?
Nếu bạn muốn tasket hiển thị mối quan hệ CPU của một tiến trình đang chạy, hãy sử dụng lệnh theo cách sau:
Mã:
taskset -p [PID]
Mã:
ps aux
Ví dụ:
Mã:
taskset -p 2363
Mã:
Mặt nạ tương thích hiện tại của pid 2363: 3
Vì vậy, giá trị thập lục phân '3' ở đây có nghĩa là tiến trình có thể chạy trên bất kỳ lõi bộ xử lý nào trong số 4 lõi: 0,1,2,3.
Nếu bạn muốn kết quả đầu ra theo phạm vi CPU, bạn có thể thêm tùy chọn dòng lệnh -c.
Mã:
taskset -cp 9726
Mã:
Danh sách tương thích hiện tại của pid 9726: 0-3
Câu 2. Làm thế nào để thay đổi mối quan hệ CPU bằng cách sử dụng tasket?
Để điều chỉnh mối quan hệ CPU của một quy trình hiện có, bạn cần chỉ định ID quy trình (như chúng tôi đã làm trong phần trước) cùng với mặt nạ thập lục phân xác định mối quan hệ mới.Ví dụ: mối quan hệ CPU hiện tại của quy trình Gedit (PID: 9726) là 'f'.
Để thay đổi mối quan hệ thành 0x11, hãy sử dụng lệnh sau:
Mã:
taskset -p 0x11 9726
Mã:
taskset -p 9726
Vì vậy, bạn có thể thấy rằng mối quan hệ đã thay đổi.
Câu hỏi 3. Làm thế nào để chỉ định một phạm vi CPU trong khi thay đổi affinity?
Đây không phải là vấn đề lớn. Tất cả những gì bạn phải làm là thêm tùy chọn dòng lệnh -c vào lệnh mà chúng ta đã sử dụng trong phần trước cùng với phạm vi lõi CPU làm đầu vào.Đây là một ví dụ:
taskset -cp 0,3 9726
Sau đây là đầu ra được tạo ra trong trường hợp này:
Mã:
Danh sách mối quan hệ hiện tại của pid 9726: 0
Danh sách mối quan hệ mới của pid 9726: 0,3
Câu 4. Làm thế nào để khởi chạy một tiến trình với mức độ tương thích CPU được xác định trước?
Có, bạn cũng có thể khởi chạy một tiến trình với mức độ tương thích CPU được thiết lập.Ví dụ, tôi đã khởi chạy trình soạn thảo văn bản gedit với mức độ tương thích CPU là 0xa.
taskset 0xa gedit