Tốc độ mà máy chủ của tôi có thể chấp nhận () các kết nối TCP mới đến thực sự rất tệ trong Xen. Thử nghiệm tương tự trên phần cứng kim loại trần cho thấy tốc độ tăng gấp 3-5 lần.
- Làm thế nào điều này là rất xấu theo Xen?
- Bạn có thể điều chỉnh Xen để cải thiện hiệu suất cho các kết nối TCP mới không?
- Có nền tảng ảo hóa nào khác phù hợp hơn cho loại trường hợp sử dụng này không?
Lý lịch
Gần đây tôi đã nghiên cứu một số điểm nghẽn về hiệu năng của một máy chủ Java được phát triển nội bộ chạy dưới Xen. Máy chủ nói HTTP và trả lời các cuộc gọi kết nối / yêu cầu / phản hồi / ngắt kết nối TCP đơn giản.
Nhưng ngay cả khi gửi lưu lượng thuyền đến máy chủ, nó không thể chấp nhận hơn ~ 7000 kết nối TCP mỗi giây (trên phiên bản EC2 8 lõi, c1.xlarge chạy Xen). Trong quá trình thử nghiệm, máy chủ cũng thể hiện một hành vi kỳ lạ trong đó một lõi (không nhất thiết là cpu 0) được tải rất nhiều> 80%, trong khi các lõi khác gần như không hoạt động. Điều này dẫn đến tôi nghĩ rằng vấn đề có liên quan đến kernel / ảo hóa cơ bản.
Khi thử nghiệm kịch bản tương tự trên nền tảng kim loại trần, không ảo hóa, tôi nhận được kết quả thử nghiệm cho thấy tốc độ chấp nhận TCP () vượt quá 35 000 / giây. Điều này trên máy Core i5 4 lõi chạy Ubuntu với tất cả các lõi gần như đã bão hòa hoàn toàn. Đối với tôi loại hình đó có vẻ đúng.
Trên phiên bản Xen một lần nữa, tôi đã thử bật / chỉnh gần như mọi cài đặt có trong sysctl.conf. Bao gồm cho phép nhận Chỉ đạo gói và Nhận chỉ đạo luồng và ghim các luồng / quy trình vào CPU nhưng không có mức tăng rõ ràng.
Tôi biết hiệu suất xuống cấp sẽ được dự kiến khi chạy ảo hóa. Nhưng đến mức độ này? Một máy chủ chậm, kim loại trần vượt trội hơn đức. 8 lõi theo hệ số 5?
- Đây có phải là hành vi thực sự mong đợi của Xen?
- Bạn có thể điều chỉnh Xen để cải thiện hiệu suất cho các kết nối TCP mới không?
- Có nền tảng ảo hóa nào khác phù hợp hơn cho loại trường hợp sử dụng này không?
Tái tạo hành vi này
Khi tiếp tục điều tra vấn đề này và xác định chính xác vấn đề, tôi phát hiện ra rằng công cụ kiểm tra hiệu năng netperf có thể mô phỏng kịch bản tương tự mà tôi đang gặp phải. Sử dụng thử nghiệm TCP_CRR của netperf, tôi đã thu thập các báo cáo khác nhau từ các máy chủ khác nhau (cả ảo hóa và không đạo đức.). Nếu bạn muốn đóng góp với một số phát hiện hoặc tra cứu các báo cáo hiện tại của tôi, vui lòng xem https://gist.github.com/985475
Làm thế nào để tôi biết vấn đề này không phải do phần mềm được viết kém?
- Máy chủ đã được thử nghiệm trên phần cứng kim loại trần và nó gần như bão hòa tất cả các lõi có sẵn cho nó.
- Khi sử dụng các kết nối TCP duy trì, vấn đề sẽ biến mất.
Tại sao nó lại quan trọng?
Tại ESN (chủ nhân của tôi), tôi là trưởng dự án của Beaconpush , một máy chủ Comet / Web Socket được viết bằng Java. Mặc dù nó rất hiệu quả và có thể bão hòa hầu hết mọi băng thông được cung cấp cho nó trong điều kiện tối ưu, nó vẫn bị giới hạn về tốc độ kết nối TCP mới có thể được thực hiện. Đó là, nếu bạn có một người dùng lớn, nơi người dùng đến và đi rất thường xuyên, nhiều kết nối TCP sẽ phải được thiết lập / phá bỏ. Chúng tôi cố gắng giảm thiểu việc giữ cho các kết nối này tồn tại càng lâu càng tốt. Nhưng cuối cùng, hiệu năng accept () là thứ giữ cho lõi của chúng ta không bị quay và chúng ta không thích điều đó.
Cập nhật 1
Ai đó đã đăng câu hỏi này lên Hacker News , cũng có một số câu hỏi / câu trả lời. Nhưng tôi sẽ cố gắng cập nhật câu hỏi này với thông tin tôi tìm thấy khi đi cùng.
Phần cứng / nền tảng tôi đã thử nghiệm điều này trên:
- EC2 với các thể hiện c1.xlarge (8 lõi, RAM 7 GB) và cc1.4xlarge (gấp 2 lần Intel Xeon X5570, RAM 23 GB). Các AMI được sử dụng lần lượt là ami-08f40561 và ami-1cad5275. Ai đó cũng chỉ ra rằng "Nhóm bảo mật" (tức là tường lửa EC2) cũng có thể ảnh hưởng. Nhưng đối với kịch bản thử nghiệm này, tôi chỉ thử trên localhost để loại bỏ các yếu tố bên ngoài như thế này. Một tin đồn khác mà tôi đã nghe là các phiên bản EC2 không thể đẩy hơn 100 nghìn PPS.
- Hai máy chủ ảo hóa chạy Xen. Một người có tải trọng bằng 0 trước khi thử nghiệm nhưng không tạo ra sự khác biệt.
- Riêng máy chủ, Xen-server tại Rackspace. Về kết quả tương tự đấy.
Tôi đang trong quá trình chạy lại các thử nghiệm này và điền vào các báo cáo tại https://gist.github.com/985475 Nếu bạn muốn giúp đỡ, hãy đóng góp số của bạn. Dễ thôi!
(Kế hoạch hành động đã được chuyển sang một câu trả lời tổng hợp, riêng biệt)