[Loadavg] - Phần I : Tổng quan Loadavg

Ting ..ting.. không phải lương về đâu các bạn. Tiếng tin nhắn cảnh báo đã không còn xa lạ gì với một sysadmin. Login vào server để kiểm tra nguyên nhân. Quái! Sao lần này login lại lâu đến như vậy. Mọi command cũng chậm hơn rất nhiều so với bình thường. Bình tĩnh tìm hiểu kỹ hơn. Tôi giật mình: server của tôi đang có loadavg cao ngất ngưởng.

Điều này đồng nghĩa với việc server trở nên ì ạch. Việc xử lý process chậm đi đáng kể. Tại sao lại có sự bất thường này? Gãi râu tự hỏi. Vậy:

  • Loadavg là gì và được tính toán như thế nào?
  • Loadavg ở ngưỡng ra sao thì hợp lý?
  • Những yếu tố nào ảnh hưởng đến loadavg?
  • Phương án phân tích và xử lý khi server tải cao thế nào?

Tôi sẽ hoàn thành phần I trong loạt bài viết về Loadavg bằng việc trả lời 4 câu hỏi kể trên.

Loadavg là gì và được tính toán như nào?

Trước tiên bắt đầu với systemload hay còn gọi là load.
Systemload thể hiện số công việc hiện tại hệ thống đang thực thi.
Một server hoàn toàn nhàn rỗi có load là 0
Mỗi tiến trình đang chạy hoặc chờ đợi cpu xử lý sẽ add giá trị 1 vào load
Ví dụ với load = 5 => Có 5 process đang chạy hoặc chờ xử lý (Thread running, waiting)
Nhưng chúng ta thường nghe đến khái niệm loadavg

Tại sao không phải là load mà là loadavg???

Ví dụ thế này để các bạn dễ hình dung:

  • Tại 1 phần trăm giây đầu tiên Load = 0 vì server đang rảnh rỗi
  • Tại phần trăm giây tiếp theo Load = 5 vì thời điểm có 5 proces cần xử lý.
  • Tại phần trăm giây sau đó Load = 99 rất lớn vì thời điểm có rất nhiều process chạy qua hệ thống.

Các con số Load cho mỗi một thời điểm này không có ý nghĩa nhiều trong việc đánh giá tải của hệ thống.
Loadavg thể hiện tải trung bình của hệ thống qua mỗi đoạn thời gian: cho thấy trung bình có bao nhiều process mà server phải thực hiện.
Hay nói cách khác: giá trị Loadavg cho ta thấy được trung bình khối lượng công việc hệ thống phải xử lý trong mỗi khoảng thời gian: 1 phút, 5 phút và 15 phút.

cat /proc/loadavg  
3.00 5.00 4.00  

Hiểu giá trị console này như sau:
Trong 1 phút gần đây trung bình có 3 process cần được xử lý (3 thread running, waiting)
Tương tự như vậy có trung bình 5 process xử lý trong vòng 5 phút và 4 process xử lý trong vòng 15 phút.

Loadavg ở ngưỡng ra sao thì hợp lý?

Loadavg có một ngưỡng chung?
Các server đều có một ngưỡng loadavg cố định?

Câu trả lời là Không
Điều này còn phụ thuộc vào server có bao nhiêu CPU. Có thể xem số CPU của sever bằng lệnh sau:

cat /sys/devices/system/cpu/online  
0-3  

Như vậy server hiện tại (bao gồm cả hyper-v threading) có 4 CPUs
Giả sử với mỗi CPU là 1 cây cầu. Process qua mỗi CPU thể hiện như sau:

process_cpu

Với 4 CPUs chúng ta có 4 cây cầu và có thể xử lý với mức Loadavg <= 4.00 là mức lý tưởng.

Để thấy rõ hơn điều này ta thực hiện 1 vài thử nghiệm với server 4 CPUs. Chúng ta cùng xem nó xử lý process như nào khi loadavg lần lượt bằng: 1.00, 4.00 và 8.00

  • Case 1: Server 4 CPUs với loadavg = 1.00

Process vừa tạo được hoàn toàn sử dụng CPU với tốc độ xử lý bình thường, performance đạt 100%. Loadavg lúc này tăng lên 1.00.

top-1cpu

  • Case 2: Server 4 CPUs với loadavg = 4.00

top-4cpu

4 process chạy đồng thời đang phân chia sử dụng 4 CPUs mà server đang có. Tốc độ xử lý vẫn đạt 100%. Loadavg lúc này đã tăng lên 4.00

  • Case 3: Server 4 CPUs với loadavg = 8.00

top-8cpu

Loadavg thời điểm này lên tới 8.00 gấp đôi số CPU hiện có. Mỗi process chỉ còn sử dụng được 50% CPU => Tốc độ xử lý chậm đi tương ứng.
Qua hàng loạt case test, ta thấy loadavg nên duy trì nhỏ hơn hoặc bằng số CPU. Process càng vượt quá CPU hiện có bao nhiêu, tốc độ xử lý càng chậm đi tương ứng.

Những yếu tố nào ảnh hưởng đến loadavg?

Vậy điều gì làm tải của hệ thống tăng cao.
Như 1 vài case test ở mục 2 cho thấy mối quan hệ giữa CPU utilization và loadavg

Nhưng liệu loadavg có chỉ phụ thuộc vào CPU utilization?

Tải của hệ thống có thể được tính toán (count) dựa trên các tiến trình đang được xử lý (running on CPU) và các tiến trình runable (waiting for CPU)
Ngoài ra tải còn bao gồm các tiến trình uninterruptible sleep states (waiting disk I/O hoặc network). Những tiến trình này cũng góp phần làm tăng cao tải hệ thống mặc dù nó không thực sự sử dụng CPU.

--> Có 3 yếu tố góp phần làm tăng tải hệ thống:

  • Cpu Utilazion
  • Disk I/O
  • Network Traffic

Việc phân tích sự ảnh hưởng của các yếu tố này sẽ khá dài và phức tạp, chúng ta sẽ cùng nhau tìm hiểu sâu thêm trong những phần sau. Giờ tôi sẽ hướng dẫn bạn cách phân tích và xử lý khi server gặp tải cao.

Phương án phân tích và xử lý khi server tải cao như nào?

Chúng ta đã thống nhất với nhau ba yếu tố:

  • Cpu Utilazion
  • Disk I/O
  • Network Traffic

đều có thể gây ảnh hưởng đến tải của hệ thống.

Cần xử lý những gì khi loadavg lên quá cao?

Ta cần phải phân tích yếu tố nào gây tải cao hệ thống.
Trước hết cần phải theo dõi CPU utilization.

  • Nếu lượng CPU utilization lớn hơn 100% và Loadavg vượt quá số CPU đang có.
    --> Có thể kết luận loadavg cao bởi lượng lớn các process đang running hoặc waiting cpu xử lý.
    Sử dụng top -i để theo dõi các process running phân tích các process và đưa phương án.

  • Nếu lượng cpu sử dụng vẫn bình thường (tức không quá cao) nhưng loadavg vẫn cao hơn số cpu đang có.
    --> Vậy có thể kết luận có thể disk I/O hoặc network traffic hoặc cả hai là yếu tố chính gây ra tải cao cho hệ thống.
    Sử dụng 1 số tool linux cung cấp như iotop, atop, vmstat để có thể phân tích chính xác yếu tố nào và đưa ra phương án xử lý.

Tôi đã trình bày về Loadavg và một số điều cần quan tâm, trong đó bao gồm những yếu tố ảnh hưởng tới Loadavg. Chi tiết những yếu tố này gây ảnh hưởng ra sao và mức độ ảnh hưởng đến Loadavg như thế nào, chúng ta sẽ cùng nhau tìm hiểu trong phần II của loạt bài viết về Loadavg - Các yếu tố ảnh hưởng tới Loadavg.

Link tham khảo

www.teamquest.com/import/pdfs/whitepaper/ldavg1.pdf
en.wikipedia.org/wiki/Load_(computing)
blog.scoutapp.com/articles/2009/07/31/understanding-load-averages