Tìm hiểu tác vụ nào đang tạo ra nhiều chuyển đổi ngữ cảnh trên linux


11

Theo vmstat, máy chủ Linux của tôi (2xCore2 Duo 2.5 GHz) liên tục thực hiện khoảng 20k chuyển đổi ngữ cảnh mỗi giây.

# vmstat 3
procs -----------memory----------  ---swap-- -----io----  -system-- ----cpu----
 r  b   swpd   free   buff  cache    si   so    bi    bo   in    cs us sy id wa
 2  0   7292 249472  82340 2291972    0    0     0     0    0     0  7 13 79  0
 0  0   7292 251808  82344 2291968    0    0     0   184   24 20090  1  1 99  0
 0  0   7292 251876  82344 2291968    0    0     0    83   17 20157  1  0 99  0
 0  0   7292 251876  82344 2291968    0    0     0    73   12 20116  1  0 99  0

... nhưng uptimehiển thị tải nhỏ: load average: 0.01, 0.02, 0.01topkhông hiển thị bất kỳ quy trình nào với mức sử dụng CPU cao.

Làm thế nào để tôi tìm ra chính xác những gì đang tạo ra các chuyển đổi bối cảnh? Quá trình / chủ đề nào?

Tôi đã cố gắng phân tích pidstatđầu ra:

# pidstat -w 10 1

12:39:13          PID   cswch/s nvcswch/s  Command
12:39:23            1      0.20      0.00  init
12:39:23            4      0.20      0.00  ksoftirqd/0
12:39:23            7      1.60      0.00  events/0
12:39:23            8      1.50      0.00  events/1
12:39:23           89      0.50      0.00  kblockd/0
12:39:23           90      0.30      0.00  kblockd/1
12:39:23          995      0.40      0.00  kirqd
12:39:23          997      0.60      0.00  kjournald
12:39:23         1146      0.20      0.00  svscan
12:39:23         2162      5.00      0.00  kjournald
12:39:23         2526      0.20      2.00  postgres
12:39:23         2530      1.00      0.30  postgres
12:39:23         2534      5.00      3.20  postgres
12:39:23         2536      1.40      1.70  postgres
12:39:23        12061     10.59      0.90  postgres
12:39:23        14442      1.50      2.20  postgres
12:39:23        15416      0.20      0.00  monitor
12:39:23        17289      0.10      0.00  syslogd
12:39:23        21776      0.40      0.30  postgres
12:39:23        23638      0.10      0.00  screen
12:39:23        25153      1.00      0.00  sshd
12:39:23        25185     86.61      0.00  daemon1
12:39:23        25190     12.19     35.86  postgres
12:39:23        25295      2.00      0.00  screen
12:39:23        25743      9.99      0.00  daemon2
12:39:23        25747      1.10      3.00  postgres
12:39:23        26968      5.09      0.80  postgres
12:39:23        26969      5.00      0.00  postgres
12:39:23        26970      1.10      0.20  postgres
12:39:23        26971     17.98      1.80  postgres
12:39:23        27607      0.90      0.40  postgres
12:39:23        29338      4.30      0.00  screen
12:39:23        31247      4.10     23.58  postgres
12:39:23        31249     82.92     34.77  postgres
12:39:23        31484      0.20      0.00  pdflush
12:39:23        32097      0.10      0.00  pidstat

Có vẻ như một số tác vụ postgresql đang thực hiện> 10 swiches bối cảnh mỗi giây, nhưng dù sao nó cũng không tổng cộng tới 20k.

Bất kỳ ý tưởng làm thế nào để đào sâu hơn một chút cho một câu trả lời?


Điều về postgre là chúng khác nhau nên các chương trình hoàn toàn khác nhau.
Gopoi

Câu trả lời:


5

Vâng, trường hợp khá thú vị. Hãy thử quan sát watch -tdn1 cat /proc/interrupts. Bạn có thấy bất kỳ thay đổi có giá trị ở đó?


"Ngắt bộ định thời cục bộ" đang tạo ra vài trăm (200-800) ngắt trên mỗi lõi CPU. Điều đó có nghĩa là gì? Ngoài ra eth0-rx / tx đang tạo ra một số ngắt vì lưu lượng truy cập trên máy chủ đó, nhưng điều đó không nhiều.
grzaks

Làm thế nào về "Ngắt cuộc gọi chức năng"?
poige

10

Hãy thử sử dụng

pidstat -wt

Tùy chọn 't' cũng hiển thị các chủ đề. Nó có thể là một chủ đề đang thực hiện các chuyển đổi bối cảnh.


1
chạy pidstat -wt | sắp xếp -n -k4 là tốt hơn.
Ismael Vacco

2

Trong phiên bản kernel mới hơn

sudo perf record -e context-switches -a  # record the events

# then ctrl+c

sudo perf report # inspect the result

Điều này sẽ cung cấp cho bạn kết quả chính xác về các sự kiện chuyển ngữ cảnh.

Và bạn có thể tìm thấy lý do gây ra các chuyển đổi ngữ cảnh bằng cách gắn cờ "-g" (Kết quả có thể đọc được xác định bởi thông tin biểu tượng)

sudo perf record -e context-switches -a -g

1

Chuyển đổi bối cảnh là bình thường. Một quá trình được gán cho một lượng tử thời gian, nếu nó kết thúc (hoặc nó bị tạm dừng do nhu cầu của nguồn tài nguyên) thì những gì nó phải làm nó có thể để bộ xử lý đi.

Điều đó nói rằng để đếm có bao nhiêu chuyển đổi ngữ cảnh được thực hiện (nó trở thành câu trả lời stackoverflow.com), nó sẽ lấy lệnh lịch trình kernel () bên trong để ghi vào các bảng quy trình. Sẽ không có chuyện đó nếu bạn lập trình kernel của riêng mình, bạn sẽ có thể nhìn thấy nhưng điều đó khá khó khăn.


1
Tốt. Tôi biết chuyển đổi ngữ cảnh là gì và nó có ý nghĩa gì đối với hiệu năng hệ thống. Tôi chỉ cần một cách để đo có bao nhiêu chuyển đổi ngữ cảnh được thực hiện để xử lý trên linux. Tôi đã tìm thấy các bộ đếm csw thô trong / Proc / * / stats (tự
nguyện_ctxt_switches

0

powertop có thể cho bạn biết tần suất một quá trình đánh thức CPU.

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.