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á.