2012-05-16 33 views
13

Tôi có một quá trình mà dường như bế tắc:CPU Sử dụng cao cho ngủ xử lý

# strace -p 5075 
Process 5075 attached - interrupt to quit 
futex(0x419cf9d0, FUTEX_WAIT, 5095, NULL 

Nó đang ngồi trên "futex" gọi hệ thống, và có vẻ là vô thời hạn chờ đợi vào một khóa. Quá trình này được thể hiện được tiêu thụ một số lượng lớn các CPU khi "top" được điều hành:

# top -b -n 1 
top - 23:13:18 up 113 days, 4:19, 1 user, load average: 1.69, 1.74, 1.72 
Tasks: 269 total, 1 running, 268 sleeping, 0 stopped, 0 zombie 
Cpu(s): 8.1%us, 0.1%sy, 0.0%ni, 91.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 
Mem: 12165696k total, 3810476k used, 8355220k free, 29440k buffers 
Swap: 8388600k total, 43312k used, 8345288k free, 879988k cached 

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
5075 omdb  18 0 2373m 1.7g 26m S 199.7 14.9 102804:11 java 

Quá trình này cũng được chứng minh là trong một "S" - trạng thái ngủ, có ý nghĩa nếu nó được chờ đợi vào một số nguồn. Tuy nhiên, tôi không hiểu tại sao sử dụng CPU sẽ gần 200% nếu quá trình ở trạng thái ngủ. Tại sao đầu báo cáo sử dụng CPU cao như vậy trên một quá trình ngủ? Không nên sử dụng CPU của nó bằng không?

Trả lời

5

Không có sự tương quan giữa mức sử dụng CPU theo báo cáo của top và trạng thái xử lý. Các man page nói (nhấn mạnh mỏ):

% CPU - sử dụng CPU

phần của nhiệm vụ của thời gian CPU trôi qua kể từ khi cập nhật màn hình cuối cùng, thể hiện dưới dạng một tỷ lệ phần trăm của tổng số Thời gian CPU.

Vì vậy, quá trình của bạn thực sự đã sử dụng một lượng lớn thời gian xử lý kể từ lần cập nhật màn hình cuối cùng. Nó đang ngủ, có, nhưng đó là bởi vì quá trình đang chạy là top chính nó (có ý nghĩa, vì nó hiện đang cập nhật màn hình).

+1

Vâng, thực tế là 'hàng đầu' đang chạy không có nghĩa là quy trình khác phải đang ngủ. Hơn 100% sử dụng ngụ ý một hệ thống đa lõi ;-). Mặc dù vỏ tương tác và các quy trình con mà nó sinh ra có thể đồng thời đang chạy và * đang xảy ra * để khiến nhiệm vụ khác phải ngủ, nhưng nó không nhất thiết là trực tiếp của một nguyên nhân, đúng không? – binki

4

Đầu ra top hoàn toàn bình thường.

Tính toán trung bình tải bao gồm các quy trình đang chờ thứ gì đó (mutexes/futexes, IO vv) cũng như các quá trình thực sự đang sử dụng CPU. Hãy thử nghiệm bằng cách, ví dụ: chạy một cái gì đó như:

dd if=/dev/sda of=/dev/null 

và xem đầu ra hàng đầu để xem điều gì xảy ra. Nó sẽ làm tăng tỷ lệ trung bình tải bằng 1.

Nếu bạn nhìn vào dòng này:

Cpu(s): 8.1%us, 0.1%sy, 0.0%ni, 91.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 

các "id" trong "91,8% id" có nghĩa là "nhàn rỗi". Vì vậy, CPU không thực sự làm được gì nhiều.

2

Con ứng dụng của bạn có xử lý không? Đầu ra strace có thể chỉ ra rằng quá trình chính chỉ là chờ đợi quá trình con để hoàn thành công việc của họ. Nếu có, bạn có thể thử chạy

strace -f -p 5075 

để theo dõi quá trình con.

Các vấn đề liên quan