# Tỷ lệ sử dụng CPU không đáng tin

Trong công việc quản lý máy chủ, một câu hỏi mà mọi người luôn quan tâm là mức độ gần với công suất tối đa của máy chủ. Có vẻ như đây là một điều đơn giản phải không? Chỉ cần mở công cụ theo dõi hệ thống như top, kiểm tra mức độ sử dụng mạng, bộ nhớ và CPU, và chỉ số nào cao nhất sẽ cho bạn biết bạn đang ở gần giới hạn đến mức nào.

Ví dụ, máy tính này đang sử dụng 50% CPU, vì vậy nó có thể có khả năng gấp đôi công việc hiện tại.

Tuy nhiên, mọi người thường phát hiện ra rằng khi cố gắng dự báo các con số này, mức độ sử dụng CPU không tăng theo cách tuyến tính. Nhưng vấn đề có thể nghiêm trọng đến mức nào?

Để trả lời câu hỏi này, tôi đã chạy nhiều bài kiểm tra tải nặng và theo dõi cả khối lượng công việc thực hiện cũng như mức độ sử dụng CPU được hệ thống báo cáo, sau đó tôi đã biểu đồ hóa kết quả.

## Thiết lập kiểm tra

Đối với máy kiểm tra, tôi đã sử dụng một máy tính để bàn chạy Ubuntu với bộ xử lý Ryzen 9 5900X (12 nhân / 24 luồng). Tôi cũng đã bật Precision Boost Overdrive (tức là Turbo).

Tôi đã viết một kịch bản chạy stress-ng trong một vòng lặp, đầu tiên sử dụng 24 worker và cố gắng chạy mỗi worker ở các mức sử dụng khác nhau từ 1% đến 100%, sau đó sử dụng từ 1 đến 24 worker tất cả ở mức sử dụng 100%. Kịch bản sử dụng phương thức kiểm tra căng thẳng khác nhau và đo số lượng hoạt động có thể hoàn thành (“Bogo ops”).

Lý do tôi thực hiện hai phương pháp khác nhau là vì hệ điều hành thông minh trong việc lên lịch công việc, và việc lập lịch một số lượng worker nhỏ ở mức sử dụng 100% có thể được thực hiện tối ưu (đây là một gợi ý), nhưng với 24 worker tất cả ở mức 50% sử dụng thì hệ điều hành khó có thể làm gì khác ngoài việc phân bổ công việc một cách đồng đều.

## Kết quả

Bạn có thể xem kết quả thô dạng CSV tại đây.

### CPU chung

Kiểm tra cơ bản nhất chỉ chạy tất cả các bài kiểm tra căng thẳng CPU của stress-ng trong một vòng lặp.

Bạn có thể thấy khi hệ thống báo cáo 50% sử dụng CPU, nó thực sự đang làm 60-65% công việc tối đa mà nó có thể thực hiện.

### Toán học số nguyên 64-bit

Nhưng có lẽ đó chỉ là một sự trùng hợp ngẫu nhiên. Điều gì sẽ xảy ra nếu chúng ta chỉ chạy một số phép tính ngẫu nhiên trên số nguyên 64-bit?

Đây còn tệ hơn! Tại mức “sử dụng 50%”, chúng ta thực sự đang làm 65-85% công việc tối đa có thể hoàn thành. Nhưng nó không thể tệ hơn được nữa phải không?

### Toán học ma trận

Chắc chắn có điều gì đó không ổn. Khi làm toán ma trận, “mức sử dụng 50%” thực sự là 80% đến 100% công việc tối đa có thể thực hiện.

Và nếu bạn đang thắc mắc về ảnh chụp màn hình công cụ theo dõi hệ thống từ phần đầu bài, đó là bài kiểm tra toán ma trận chạy với 12 worker, và bạn có thể thấy nó thực sự báo cáo 50% sử dụng CPU ngay cả khi các worker bổ sung không làm gì cả (ngoại trừ việc làm cho chỉ số sử dụng tăng lên).

## Điều gì đang xảy ra?

### Siêu luồng (Hyperthreading)

Bạn có thể nhận thấy rằng biểu đồ thay đổi tại 50%, và tôi đã hữu ích thêm các hồi quy tuyến tính từng phần cho thấy sự phù hợp.

Lý do chính điều này xảy ra là do siêu luồng: một nửa các “nhân” trên máy này và hầu hết các máy khác đang chia sẻ tài nguyên với các nhân khác. Nếu tôi chạy 12 worker trên máy này, mỗi worker sẽ được lên lịch trên nhân vật lý riêng của chúng mà không có tài nguyên được chia sẻ, nhưng một khi tôi vượt qua con số đó, mỗi worker bổ sung sẽ chia sẻ tài nguyên với một worker khác. Trong một số trường hợp (các bài kiểm tra CPU chung), điều này khiến mọi thứ trở nên tồi tệ hơn một chút, và trong một số trường hợp khác (toán ma trận nặng SIMD), không còn tài nguyên hữu ích nào để chia sẻ.

### Turbo

Khó nhận thấy hơn, nhưng Turbo cũng đang có tác động. Bộ xử lý cụ thể này chạy ở tần số 4,9 GHz ở mức sử dụng thấp, nhưng dần giảm xuống 4,3 GHz khi nhiều nhân trở nên hoạt động hơn.

Lưu ý trục y được phóng to. Tốc độ xung “chỉ” giảm 15% trên bộ xử lý này.

Vì mức sử dụng CPU được tính là chu kỳ bận rộn / tổng số chu kỳ, điều này có nghĩa là mẫu số đang nhỏ hơn trong khi tử số đang lớn hơn, vì vậy chúng ta có thêm một lý do khác tại sao mức sử dụng CPU thực tế tăng nhanh hơn tuyến tính.

## Điều này có quan trọng không?

Nếu bạn nhìn vào mức sử dụng CPU và giả định rằng nó sẽ tăng tuyến tính, bạn sẽ gặp nhiều khó khăn. Nếu bạn sử dụng CPU hiệu quả (chạy ở mức “trên 50%” sử dụng), mức sử dụng được báo cáo là một sự đánh giá thấp, đôi khi là đáng kể.

Và hãy nhớ rằng tôi chỉ đã cho thấy kết quả cho một bộ xử lý, nhưng hiệu suất siêu luồng và hành vi Turbo có thể khác nhau đáng kể giữa các bộ xử lý khác nhau, đặc biệt là từ các công ty khác nhau (AMD so với Intel).

Cách tốt nhất mà tôi biết để khắc phục điều này là chạy các bài kiểm tra và theo dõi công việc thực tế:

1. Kiểm tra xem máy chủ của bạn có thể làm bao nhiêu công việc trước khi xảy ra lỗi hoặc độ trễ không thể chấp nhận được.
2. Báo cáo lượng công việc mà máy chủ của bạn đang thực hiện hiện tại.
3. So sánh hai chỉ số này thay vì mức sử dụng CPU.

Bogo ops có thể là một tham chiếu đến BogoMIPS, một bài kiểm tra “giả tạo” mà Linux thực hiện khi khởi động để hiểu một cách thô sơ về hiệu suất CPU.