Với những người làm DevOps, một trong những công việc không thể thiếu là giám sát (monitoring) một hệ thống, có rất nhiều những thông số quan trọng cần theo dõi nhưng có một thông số cơ bản mà không phải ai cũng hiểu rõ là Load Average, chúng ta hãy cũng tìm hiểu nhé!
Load Average là gì?
Đã bao giờ bạn gõ thử lệnh uptime
để ý thấy 3 chỉ số cuối cùng chưa?
➜ uptime
20:31 up 8 days, 1:22, 3 users, load averages: 1.75 2.73 4.20
Đây chính là 3 chỉ số chỉ mức độ tải trung bình của CPU trong 1 phút - 5 phút - 15 phút, vậy tải trung bình (load average) là thế nào? Nó được tính toán như thế nào? Hãy thử hình tượng hoá một chút nhé!
H <-- Xe ôtô của bạn
| 1 | <-- Trạm thu phí
Giả sử process của bạn là một xe ô tô, CPU của bạn là trạm thu phí cần xử lý cho xe bạn đi qua, thời điểm hiện tại chỉ có 1 mình xe bạn đi qua, và cứ 6 giây trôi qua trạm mới phải xử lý thêm 1 xe tiếp theo, vậy khi đó trong 1 phút trạm chỉ xử lý khoảng 6 xe (tức 6 processes). Vậy mức độ tải trung bình trong 1 phút chỉ ~0.1 (10%), rất nhẹ nhàng và mượt mà.
...
H <-- Xe ôtô của bạn
H'
H'
H'
| 1 | <-- Trạm thu phí
Đến cuối tuần, mọi người về quê nhiều nên số lượng xe cũng nhiều hơn, trạm thu phí liên tục phải xử lý không được ngơi tay lúc nào, tuy nhiên không xe nào phải đứng chờ. Lúc này trạm đã đạt công suất full load 100% tức là 1, hệ thống sẽ tiếp tục ghi nhận thông số này.
...
H <-- Xe ôtô của bạn
H'
H'
H'
H'
H'
H'
| 1 | <-- Trạm thu phí
Rồi ngày lễ đến gần, số lượng xe bỗng nhiên tăng đột biến, các xe ùn ứ, có xe thì đi lề mề, làm cho trạm quá tải, trạm tiếp tục phải xử lý liên tục nhưng các xe vẫn phải phải đứng chờ rất lâu để đợi được xử lý. Lúc này hệ thống đã trở nên quá tải hơn 100% (tức > 1), có quá nhiều process vẫn đang chờ đợi...
Khi nhìn vào thông số trên, bạn có thể biết CPU liệu có đang quá tải không để có biện pháp xử lý sao cho hiệu quả, ví dụ có process nào đó chiếm dụng quá mức do bị deadlock không thể giải phóng tài nguyên? Hay có thể hệ thống đón nhận một lượng request lớn hơn mức server có thể đảm nhận?
Đối mới multi-processors?
Như bạn thấy ở trên chúng ta chỉ có duy nhất 1 trạm thu phí, tương ứng với máy single-core, trong lúc một process đang được xử lý mà có một process khác cũng request xử lý thì nó sẽ phải đợi. Tuy nhiên, hiện nay CPU rất đa dạng và có nhiều core/thread vì vậy số lượng process có thể xử lý đồng thời cũng lớn hơn nhiều.
H <-- Xe ôtô của bạn
H'
H'
| H' | H' | H' | H' | <-- Trạm thu phí
Ví dụ như trên có tới 4 trạm thu phí (4 cores) nên tốc độ xử lý nhanh hơn, tuy nhiên với số lượng process lớn thì vẫn có thể bị quá tải như bình thường ^^.
Đọc và hiểu sao cho đúng?
Một trong những vấn đề khi nhiều người tiếp cận chưa tìm hiểu kĩ về load average là hiểu sai thông số này khi có nhiều core/thread.
"Load Average" của CPU được định nghĩa là số lượng process cần tài nguyên tính toán của CPU tại thời điểm nhất định. Giả sử tải trung bình của máy tính bạn hiện tại là 3.2, điều đó có nghĩa là tại thời điểm đó đang có trung bình 3.2 processes cần CPU xử lý. Tại thời điểm process cần CPU, nếu CPU đang rảnh process sẽ được OS cho.
Vậy nếu CPU sau một thời điểm nhất định luôn > 1 thì tức là CPU load quá tải, các process đang phải chờ lẫn nhau và cần có cảnh báo để tìm hiểu vấn đề ngay. Tuy nhiên nếu bạn có 4 core chẳng hạn, thì nếu load average = 3.2 thì có nghĩ là CPU load chưa hề quá tải, lúc đó max load average = 4, việc thiết lập cảnh báo cũng sẽ cần thay đổi.
Ngoài ra, để tránh hiểu nhầm về khả năng CPU Usage với CPU Load, mình xin phép trích dẫn tài liệu cũ ở blog KTMT.
Việc đánh giá hiệu năng CPU tùy thuộc vào từng bài toán cụ thể. Ta sẽ đánh giá về hiệu năng sử dụng CPU qua các trường hợp sau (giả sử máy tính có 6 cores 12 threads - ví dụ Intel Xeon):
- Tỉ lệ sử dụng CPU thấp (1%), tải CPU thấp (3 - 3 processes / 12 cores)
- Tỉ lệ sử dụng CPU cao (80%), tải CPU thấp (3 - 3 processes / 12 cores)
- Tỉ lệ sử dụng CPU thấp (1%), tải CPU cao (18 - 18 processes / 12 cores)
- Tỉ lệ sử dụng CPU cao (80%), tải CPU cao (18 - 18 processes / 12 cores)
Trong trường hợp đầu, máy tính của bạn hầu như không dùng CPU mấy. CPU dành hầu hết thời gian cho tính toán thấp, số lượng process cũng không cao. Đứng từ góc độ chi phí, bạn đã chi tiền mua 1 CPu quá tốt so với nhu cầu thực tế :-)
Trường hợp 2, bạn đang sử dụng CPU ở mức khá. Bạn bắt CPU tính toán cật lực. Tuy vậy tải trung bình của CPU chỉ có 3, có nghĩa là năng lực CPU của bạn vẫn còn rất lớn mà bạn hoàn toàn có thể tận dụng. Bạn hoàn toán có thể bật thêm 9 processes với mức tính toán như hiện tại mới có thể tận dụng được hết hiệu năng của CPU.
Trường hợp 3 khá lý thú. CPU của bạn được dùng cho những tính toán rất nhẹ nhàng có thể xong ngay lập tức nhưng số lượng process cần CPU lại khá cao. Điều này nói lên rằng CPU của bạn đang bị quá tải process. Có nhiều lý do dẫn đến trường hợp này và mỗi trường hợp có nhiều cách giải quyết khác nhau. Một ví dụ cho trường hợp này là máy chủ web. Việc render các trang web là tính toán không hề nặng, tuy vậy với các máy chủ web chịu trafic lớn (số lượng connection lớn), các process phục vụ request sẽ phải xếp hàng dẫn đến tình trạng trang web bị phục vụ thời gian kéo dài hơn. Một ví dụ khác là máy chủ dành thời gian chủ yếu đợi thao tác vào ra (I/O) chẳng hạn nhưng truy vấn cơ sở dữ liệu. Số lượng query lớn, số lượng truy vấn cần sắp xếp lớn nhưng dữ liệu cần sắp xếp lại bé, thời gian đợi dữ liệu từ đĩa cứng lại cao. Vì vậy phần lớn CPU sẽ idle, nhưng tải CPU vẫn cao. Đối với trường hợp này, ta chỉ có cách là mua CPU với tần số thấp hơn và chia tải ra nhiều máy hơn để tối ưu hóa chi phí.
Trường hợp 4 là trường hợp bạn đang sử dụng CPU một cách hiệu quả nhất. Mỗi cores đều bận rộn tính toán và hầu hết các cores đều được cho sử dụng. Tùy bài toán tính toán mà trường hợp này có thể là tốt hay xấu. Nếu đây là máy chủ web có lẽ đã đến lúc bạn mua thêm máy tính.