Tại công việc của tôi, tôi có một loạt dịch vụ Windows mà tôi chịu trách nhiệm, được viết bằng C# 2003. Mỗi dịch vụ này có bộ hẹn giờ kích hoạt mỗi phút hoặc lâu hơn, nơi phần lớn công việc xảy ra. Vấn đề của tôi là, khi các dịch vụ này chạy, chúng bắt đầu tiêu tốn nhiều thời gian CPU hơn qua mỗi lần lặp, ngay cả khi không có công việc có ý nghĩa cho chúng (tức là chúng chỉ chạy không tải, xem qua cơ sở dữ liệu để làm gì đó). Khi chúng khởi động, mỗi dịch vụ sử dụng mức trung bình (khoảng) 2-3% của 4 CPU, điều này là tốt. Sau 24 giờ, mỗi dịch vụ sẽ tiêu thụ toàn bộ bộ xử lý trong suốt thời gian chạy vòng lặp của nó.Dịch vụ Windows Tăng mức tiêu thụ CPU
Có ai giúp được không? Tôi đang thua lỗ vì những gì có thể gây ra điều này. Giải pháp hiện tại của chúng tôi là khởi động lại các dịch vụ một lần một ngày (họ tự đóng cửa, sau đó một kịch bản thấy rằng họ đang ngoại tuyến và khởi động lại chúng vào khoảng 3 giờ sáng). Nhưng đây không phải là giải pháp lâu dài; mối quan tâm của tôi là khi các dịch vụ trở nên bận rộn, khởi động lại mỗi ngày một lần có thể không đủ ... nhưng khi có hình phạt khởi động đáng kể (tất cả đều sử dụng NHibernate để truy cập dữ liệu), khi chúng bận rộn hơn, chính xác thì chúng tôi don ' t muốn làm là khởi động lại chúng thường xuyên hơn.
@akmad: Đúng, rất khó.
- Có, dịch vụ được chạy riêng sẽ hiển thị cùng một triệu chứng theo thời gian.
- Không, không. Chúng tôi đã xem xét điều đó. Điều này có thể xảy ra lúc 10 giờ sáng hoặc 6 giờ tối hoặc vào giữa đêm. Không có sự nhất quán.
- Chúng tôi làm; và họ là. Các dịch vụ đang làm chính xác những gì họ cần, và không có gì khác. Thật không may, điều đó đòi hỏi sự hiểu biết chính xác khi nào các dịch vụ sắp hết CPU, điều này xảy ra theo một lịch trình khó lường, và không bao giờ nhanh chóng ... điều này khiến cho mọi thứ trở nên khó khăn gấp đôi, bởi vì sếp của tôi sẽ chạy và khởi động lại khi họ bắt đầu gặp sự cố mà không cần suy nghĩ về các sự cố gỡ lỗi.
- Không, họ đang sử dụng một lượng RAM khá nhất quán (khoảng 60-80MB mỗi chiếc, ngoài 4GB trên máy).
Đề xuất tốt, nhưng hãy yên tâm, chúng tôi đã thử tất cả các cách khắc phục sự cố thông thường. Những gì tôi hy vọng là đây là một vấn đề .NET mà ai đó có thể biết, mà chúng ta có thể giải quyết. Giải pháp của sếp của tôi (mà tôi nhấn mạnh không muốn thực hiện) là đặt một trường trong cơ sở dữ liệu chứa nhiều lần để các dịch vụ khởi động lại trong ngày, để anh ta có thể làm cho vấn đề biến mất và không nghĩ về nó . Tôi đang tuyệt vọng tìm kiếm nguyên nhân của vấn đề thực sự để tôi có thể sửa chữa nó, bởi vì giải pháp đó sẽ trở thành thảm họa trong khoảng sáu tháng.
@Yaakov Ellis: Mỗi loại đều có chức năng khác nhau. Một lần đọc các bản ghi ra khỏi một cơ sở dữ liệu Oracle ở một nơi nào đó bên ngoài; một quy trình khác xử lý các bản ghi đó và chuyển các tệp thuộc về các bản ghi đó sang hệ thống của chúng tôi; một phần ba kiểm tra các tệp đó để đảm bảo chúng là những gì chúng tôi mong đợi; khác là một dịch vụ bảo trì liên tục kiểm tra những thứ như không gian đĩa (mà chúng tôi có đủ) và thăm dò các máy chủ khác để đảm bảo chúng còn sống; một cái chỉ chạy để đảm bảo tất cả những cái khác đang chạy và thực hiện công việc, theo dõi và báo cáo lỗi, và khởi động lại bất cứ thứ gì không thể giữ cho toàn bộ hệ thống hoạt động 24 giờ một ngày.Vì vậy, nếu bạn đang hỏi những gì tôi nghĩ rằng bạn đang yêu cầu, không có, không có một điều phổ biến mà tất cả các dịch vụ này làm (khác với truy cập cơ sở dữ liệu thông qua NHibernate) mà tôi có thể trỏ đến như là một vấn đề tiềm năng . Thật không may, nếu điều đó hóa ra lại là vấn đề thực sự (điều đó sẽ không làm tôi ngạc nhiên), toàn bộ điều có thể bị vặn - và tôi sẽ kết thúc viết lại tất cả chúng trong SQL đơn giản. Tôi hy vọng đó là một vấn đề thu gom rác hoặc một cái gì đó dễ dàng hơn để đối phó với NHibernate.
@Joshdan: Không bí mật. Như tôi đã nói, chúng tôi đã thử tất cả các cách khắc phục sự cố thông thường. Profiling là vô ích: profiler chúng tôi sử dụng không thể trỏ đến bất kỳ mã nào thực sự thực thi khi mức sử dụng CPU cao. Các dịch vụ này đã bị xé toạc khoảng một tháng trước đây để tìm kiếm vấn đề này. Mỗi phần mã được phân tích để cố gắng tìm hiểu xem mã của chúng tôi có phải là vấn đề hay không; Tôi không ở đây vì tôi không làm bài tập ở nhà. Đây có phải là một trường hợp đơn giản của các dịch vụ thực hiện nhiều công việc hơn dự đoán, đó là điều gì đó đã bị bắt.
Vấn đề ở đây là, hầu hết thời gian, dịch vụ không làm gì cả, nhưng vẫn quản lý tiêu thụ 25% hoặc nhiều hơn bốn nhân CPU: họ không tìm được việc gì và thoát khỏi lặp lại và đợi cho lần lặp tiếp theo. Điều này nên, theo nghĩa đen, hầu như không có thời gian CPU nào cả.
Dưới đây là ví dụ về hành vi mà chúng ta đang thấy, trên một dịch vụ không có việc phải làm trong hai ngày (trong môi trường không thay đổi). Ảnh này đã được chụp tuần trước:
Ngày 1, 8AM: Trung bình Mức sử dụng CPU xấp xỉ 3%
Ngày 1, 6 giờ chiều: Trung bình Mức sử dụng CPU xấp xỉ 8%
Ngày 2, 7 SA: Trung bình. Mức sử dụng CPU xấp xỉ 20%
Ngày 2, 11AM: Trung bình Việc sử dụng CPU xấp xỉ 30%
Sau khi xem xét tất cả những lý do có thể xảy ra, tôi đã hỏi câu hỏi này tại đây. Tôi đã tìm ra câu trả lời sáng tạo hơn (như Ubiguchi)), hoặc con trỏ đến những điều tôi không phải là suy nghĩ (như đề xuất của Ian).
Vì vậy, hiện các cành CPU xảy ra ngay trước khi gọi lại timer , trong giờ gọi lại, hoặc ngay sau khi hẹn giờ gọi lại?
Bạn hiểu lầm. Đây không phải là một cành. Nếu có, sẽ không có vấn đề gì; Tôi có thể đối phó với gai. Nhưng nó không ... việc sử dụng CPU đang đi lên nói chung. Ngay cả khi dịch vụ không làm gì cả, hãy đợi đến lần hẹn giờ tiếp theo. Khi dịch vụ khởi động, mọi thứ đều tốt đẹp và bình tĩnh, và đồ thị trông giống như những gì bạn mong đợi ... nói chung, 0% mức sử dụng, với mức tăng 10% khi NHibernate truy cập cơ sở dữ liệu hoặc dịch vụ có một số lượng công việc nhỏ . Nhưng điều này tăng lên 25% trên toàn diện (nhiều hơn nếu tôi để nó đi quá xa) việc sử dụng mọi lúc trong khi quá trình đang chạy.
Điều đó làm cho Ian đề xuất viên đạn bạc hợp lý (NHibernate không rất nhiều nội dung khi bạn không tìm kiếm). Than ôi, tôi đã thực hiện giải pháp của mình, nhưng nó không có hiệu lực (tôi không có bằng chứng về điều này, nhưng tôi thực sự nghĩ rằng nó làm mọi thứ tồi tệ hơn ... sử dụng trung bình là dường như để tăng nhanh hơn bây giờ).Lưu ý rằng việc loại bỏ phần "NHibernate" NHibernate (như bạn đề nghị) là không khả thi, vì điều đó sẽ loại bỏ khoảng 90% mã trong dịch vụ, điều này sẽ cho phép tôi loại bỏ bộ hẹn giờ như một vấn đề (mà tôi hoàn toàn có ý định thử), nhưng không thể giúp tôi loại trừ NHibernate là vấn đề, bởi vì nếu NHibernate đang gây ra điều này, sau đó sửa chữa dodgy đó là thực hiện (xem bên dưới) chỉ là sẽ phải trở thành The Way The System Works; chúng tôi rất phụ thuộc vào NHibernate cho dự án này rằng PM chỉ đơn giản là sẽ không chấp nhận rằng nó gây ra một vấn đề cấu trúc không thể giải quyết.
Tôi chỉ lưu ý một cảm giác tuyệt vọng trong câu hỏi - đó là vấn đề của mình sẽ tiếp tục chặn một phép lạ nhỏ
Đừng có nghĩa là cho nó để đi tắt như vậy. Hiện tại, các dịch vụ đang được khởi động lại hàng ngày (với tùy chọn nhập bất kỳ số giờ nào trong ngày để tắt máy và khởi động lại), sẽ khắc phục sự cố nhưng không thể là giải pháp lâu dài khi chúng đi vào máy sản xuất và bắt đầu trở nên bận rộn. Các vấn đề sẽ không tiếp tục, cho dù tôi sửa chúng hay PM vẫn duy trì ràng buộc này đối với chúng. Rõ ràng, tôi muốn thực hiện một sửa chữa thực sự, nhưng kể từ khi thử nghiệm ban đầu cho thấy không có lý do cho điều này, và các dịch vụ đã được xem xét rộng rãi, các PM sẽ chỉ có họ khởi động lại nhiều lần hơn dành nhiều thời gian cố gắng sửa chữa chúng . Đó là hoàn toàn ngoài tầm kiểm soát của tôi và làm cho phép màu bạn đang nói về quan trọng hơn nó sẽ khác.
Điều đó cực kỳ hấp dẫn (trong phạm vi số khi bạn tin tưởng tiểu sử của mình).
Tôi không. Nhưng sau đó, đây là những dịch vụ Windows được viết bằng .NET 1.1 chạy trên một máy Windows 2000, được triển khai bởi một kịch bản Nant tồi tệ, sử dụng một phiên bản cũ của NHibernate để truy cập cơ sở dữ liệu. Có rất ít trên máy đó tôi thực sự sẽ nói rằng tôi tin tưởng.
Có thể cho bộ hẹn giờ dịch vụ của bạn hoạt động nhiều hơn mức cần thiết không? Nói, bộ đếm thời gian được kích hoạt và vòng lặp chưa được thực hiện, và 2 minuets đã qua. Bộ hẹn giờ có được kích hoạt lại không? Rất nhiều thứ có thể sai nhưng tất cả đều liên quan đến mã của bạn. Đây không phải là hành vi bình thường của dịch vụ. – Jaywalker
Bạn có bất kỳ mã nào phát hiện xem dịch vụ có còn "hoạt động" trong chu kỳ làm việc trước đó không? – hova