Số lượng tối ưu của mỗi quá trình kỳ lân CPU


16

Chúng tôi đang chạy ứng dụng web Ruby on Rails dưới Unicorn. Ứng dụng của chúng tôi không bị ràng buộc CPU (chúng tôi có hệ thống Xeon E5645 kép với 12 lõi và giá trị trung bình tải tối đa là khoảng 6). Chúng tôi bắt đầu với 40 công nhân Unicorn ban đầu nhưng dấu chân bộ nhớ ứng dụng tăng theo thời gian. Vì vậy, bây giờ chúng ta phải giảm số lượng quy trình công nhân. Tôi nghĩ rằng công thức (số lõi CPU + 1) tiêu chuẩn cũng áp dụng cho Unicorn nhưng đồng nghiệp của tôi đã cố gắng thuyết phục tôi rằng chúng ta nên dự trữ nhiều phiên bản Unicorn hơn cho mỗi CPU và cung cấp liên kết này . Tuy nhiên, tôi không chắc chắn chính xác tại sao chúng ta cần phải dành quá nhiều bộ nhớ cho các quá trình Unicorn nhàn rỗi.

Câu hỏi của tôi là: lý do để có nhiều hơn một phiên bản Unicorn trên mỗi lõi CPU là gì? Có phải do một số đặc thù kiến ​​trúc của Unicorn? Tôi biết rằng các quy trình Unicorn bận rộn không thể chấp nhận các kết nối mới (chúng tôi đang sử dụng các ổ cắm tên miền UNIX để liên lạc với các phiên bản Unicorn BTW) nhưng tôi nghĩ rằng tồn đọng đã được giới thiệu chính xác để giải quyết vấn đề này. Có thể khắc phục 2 đến 8 trường hợp Unicorn này cho mỗi quy tắc CPU không?

Câu trả lời:


17

Được rồi, tôi đã tìm thấy câu trả lời cuối cùng. Số lượng công nhân Unicorn tối ưu không được kết nối trực tiếp với số lượng lõi CPU, nó phụ thuộc vào tải và cấu trúc ứng dụng / phản ứng nội bộ của bạn. Về cơ bản, chúng tôi sử dụng trình tạo mẫu để xác định trạng thái của công nhân, chúng tôi cố gắng giữ cho công nhân không hoạt động 70% và 30% làm công việc thực tế. Vì vậy, 70% số mẫu phải là "chờ cuộc gọi select () để nhận yêu cầu từ máy chủ lối vào". Nghiên cứu của chúng tôi đã chỉ ra rằng chỉ có 3 trạng thái công nhân hiệu quả: 0-30% mẫu không hoạt động, 30-50% mẫu không hoạt động và 50-70% mẫu không hoạt động (vâng, chúng tôi có thể lấy thêm mẫu nhàn rỗi nhưng ở đó không có điểm thực trong đó vì khả năng đáp ứng của ứng dụng không thay đổi đáng kể). Chúng tôi coi tình hình 0-30% là "vùng đỏ" và 30-50% là "vùng vàng".


1
Bạn có thể giải thích làm thế nào bạn đang lấy mẫu trạng thái của những công nhân này?
dps

6

Bạn nói đúng về N + 1 cho các công việc liên quan đến CPU.

Mặt khác, kỳ lân không sử dụng chủ đề, vì vậy mỗi IO op. chặn quy trình và một quy trình khác có thể khởi động và phân tích các tiêu đề HTTP, nối chuỗi và thực hiện mọi tác vụ cần nhiều CPU mà nó cần để phục vụ người dùng (thực hiện sớm hơn để giảm độ trễ yêu cầu).

Và bạn có thể muốn có nhiều chủ đề / quy trình hơn lõi. Hãy tưởng tượng tình huống sau đây: req. A mất mười lần nữa sau đó req. B, bạn có một số yêu cầu A đồng thời và yêu cầu B nhanh chóng chỉ cần chờ đợi để A-req hoàn thành. Vì vậy, nếu bạn có thể dự đoán số lượng yêu cầu nặng, bạn có thể sử dụng số này làm hướng dẫn khác để điều chỉnh hệ thống.


1
Điểm hay, giả sử các yêu cầu được phân phối ít nhiều bằng nhau và khá nhẹ (thực tế chúng tôi có yêu cầu nặng nhưng chúng được xử lý bởi một nhóm Kỳ lân khác). Nếu tất cả các yêu cầu đột nhiên trở nên nặng nề (ví dụ trong trường hợp chết đói I / O trên nút DB), chúng tôi sẽ ngừng hoạt động bất kể số lượng phiên bản CPU tôi đoán. Chà, có lẽ cách tốt nhất để biết sự thật là thực hiện một số loại thử tải.
Alex

Đúng, kiểm tra sẽ cho bạn biết. Hoặc, nếu bạn đã bắt đầu, bạn có thể grep log và tra cứu số lượng yêu cầu đồng thời tối đa. Tôi khá chắc chắn rằng bạn đăng nhập cả thời gian yêu cầu và thời gian phản hồi phụ trợ. Nginx sẽ là bạn của bạn nếu bạn không. :)
tối
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.