Tìm hiểu nguyên nhân gốc rễ của High Load Average trong Linux

Tác giả Security+, T.Năm 05, 2024, 11:46:39 SÁNG

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

1. Vấn đề High Load Average trong lệnh top trong Linux

  • Giá trị Trung bình Tải Load Average trong Linux là gì và nó được tính như thế nào?
  • Trung bình của tải Load Average của tôi có đủ cao để lo lắng không?
  • Làm thế nào để tìm ra nguyên nhân gốc rễ của tải cao?


Mục đích của bài viết này là giải thích cách tính giá trị trung bình của tải Load Average, cách sử dụng giá trị đó và cách xác định điều gì đang khiến giá trị trung bình của tải Load Average tăng lên.

2. Giá trị Trung bình Tải Load Average trong Linux là gì và nó được tính như thế nào?

Theo nhận xét của nhà phát triển Kernel trong hàm Loadavg.c trong mã Kernel Linux, mức tải trung bình là: "mức trung bình giảm dần theo cấp số nhân của nr_running + nr_uninterruptible".

  • nr_running - số tiến trình đang chạy
  • nr_uninterruptible - số lượng tiến trình ở trạng thái ngủ không bị gián đoạn

Một nguyên tắc chung cho Linux là đánh dấu trạng thái tiến trình theo cách này:

  • R - Quá trình ở trạng thái đang chạy. Các tiến trình ở trạng thái này thường tiêu tốn thời gian xử lý của CPU và có tất cả dữ liệu cần thiết để thực thi vào lúc đó.
  • D – Xử lý ở trạng thái ngủ không bị gián đoạn. Nói một cách đơn giản, loại tiến trình như vậy đang chờ dữ liệu được chuẩn bị và chuyển vào bộ nhớ để CPU có thể hoạt động với nó. Sẽ an toàn khi giả định rằng tất cả các tiến trình như vậy đang chờ các hoạt động đầu vào/đầu ra được hoàn thành trước khi tiến trình có thể chuyển sang trạng thái đang chạy.

Trên ảnh chụp màn hình bên dưới, bạn có thể thấy đầu ra của tiện ích dòng lệnh 'top' với cột trạng thái được đánh dấu màu đỏ. Trong ví dụ này, tiến trình 'dd' ở trạng thái 'R', có nghĩa là nó đang chạy và tiêu thụ CPU ngay bây giờ.


3. Tải trọng của tôi có đủ cao để lo lắng không?

Những gì có thể được coi là "cao"? Khi bạn liên tục thấy Tải trung bình cao hơn số lõi trên máy chủ (tải trung bình trên 8, trên hệ thống CPU 8 lõi), rất có thể đã xảy ra sự cố nào đó trên máy chủ hoặc máy chủ không thể xử lý tải.

Tuy nhiên, bạn không nên nhìn vào giá trị trung bình của tải Load Average trừ khi bạn gặp vấn đề liên quan đến sự chậm chạp của một thứ gì đó chạy trên máy chủ hoặc tải trung bình rất cao.

Nhìn chung, bạn nên coi giá trị trung bình của tải Load Average là một chỉ báo giúp khắc phục sự cố chậm của máy chủ/ứng dụng. Bản thân giá trị không thể là một vấn đề. Máy chủ có mức tải trung bình rất cao vẫn có thể đáp ứng và hoạt động mà không gặp sự cố. Tuy nhiên, trong hầu hết các loại khối lượng công việc, bạn sẽ muốn giữ giá trị tải trung bình giống như số lượng lõi CPU của bạn trong hầu hết thời gian.

4. Làm thế nào để tìm ra nguyên nhân gốc rễ của tải cao?

Vì chúng tôi đã xác định rằng chỉ có 2 loại tiến trình đang ảnh hưởng đến giá trị trung bình của tải Load Average, nên chìa khóa để tìm ra nguyên nhân gốc rễ là tìm loại tài nguyên đang thiếu và sau đó tìm ra nguồn tài nguyên đó đã biến mất ở đâu.

Các tiến trình ở trạng thái đang chạy sẽ tiêu tốn thời gian của CPU, do đó mức sử dụng CPU càng cao thì tải sẽ càng cao.

Các tiến trình ở trạng thái 'D' đang chờ đầu vào/đầu ra, thường là thiết bị lưu trữ. Nếu quá chậm và CPU mất nhiều thời gian để chờ dữ liệu được tải - mức tải trung bình sẽ tăng lên.

Tiện ích "top" là một công cụ tuyệt vời có thể giúp bạn tìm ra những gì máy chủ của bạn thiếu - CPU, IO hoặc cả hai.

Hãy xem một ví dụ về đầu ra lệnh 'top' bên dưới:


Đây là đầu ra từ một hệ thống có 12 lõi. Tải trung bình trong 1 phút cao hơn gấp 5 lần so với số lõi CPU nên có thể coi là cao.

Trong chuỗi trên chúng ta cần hiểu ý nghĩa của 2 chuỗi này:


Trong trường nhiệm vụ, mọi thứ đều đơn giản - '116 đang chạy' có nghĩa là có 116 nhiệm vụ ở trạng thái 'R', điều đó hơi quá nhiều. Vì vậy, chúng ta có thể đưa ra kết luận rằng các tiến trình đang chồng chất và xử lý quá chậm.
Để hiểu lý do tại sao, hãy xem xét chuỗi thứ hai, chuỗi này hiển thị mức sử dụng CPU. Nó được chia thành các loại:

  • us, user: phần trăm thời gian CPU chạy các tiến trình của người dùng (bao gồm cả root)
  • sy, system: thời gian chạy các tiến trình kernel. Những tiến trình này là cần thiết để giữ cho hệ thống của bạn tồn tại và hoạt động
  • ni, tốt đẹp: thời gian chạy các tiến trình người dùng tốt đẹp. Các tiến trình được chọn là những tiến trình có mức độ ưu tiên tùy chỉnh được đặt bằng tiện ích 'Nice'.
  • id, nhàn rỗi: thời gian không làm gì cả
  • wa, IO-wait: thời gian chờ hoàn thành I/O
  • hi: thời gian dành cho việc phục vụ các phần cứng bị gián đoạn
  • si: thời gian dành cho việc phục vụ các phần mềm bị gián đoạn
  • st: thời gian bị nhà ảo hóa đánh cắp khỏi máy ảo này

Trong trường hợp này, chúng ta có thể thấy rằng thời gian nhàn rỗi bằng 0 và hơn 80% CPU được sử dụng cho các tác vụ của người dùng, do đó, nhiệm vụ tiếp theo sẽ là xác định tác vụ nào chiếm nhiều tài nguyên đó.