Yêu cầu tập trung vào một số tiến trình
Hiện tượng
Đôi khi chúng ta sử dụng lệnh php start.php status để xem, yêu cầu được tập trung xử lý trong một số tiến trình cụ thể, trong khi các tiến trình khác hoàn toàn không bận.
Cơ chế chiếm đoạt
Cách mà workerman nhiều tiến trình lấy kết nối mặc định là chiếm đoạt, tức là khi có kết nối từ phía khách hàng, tất cả các tiến trình rảnh rỗi đều có cơ hội để lấy kết nối này, người nhanh hơn thì được. Ai nhanh hơn, là do việc điều phối của hệ điều hành quyết định. Hệ điều hành có thể ưu tiên chọn tiến trình được sử dụng gần đây nhất để lấy quyền sử dụng CPU, bởi vì trong thanh ghi CPU có thể vẫn còn thông tin ngữ cảnh của tiến trình trước đó, điều này có thể giảm thiểu chi phí chuyển đổi ngữ cảnh. Vì vậy, khi công việc đủ nhanh hoặc trong quá trình kiểm tra tải, dễ xảy ra tình trạng kết nối tập trung được xử lý bởi một số tiến trình, vì chính sách này có thể tránh việc chuyển đổi tiến trình thường xuyên, hiệu suất thường là tối ưu và không phải là vấn đề.
Cơ chế quay vòng
Workerman có thể thay đổi cách lấy kết nối thành quay vòng bằng cách thiết lập $worker->reusePort = true;, trong phương thức quay vòng, nhân sẽ phân phối kết nối một cách gần như đồng đều cho tất cả các tiến trình, do đó tất cả các tiến trình sẽ cùng xử lý yêu cầu.
Hiểu lầm
Nhiều nhà phát triển cho rằng việc tất cả các tiến trình tham gia xử lý yêu cầu sẽ mang lại hiệu suất tốt hơn, nhưng thực tế thì không nhất thiết. Khi công việc đủ đơn giản, số lượng tiến trình tham gia xử lý yêu cầu càng gần với số lõi CPU thì thông lượng của máy chủ càng cao. Ví dụ, trên máy chủ 4 lõi, khi số lượng tiến trình được thiết lập là 4, QPS kiểm tra tải cho helloworld thường là cao nhất. Nếu số lượng tiến trình tham gia xử lý vượt quá nhiều so với số lõi CPU, chi phí ngữ cảnh của tiến trình càng lớn, hiệu suất có thể sẽ giảm đi. Và đối với các công việc thường có cơ sở dữ liệu, việc thiết lập số lượng tiến trình từ 3 đến 6 lần số lõi CPU có thể mang lại hiệu suất tốt hơn.