2012-10-19 25 views
5

Gần đây, chúng tôi bắt đầu ứng dụng thử nghiệm ứng dụng của chúng tôi (một máy chủ trò chuyện dựa trên XMPP) sử dụng YJP 11.0.9. Trong thử nghiệm của chúng tôi, chúng tôi nhận thấy hành vi kỳ lạ sau đây.Tại sao công viên/unpark có sử dụng CPU 60%?

  1. Lấy mẫu hiển thị sun.misc.Unsafe.unpark (Object) chiếm 60% CPU.
  2. Đối với cùng một ứng dụng Theo dõi cho thấy rằng LockSupport.park (Object) chiếm 52% CPU.

Tôi đã thực hiện nhiều kiểm tra để xác nhận kết quả và mỗi khi tôi nhận được kết quả tương tự.

Tôi không thể hiểu tại sao unpark phải mất 60% thời gian và tại sao truy tìm hiển thị kết quả chính xác ngược lại.

Ai đó có thể giúp tôi hiểu những kết quả này. Am i thiếu cái gì ở đây?

Môi trường:

java -version 
java version "1.6.0_31" 
Java(TM) SE Runtime Environment (build 1.6.0_31-b04) 
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)
+1

Nó có thể mất nhiều nếu gọi 'unpark' là khá nhiều điều duy nhất thread bao giờ làm. Những gì bạn có nghĩa là "truy tìm cho thấy chính xác kết quả ngược lại"? Không truy tìm có lẽ đo thời gian trong một phương pháp? 'park' là một phương pháp chặn, vì vậy không có thời gian tự hỏi nào được chi tiêu trong đó. –

+0

@MarkoTopolnik cũng làm những việc khác. Về cơ bản vấn đề của nhà sản xuất/người tiêu dùng. Sản xuất sản xuất nhiệm vụ và gửi nó trong hàng đợi và thông báo cho người tiêu dùng chờ đợi. Hành vi tiêu dùng về nhiệm vụ và nếu không có nhiệm vụ nào có sẵn ngoài công viên. –

+0

Chủ đề gọi là 'unpark' không phải là chủ đề không được sử dụng. Chủ đề đó, đến lượt nó, có thể thực sự chỉ làm công việc nhỏ bên cạnh việc giải quyết các chủ đề tiêu dùng thích hợp. Đối với thời gian CPU của 'công viên', nó là một) khó khăn để đo lường do chặn và b) không thích hợp vì nó sẽ là một phần không đáng kể của thời gian thực tế chi tiêu trong trạng thái chưa sử dụng. –

Trả lời

3

Với lệnh chặn một số mức độ thấp thích đọc/ghi/viên/khóa "CPU" thời gian là hơn ước tính vì nó giả định nó được tiêu thụ CPU khi thực sự hoạt động được ngăn chặn. Thực tế unpark/công viên đều cao cho thấy bạn có một vấn đề, nhưng tôi nghi ngờ bạn nên dùng thấp hơn của hai phần trăm như là một ước tính.

3

Thời gian CPU cao là Unsafe.unpark là dấu hiệu quá mức Chuyển đổi ngữ cảnh. Dưới đây là một bài viết để có được những ý tưởng về cách đắt tiền là một chuyển đổi ngữ cảnh:

How long does it take to make a context switch?

Các tùy chọn dễ nhất để tìm hiểu CS đếm trên Linux được chạy vmstat <seconds>.

Khi CS cao được xác nhận (ví dụ: nhiều công tắc 10K trên mỗi lõi/giây) bạn lấy chủ đề vi phạm (bạn có thể sắp xếp chuỗi trong YJP theo thời gian CPU) và chạy strace -p <pid> -c để tìm nguyên nhân chuyển đổi, ví dụ: thread được đọc từ ổ cắm trong các mảnh nhỏ và nhận được tắt, trong trường hợp tăng bộ đệm ổ cắm có thể giúp đỡ.

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