Sử dụng các nhóm Linux để cân bằng hiệu suất CPU


13

Tôi có hai hệ thống Linux lõi kép được cài đặt bằng các nhóm Linux với các nhân tương đối gần đây; một cái đang chạy Debian Squeeze, Ubuntu 11.04 Natty Narwhal khác. Tôi đã nhận được cân bằng tải CPU với các nhóm hoạt động tốt hơn một chút trên hệ thống Debian mặc dù nhân cũ hơn. Nhưng nó không phù hợp với mọi thứ, và sự kỳ quặc cụ thể mà tôi đang hỏi ở đây xảy ra trên cả hai hệ thống.

Nếu bạn đọc Quản lý tài nguyên trong Linux với các nhóm điều khiển, nó sẽ đưa ra một ví dụ cho thấy cách tái tạo vấn đề. Đây là phiên bản Ubuntu (chạy dưới dạng root):

cd /sys/fs/cgroup/cpu
    [On Debian Squeeze start at /mnt/cgroups/cpu instead]
mkdir low high
echo 512 > low/cpu.shares
echo 2048 > high/cpu.shares
yes low > /dev/null &
echo $! > low/tasks
yes high > /dev/null &
echo $! > high/tasks
ps -C yes -opid,%cpu,psr,args
    [repeat that a few times]
killall -9 yes

Tôi đã mong đợi quá trình "cao" sẽ được phân bổ nhiều thời gian hơn quá trình "thấp"; những gì thực sự xảy ra với trường hợp thử nghiệm này luôn giống như thế này:

root@black:/sys/fs/cgroup/cpu# ps -C yes -opid,%cpu,psr,args
  PID %CPU PSR COMMAND
 3105 88.3   1 yes low
 3106 94.5   0 yes high

Thời gian gần như bằng nhau. Đây là câu hỏi của tôi: tại sao điều đó xảy ra?

Trong phần trình bày, vấn đề này được thể hiện bằng cách ghim từng tiến trình vào cùng một CPU; dòng bổ sung để kiểm tra rằng:

taskset -c 1 yes high > /dev/null &
echo $! > high/tasks
taskset -c 1 yes low > /dev/null &
echo $! > low/tasks
ps -C yes -opid,%cpu,psr,args
[later, rinse, repeat]
killall -9 yes

Kết quả sau đó là những gì tôi đã mong đợi để thấy mọi lúc: quá trình "cao" nhận được tỷ lệ phần trăm cao hơn của CPU:

root@black:/sys/fs/cgroup/cpu# ps -C yes -opid,%cpu,psr,args
  PID %CPU PSR COMMAND
 3128 83.3   1 yes high
 3129 20.7   1 yes low

Giải thích lý do tại sao điều này hoạt động sẽ là một bước hữu ích để tìm ra lý do tại sao trước đó không quá.


Câu trả lời:


10

Tôi đã nhận được lời giải thích ban đầu về trường hợp thử nghiệm này từ Stefan Seyfried, người đã viết bài báo mà ví dụ này được lấy từ. Vấn đề ở đây là các bộ phận lập lịch CPU của các nhóm luôn luôn nhằm mục đích giữ cho bất kỳ CPU có sẵn nào bận rộn; nó không bao giờ thực thi một giới hạn cứng nếu mọi thứ sẽ phù hợp cùng một lúc.

Trong trường hợp hai tiến trình (cao và thấp ở đây) đang chạy trên> = 2 lõi, thì nó sẽ chỉ giữ mức cao ở một lõi và thấp ở lõi kia. Cả hai sau đó sẽ chạy mọi lúc, với mức sử dụng gần 100%, bởi vì họ có thể làm như vậy mà không gặp phải tình huống mà bộ lập lịch không cho họ đủ thời gian trên CPU. lập lịch cpu.share chỉ xảy ra nếu thiếu.

Trong trường hợp thứ hai, cả hai quá trình được ghim vào cùng một CPU. Sau đó, logic chia sẻ CPU phải làm một cái gì đó hữu ích với các số cpu.shares tương đối để cân bằng chúng, và nó làm điều đó như hy vọng.

Giới hạn cứng đối với việc sử dụng CPU không có khả năng xuất hiện cho đến khi bản vá Kiểm soát băng thông CFS xuất hiện . Tại thời điểm đó, có thể có được một cái gì đó giống như những gì tôi đã hy vọng.


Nó dường như được làm việc như mong đợi cho tôi. Tất nhiên điều này đã được đăng một số năm trước vì vậy những điều đã được cải thiện cho bạn trong các hạt nhân gần đây?
Ken Sharp
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.