2011-10-14 35 views
5


Tôi có một chương trình máy chủ thăm dò cơ sở dữ liệu cho các yêu cầu mới, tôi muốn bỏ phiếu này trong khoảng thời gian 1 phút, tôi đã thiết lập một Thread.sleep() trong chương trình trong khi vòng lặp.
Vấn đề là bất cứ khi nào chương trình này được cho là "ngủ" thì mức tiêu thụ CPU tăng lên đáng kể (khoảng 25 - 30%).
Nghịch lý, khi chương trình không hoạt động và đang bận xử lý yêu cầu, mức tiêu thụ CPU giảm xuống 0,4%.
Tôi đọc trực tuyến và phát hiện ra rằng có hiệu suất truy cập liên quan đến thread.sleep, nhưng tôi không thể tìm thấy bất kỳ thay thế khả thi (Thread.wait yêu cầu thông báo về một đối tượng, điều mà tôi cảm thấy là vô ích trong kịch bản của tôi)Mức tiêu thụ CPU khi chỉ đang ngủ bằng cách sử dụng Thread.sleep

Vòng lặp chính (khi không có yêu cầu mới) không làm gì cả, đây là bộ xương của tất cả những gì đang được thực hiện khi mức tiêu thụ CPU là 25%

-> poll
-> Không có bản ghi mới?
-> Ngủ
-> lặp lại

+0

Bạn ngủ trong bao lâu? và phần còn lại của vòng lặp 'while' đang làm gì? – EJP

+2

Điều đó thật kỳ lạ. Bạn có thể giảm nó xuống một chương trình nhỏ hoạt động giống như bạn mô tả và đăng nó ở đây không? Ít nhất, vui lòng chỉ cho chúng tôi bộ xương của vòng lặp 'sleep' của bạn (sử dụng mã thực tế). – NPE

+0

Vui lòng cung cấp phần mã nơi bạn thực sự ngủ. –

Trả lời

6

Kiểm tra mức tiêu thụ CPU cho từng lõi CPU riêng lẻ. Nếu bạn đang sử dụng một máy tính 4 lõi, có thể một sợi dây đang rogue và ăn lên một lần lõi (25%). Điều này thường xảy ra khi luồng nằm trong vòng lặp chặt chẽ.

Bạn có thể sử dụng Thread.wait với thời gian chờ (thực sự là lớp Timer), nhưng đặt cược của tôi là nó sẽ không tạo ra bất kỳ sự khác biệt nào. Cả hai Thread.sleepThread.wait thay đổi trạng thái của luồng thành not runnable. Mặc dù nó phụ thuộc vào việc thực hiện JVM của bạn, nhưng luồng không nên tiêu tốn nhiều CPU trong tình huống như vậy. Vì vậy, đặt cược của tôi là có một số lỗi trong công việc.

Một điều bạn có thể làm là lấy một chuỗi kết xuất và xem chuỗi đang làm gì khi điều này xảy ra. Sử dụng kill -3 trên hộp Linux hoặc sử dụng ctrl + break trên cửa sổ bảng điều khiển java nếu bạn đang sử dụng Windows. Sau đó, kiểm tra kết xuất chuỗi được đổ vào đầu ra tiêu chuẩn. Sau đó, bạn có thể chắc chắn nếu các sợi đã thực sự ngủ hoặc đã làm cái gì khác.

3

Như nhiều người đã chỉ ra, Thread.sleep nên và thực sự không giúp giảm mức sử dụng CPU đáng kể.
Tôi bỏ qua một số sự kiện nhất định từ câu hỏi ban đầu của mình vì tôi nghĩ rằng chúng không liên quan.
Chủ đề chính là nhà sản xuất, có một chuỗi khác chạy không đồng bộ là người tiêu dùng. Nó chỉ ra rằng "giấc ngủ" trên chủ đề này là bên trong một số điều kiện kỳ ​​lạ mà đã không nhận được kích hoạt đúng cách. Vì vậy, vòng lặp trên sợi chỉ chưa bao giờ ngủ.
Một khi điều ngủ đã được loại bỏ, tôi đã đi trước và phân tích nó chặt chẽ để nhận ra vấn đề.

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