Tại sao quá trình ksoftirqd / 0 sử dụng tất cả CPU của tôi?


67

Tôi cảm thấy Ubuntu đang chạy chậm một chút, và sau đó tôi đã đi xem các quy trình đang chạy trên nó và tìm thấy một quy trình sử dụng thứ gì đó giống như 50% CPU được gọi ksoftirqd/0.

Có ai biết quá trình này làm gì không, tại sao nó lại sử dụng quá nhiều CPU và làm thế nào để làm cho nó ít sử dụng CPU hơn?

Câu trả lời:


77

Máy tính của bạn giao tiếp với các thiết bị được gắn vào nó thông qua IRQ (yêu cầu ngắt). Khi một ngắt xuất phát từ một thiết bị, hệ điều hành sẽ tạm dừng những gì nó đang làm và bắt đầu giải quyết ngắt đó.

Trong một số trường hợp, IRQ đến rất nhanh lần này đến lần khác và hệ điều hành không thể hoàn thành việc phục vụ trước khi người khác đến. Điều này có thể xảy ra khi card mạng tốc độ cao nhận được số lượng gói rất lớn trong khung thời gian ngắn.

Bởi vì hệ điều hành không thể xử lý IRQ khi chúng đến (vì chúng đến quá nhanh lần lượt), hệ điều hành xếp hàng chúng để xử lý sau bởi một quy trình nội bộ đặc biệt có tên ksoftirqd.

Nếu ksoftirqdđang chiếm nhiều hơn một phần trăm thời gian CPU, điều này cho thấy máy đang chịu tải nặng.


22

Từ trang man, ksoftirqdlà một luồng nhân trên mỗi cpu chạy khi máy đang tải nặng ngắt.

Bạn có thể điều chỉnh cài đặt một chút, bằng cách xác định cpu nào chọn một ngắt nhất định. Bạn làm điều này bằng cách thay đổi nội dung của /proc/irq/$interrupt_number/smp_affinity. Bạn có thể nhận được một danh sách các ngắt và ý nghĩa của chúng bằng cách thực hiện:

cat /proc/interrupts

Số trong smp_affinitylà một bitmap của cpus, được biểu thị bằng mã hex. Bit ngoài cùng bên phải là ít quan trọng nhất. Chẳng hạn, hệ thống của tôi có 8 nhân. Nếu tôi chỉ muốn sử dụng các lõi 1, 3 và 4, tôi sẽ đặt smp_affinity thành 1a:

cpu_7 cpu_6 cpu_5 cpu_4 cpu_3 cpu_2 cpu_1 cpu_0
  0     0     0     1     1     0     1     0    = 0001 1010 = 1a (in hex)

Cá nhân, tôi thiết lập bất kỳ cpu nào để có thể nhận ngắt 29 (eth0 trong hệ thống 8 lõi của tôi) với:

sudo echo ff > /proc/irq/29/smp_affinity

4

ksoftirqd là một luồng nhân trên mỗi cpu chạy khi máy đang tải quá tải bị gián đoạn nặng. Vì vậy, nó không ăn cpu của bạn mà là giảm tải IRQ của bạn.


1
Tôi biết đó là Askubfox.com, nhưng trên Raspberry Pi thì hoàn toàn ngược lại, ksoftirqd đang ăn tất cả CPU khi tải IRQ chuyên sâu.
máy móc

Theo tôi hiểu thì quá trình ksoftirqd đã hoãn các softirqs (khi chúng không thể được xử lý đủ nhanh). Khi có nhiều softirq và / hoặc chúng tiêu tốn rất nhiều thời gian của CPU để xử lý thì ksoftirqd tiêu tốn rất nhiều thời gian của CPU.
pabouk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.