Xử lý đa nhân (multi-core) có lợi và hại, và đôi khi bạn cần gán thủ công nhân CPU cho chương trình (gọi là "CPU affinity") để đạt hiệu năng tốt nhất. Trên Linux, công cụ chính là taskset. Nghe có vẻ đáng sợ, nhưng chúng tôi sẽ chia nhỏ thành các bước dễ dàng.
Cơ bản về Taskset
Dùng taskset chia làm hai phần: CPU affinity với chương trình sắp khởi chạy và với chương trình đã chạy. Khởi chạy chương trình dễ hơn, nên bắt đầu ở đó. Lệnh khởi chạy trông như:
taskset -c số-nhân-cpu chương-trình
Trước khi nhập số nhân CPU, đừng quên sơ đồ đánh số Unix thường bắt đầu từ 0, nên nhân đầu tiên là 0, nhân thứ hai là 1, v.v. Do đó, máy hai nhân có nhân 0 và 1, máy bốn nhân có 0, 1, 2, 3.
Giả sử bạn muốn chạy Audacity trên hệ hai nhân, và muốn nó chạy trên nhân thứ hai. Lệnh sẽ là:
taskset -c 1 audacity
Dùng nhiều nhân
Trên một máy của chúng tôi, Chrome đôi khi bị mất khung hình (drop frames) khi phát video streaming nhưng hoạt động tốt khi gán cho hai nhân. Nếu muốn thử tương tự trên máy bốn nhân và gán Chrome cho nhân ba và bốn, lệnh sẽ là:
taskset -c 2,3 google-chrome
Bạn không phải gán affinity cho nhân liên tiếp – có thể chọn bất kỳ nhân nào ngẫu nhiên. Giả sử bạn có máy sáu nhân và muốn dùng Chrome trên nhân hai và sáu. Bạn nhập:
taskset -c 1,5 google-chrome
Bạn cũng có thể dùng dấu gạch ngang để phân tán ứng dụng trên nhiều nhân. Ví dụ, nhiều chương trình cũ hoặc chức năng hệ thống mặc định chạy trên nhân đầu tiên. Giả sử bạn muốn để nhân đầu tiên trống nhất có thể mà phân tán ứng dụng lớn trên tất cả nhân còn lại?
Giả sử bạn có máy tám nhân và muốn chạy Steam từ nhân thứ hai đến nhân thứ tám. Lệnh sẽ là:
taskset -c 1-7 steam
Thay đổi Affinity cho chương trình đã chạy
Taskset không giới hạn chỉ khởi chạy ứng dụng. Bạn cũng có thể thay đổi CPU affinity cho chương trình đang chạy. Tuy nhiên, trước khi thay đổi affinity của ứng dụng, bạn cần biết Process ID (PID) của nó.
Để tìm PID ứng dụng, bạn có thể thử System Monitor của máy tính để bàn, nhưng cách nhanh nhất là dùng top. Không ngạc nhiên, nó dùng lệnh:
top
Tên tất cả lệnh chạy nằm bên phải màn hình. PID tương ứng nằm bên trái.
Ghi lại PID vì bạn sẽ dùng ngay. Ví dụ này, chúng ta dùng VLC, đang phát video Matroska độ phân giải cao trên PC cũ sáu nhân. Chúng ta thử nghiệm các CPU affinity khác nhau để vắt ra hiệu năng tốt nhất từ VLC.
Để thay đổi affinity của tiến trình hiện có, cú pháp như sau:
taskset -cp số-nhân PID
Nếu bạn thấy ảnh chụp trên, PID của VLC là 20485. Chúng ta thử chạy VLC trên nhân tư, năm, sáu, theo số Unix là 3-5. Vậy lệnh sẽ là:
taskset -cp 3-5 20485
Nhưng nếu muốn kiểm tra affinity hiện tại trước khi đổi? Đừng nhập số nhân, taskset sẽ cho bạn biết affinity đang gán như thế nào. Vậy nếu đổi lệnh cuối thành:
taskset -cp 20485
nó cho thấy VLC trải rộng trên tất cả nhân.
Thử lại với chương trình khác. Giả sử chạy file Matroska lớn với SMPlayer, SMPlayer đã chạy. Top báo PID là 16058.
Trước tiên muốn biết affinity hiện tại. Dùng lệnh với switch -cp nhưng không nhập số nhân, ta thấy affinity hiện tại trải rộng tất cả nhân.
Bây giờ thử phân tán SMPlayer trên cùng ba nhân như thử nghiệm VLC với lệnh:
taskset -cp 3-5 16058
Đơn giản, phải không? Nếu bạn muốn benchmark PC, xem hướng dẫn 8 công cụ hữu ích stress-test CPU.