Một số người sẽ nói rằng hai chủ đề là quá nhiều - Tôi không hoàn toàn ở trong trại đó :-)
Đây là lời khuyên của tôi: đo lường, đừng đoán. Một đề xuất là làm cho nó có thể cấu hình được và ban đầu đặt nó thành 100, sau đó phát hành phần mềm của bạn ra ngoài và theo dõi những gì xảy ra.
Nếu mức sử dụng luồng của bạn đạt cực đại ở mức 3, thì 100 là quá nhiều. Nếu nó vẫn ở mức 100 trong hầu hết thời gian trong ngày, hãy nâng nó lên tới 200 và xem điều gì sẽ xảy ra.
Bạn thực sự có thể có mã của mình theo dõi việc sử dụng và điều chỉnh cấu hình cho lần khởi động tiếp theo nhưng điều đó có thể là quá mức cần thiết.
Để làm rõ và xây dựng:
Tôi không ủng hộ việc lăn hệ thống con tổng hợp luồng của riêng bạn, bằng mọi cách sử dụng cái bạn có. Nhưng, vì bạn đã hỏi về một điểm giới hạn tốt cho các luồng, tôi cho rằng việc triển khai nhóm luồng của bạn có khả năng giới hạn số lượng luồng tối đa được tạo (đó là một điều tốt).
Tôi đã viết mã tổng hợp kết nối cơ sở dữ liệu và kết nối cơ sở dữ liệu và chúng có các tính năng sau (mà tôi tin là cần thiết cho hiệu suất):
- một số lượng tối thiểu của các chủ đề hoạt động.
- số lượng chủ đề tối đa.
- tắt các chủ đề đã không được sử dụng trong một thời gian.
Cái đầu tiên đặt đường cơ sở cho hiệu suất tối thiểu về mặt máy khách nhóm luồng (số lượng luồng này luôn có sẵn để sử dụng). Thứ hai đặt ra một hạn chế về việc sử dụng tài nguyên bởi các luồng hoạt động. Thứ ba đưa bạn trở lại đường cơ sở trong thời gian yên tĩnh để giảm thiểu việc sử dụng tài nguyên.
Bạn cần cân bằng việc sử dụng tài nguyên khi có các luồng không sử dụng (A) so với việc sử dụng tài nguyên không có đủ luồng để thực hiện công việc (B).
(A) nói chung là sử dụng bộ nhớ (ngăn xếp, v.v.) vì một luồng không hoạt động sẽ không sử dụng nhiều CPU. (B) nói chung sẽ là một sự chậm trễ trong việc xử lý các yêu cầu khi chúng đến khi bạn cần đợi một chuỗi có sẵn.
Đó là lý do tại sao bạn đo lường. Như bạn nêu, phần lớn các chủ đề của bạn sẽ chờ phản hồi từ cơ sở dữ liệu để chúng không chạy. Có hai yếu tố ảnh hưởng đến số lượng chủ đề bạn nên cho phép.
Đầu tiên là số lượng kết nối DB có sẵn. Đây có thể là một giới hạn cứng trừ khi bạn có thể tăng nó tại DBMS - Tôi sẽ giả định rằng DBMS của bạn có thể có số lượng kết nối không giới hạn trong trường hợp này (mặc dù bạn cũng nên đo lường điều đó).
Sau đó, số lượng chủ đề bạn nên có phụ thuộc vào sử dụng lịch sử của bạn. Mức tối thiểu bạn nên chạy là số lượng tối thiểu bạn từng chạy + A%, với mức tối thiểu tuyệt đối (ví dụ: và làm cho nó có thể định cấu hình giống như A) 5.
Số lượng chủ đề tối đa phải là tối đa lịch sử của bạn + B%.
Bạn cũng nên theo dõi để thay đổi hành vi. Nếu, vì một số lý do, việc sử dụng của bạn đạt 100% khả dụng trong một thời gian đáng kể (để nó ảnh hưởng đến hiệu suất của khách hàng), bạn nên tăng tối đa cho phép cho đến khi cao hơn B% một lần nữa.
Để đáp lại "chính xác những gì tôi nên đo?" câu hỏi:
Những gì bạn nên đo cụ thể là số lượng luồng tối đa được sử dụng đồng thời (ví dụ, chờ đợi khi trả về từ cuộc gọi DB) trong khi tải. Sau đó, thêm hệ số an toàn 10% chẳng hạn (nhấn mạnh, vì các áp phích khác dường như lấy ví dụ của tôi làm đề xuất cố định).
Ngoài ra, điều này nên được thực hiện trong môi trường sản xuất để điều chỉnh. Bạn có thể ước tính trước được nhưng bạn không bao giờ biết sản xuất nào sẽ theo cách của bạn (đó là lý do tại sao tất cả những thứ này nên được cấu hình trong thời gian chạy). Điều này là để nắm bắt một tình huống như nhân đôi các cuộc gọi của khách hàng đến bất ngờ.